• 两个有序数组长度分别为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

  • 相关阅读:
    POJ1486 Sorting Slides 二分图or贪心
    POJ2060 Taxi Cab Scheme 最小路径覆盖
    POJ3083 Children of the Candy Corn 解题报告
    以前的文章
    POJ2449 Remmarguts' Date K短路经典题
    这一年的acm路
    POJ3014 Asteroids 最小点覆盖
    POJ2594 Treasure Exploration 最小路径覆盖
    POJ3009 Curling 2.0 解题报告
    POJ2226 Muddy Fields 最小点集覆盖
  • 原文地址:https://www.cnblogs.com/xuezhizhang/p/3557149.html
Copyright © 2020-2023  润新知