首页 > 代码库 > 重复数字
重复数字
一个元素个数为m的数组,保存了[0,n)之间的数字。已知m≥n,那么数组中必然有重复的数字。求出之中的重复数字。
遍历数组:
对arr[i],可知它正确的位置应该在arr[i]上。
如果arr[i] == i,表明该值已经处于正确的位置,++i。
如果arr[i] != i,如果arr[arr[i]]与arr[i]相同,表明arr[i]是多余的值,打印该值,++i;否则,交换二者,再次检查该位置。
1 // 令m = arr.size(), 且m >= n. 2 // arr中保存着[0, n)的数字, 由于m >= n, 之中必然有重复的. 3 // 输出他们. 4 void PrintDuplicateNumbers(vector<int>& arr, int n) { 5 for (int i = 0; i < arr.size(); ++i) { 6 int current = arr[i]; 7 if(current == i) 8 continue; 9 10 // 希望交换的位置上的值与自身相同, 表明自身是多余值.11 if (arr[current] == current) {12 cout << arr[current] << " ";13 continue;14 }15 16 swap(arr[current], arr[i]);17 18 // [0, i)之间的值, 或者处于正确的位置, 或者它正确的位置被其他相同的值占领.19 // 如果current < i, 表明是向前的一次交换, 且交换的一定是上述第二种情况的20 // 值. 而该值已经是多余的, 因此无需再继续检查该位置.21 if (current > i)22 --i;23 }24 }
重复数字
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。