看题目很容易想到以下代码
public class Main {
public static void main(final String[] args) {
Scanner sc = new Scanner(System.in);
int n=sc.nextInt();
List<Integer>list=new ArrayList<>();
for(int i=0;i<n;i++) {
Integer num=sc.nextInt();
while(list.contains(num)) {
num++;
}
list.add(num);
}
System.out.println(list);
sc.close();
}
}
但是这样只能处理较少情况,遇到特殊数肯定会超时。下面的这种处理方法优化了不少,不是每次+1了,而是直接加相同数字出现过的次数,比如有3个1,第二个1就是+1,第三个直接+2,而不是两次+1,而且每次都记录每次的新值出现的次数,这样循环到新数未出现过为止。
public class Main {
static int[] a1 = new int[1000010], a2 = new int[1000010];//一个用于输出,一个用于储存节点
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
for (int i = 0; i < a; i++) {
int count = sc.nextInt();
for (;;) //循环遍历
{
if (a2[count] == 0) { //确定输入的值是否已经存在
a2[count]++;//若不存在则标记推出循环
break;
}else {
a2[count]++;//若存在则为该标识访问次数加一减少循环次数
count +=a2[count] - 1;
}
}
a1[i] = count;
}
for (int i = 0; i < a; i++) {
System.out.print(a1[i] + " ");
}
}
}