• 两个有序数组长度分别为m,n,最多m+n次查找找出相同的数


    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Text.RegularExpressions;
    
    namespace ConsoleApplication1
    {
        class CompareArr
        {
            static void Main(string[] args)
            {
                try
                {
                    int[] srcArr1 = new int[] { 2, 5, 6, 8, 10, 17, 29, 33, 43 };//假设数组长度为m
                    int[] srcArr2 = new int[] { 1, 3, 4, 7, 8, 13, 19, 20, 29, 39, 43 };//假设数组长度为n
    
                    int[] resultArr = GetSameItem(srcArr1, srcArr2);//方法1 面试官要的答案,所谓的最多m+n次查找
                    //int[] resultArr = srcArr1.Where(t => srcArr2.Contains(t)).ToArray();//方法2:直接使用LINQ
                    //int[] resultArr = GetSameItemByContains(srcArr1, srcArr2);//方法3 使用遍历加Contains方法
                    //其他方法:折半查找
    
                    if (resultArr.Length > 0)
                    {
                        //Console.WriteLine(string.Format("srcArr1 {0}
    srcArr2 {1}
    相同数字如下:", string.Join(",", srcArr1), string.Join(",", srcArr2)));
                        Console.WriteLine("srcArr1 srcArr2 相同数字如下:");
                        foreach (int item in resultArr)
                        {
                            Console.WriteLine(item.ToString());
                        }
                    }
                    else
                    {
                        Console.WriteLine("无相同数字");
                    }
                    Console.Read();
    
                }
                catch (Exception ex)
                {
                    //记录异常
                }
            }
    
            /// <summary>
            /// 查找两个有序数组中的相同数
            /// 面试官要的答案,所谓的最多m+n次查找
            /// </summary>
            /// <param name="srcArr1">有序数组1</param>
            /// <param name="srcArr2">有序数组2</param>
            /// <returns>数组,找到的相同数</returns>
            static protected int[] GetSameItem(int[] srcArr1, int[] srcArr2)
            {
                List<int> resultArr = new List<int>();
                int temIndex = 0;
    
                for (int i = 0; i < srcArr1.Length; i++)
                {
                    for (int j = temIndex; j < srcArr2.Length; j++)
                    {
                        if (srcArr1[i] > srcArr2[j])
                        {
                            continue;
                        }
                        else if (srcArr1[i] < srcArr2[j])
                        {
                            temIndex = j;
                            break;
                        }
                        else
                        {
                            temIndex = j + 1;
                            resultArr.Add(srcArr1[i]);
                        }
                    }
                }
    
                return resultArr.ToArray();
            }
    
            /// <summary>
            /// 查找两个有序数组中的相同数
            /// 使用遍历加Contains方法
            /// </summary>
            /// <param name="srcArr1">有序数组1</param>
            /// <param name="srcArr2">有序数组2</param>
            /// <returns>数组,找到的相同数</returns>
            static protected int[] GetSameItemByContains(int[] srcArr1, int[] srcArr2)
            {
                List<int> resultArr = new List<int>();
                for (int i = 0; i < srcArr1.Length; i++)
                {
                    if (srcArr2.Contains<int>(srcArr1[i]))
                    {
                        resultArr.Add(srcArr1[i]);
                    }
                }
                return resultArr.ToArray();
            }
        }
    }
    

    其他人的分析总结:http://blog.csdn.net/insistgogo/article/details/9228015

    http://hi.baidu.com/algorithms/item/186115ec71d696abc00d757a

  • 相关阅读:
    网络请求Request
    HTML元素
    你所不知的 CSS ::before 和 ::after 伪元素用法
    DOM理解
    为什么你应该尝试全栈
    程序员菜鸟的常用网站
    前端零基础学习提纲
    JavaScript,调用函数的5种方法
    json数据转化及应用
    浅谈ajax中的GET和POST
  • 原文地址:https://www.cnblogs.com/xuezhizhang/p/3557149.html
Copyright © 2020-2023  润新知