重复数字

一个元素个数为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 }
时间: 2024-08-17 11:39:02

重复数字的相关文章

js选择颜色小游戏(随机生成不含重复数字的数组,通过数组中的数控制定义好的数组)

<!DOCTYPE html><html> <head> <meta charset="utf-8"> <title>js网页版小游戏</title> <style media="screen"> .wrap { width: 577px; outline: 1px solid hotpink; margin: 100px auto; box-shadow: 0 0 5px; } .

[JLOI2011]不重复数字

2761: [JLOI2011]不重复数字 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2459  Solved: 939[Submit][Status][Discuss] Description 给出N个数,要求把其中重复的去掉,只保留第一次出现的数. 例如,给出的数为1 2 18 3 3 19 2 3 6 5 4,其中2和3有重复,去除后的结果为1 2 18 3 19 6 5 4. Input 输入第一行为正整数T,表示有T组数据. 接下来

LeetCode 26 Remove Duplicates from Sorted Array (移除有序数组中重复数字)

题目链接: https://leetcode.com/problems/remove-duplicates-from-sorted-array/?tab=Description 从有序数组中移除重复数字,并且返回不重复数字的个数 遍历操作: 可以使用新的for循环 for (int n : nums){} 每次进行对比,并且更新第一个遇到不相等的元素的下标为i 对数组进行重新赋值操作 当数组长度大于1时,ans初值为1,当数组长度为0时,返回0 参考代码 : package leetcode_5

删除数组中的重复数字

#include <stdio.h> main() {  int i,j,t; int a[10]; printf("请输入10个数:\n"); for(i=0;i<10;i++)             scanf("%d",&a[i]); printf("输入的10个数是:"); for(i=0;i<10;i++) {printf("%d  ",a[i]); printf("\n&

删除顺序数组的重复数字

描述:给定一个排序数组,在原数组中删除重复出现的数字,使得每个元素只出现一次,并且返回新的数组的长度. 不要使用额外的数组空间,必须在原地没有额外空间的条件下完成. 样例 给出数组A =[1,1,2],你的函数应该返回长度2,此时A=[1,2]. 思路: 第一次是错的,后来编译通过了,这道题我的想法是:第一,因为题上要求不能新增数组空间,所以我们考虑在原数组的覆盖,也就是把重复数字覆盖前面的一个数字,后面的依次往前覆盖,在编程里,是不存在删除一说的,只是数据的覆盖.覆盖前面的以后,最后的就可以通

2761: [JLOI2011]不重复数字

2761: [JLOI2011]不重复数字 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1770  Solved: 675[Submit][Status] Description 给出N个数,要求把其中重复的去掉,只保留第一次出现的数. 例如,给出的数为1 2 18 3 3 19 2 3 6 5 4,其中2和3有重复,去除后的结果为1 2 18 3 19 6 5 4. Input 输入第一行为正整数T,表示有T组数据. 接下来每组数据包括两行,

有1、2、3、4四个数字,能组成多少个互不相同且一个数字中无重复数字的三位数?并把他们都输出。

/** * 有1.2.3.4四个数字,能组成多少个互不相同且一个数字中无重复数字的三位数?并把他们都输出. * */ public class Test1 { public static void main(String[] args) { int num = 0, c = 0; for (int i = 1; i <= 4; i++) { for (int j = 1; j <= 4; j++) { for (int k = 1; k <= 4; k++) { if (i != j &

Java循环练习: 有1、2、3、4四个数字,能组成多少个无重复数字的三位数?都是多少?

package practiceGO; /**         有1.2.3.4四个数字,能组成多少个无重复数字的三位数?都是多少?  */ public class Cto { public static void main(String[] args) { int count = 0; for(int i=1; i<=4; i++){ for(int j=1; j<=4; j++){ for(int k=1; k<=4; k++){ if (i!=j && i!=k 

【python 思路】题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?

# encoding:utf-8 # p001_1234threeNums.py def threeNums(): '''题目:有1.2.3.4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?''' print None count = 0 nums = [] for index1 in xrange(1,5): for index2 in xrange(1,5): for index3 in xrange(1,5): if index1 != index2 and index1 !

去掉有序数组中重复数字 原地 leetcode java (最简单的方法)

1.利用荷兰国旗的思路,每次记住最后一个位置,遇到一个不重复的数,放在它后面,代码很简单. Given a sorted array, remove the duplicates in place such that each element appear only once and return the new length. Do not allocate extra space for another array, you must do this in place with consta