在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。

限制:

2 <= n <= 100000

解1:数组排序,循环判断相邻值是否相同

 static int FindRepeatNumber3(int[] nums)
        {
            var arr=nums.OrderBy(x => x).ToArray();
            for (int i = 0; i < arr.Length; i++)
            {
                if (arr[i]==arr[i+1])
                {
                    return arr[i];
                }
            }
            return 0;
        }

解2:创建一个集合/哈希表来存储数字,同样利用循环,第一次出现就会添加进集合/哈希表,但是第二次出现就会抛出

ps:哈希表添加数据的时候比集合快,emm,自己也是查了一下才知道,还要多学习啊   也不知道为啥,自己实际跑代码发现list集合比哈希表还快

        static int FindRepeatNumber2(int[] nums)
        {
            //哈希表
            HashSet<int> arr = new HashSet<int>();
            //集合
            //List<int> list = new List<int>();
            for (int i = 0; i < nums.Length; i++)
            {
                if (arr.Contains(nums[i]))
                {
                    return nums[i];
                }
                else
                {
                    arr.Add(nums[i]);   
                }
            }
            return 0;
        }

解3:数据字典。操作类似哈希表,但是速度较慢,就不贴代码了。

这里我用的是StopWatch来测试的代码运行时间.最优选择是

List集合>HashSet>OrderBy>Dictionary<>

List:0-2毫秒

HashSet:3-7毫秒

OrderBy:33-48毫秒

Dictionary:1000+

 

posted on 2022-06-10 18:29  尝尝手指  阅读(31)  评论(0编辑  收藏  举报