在一个长度为 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+