首页 > 其他 > 详细

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

时间:2014-02-20 19:39:23      阅读:386      评论:0      收藏:0      [点我收藏+]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
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}\nsrcArr2 {1}\n相同数字如下:", 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

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

原文:http://www.cnblogs.com/xuezhizhang/p/3557149.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!