描述
从非负整数序列 0, 1, 2, ..., n中给出包含其中n个数的子序列,请找出未出现在该子序列中的那个数。
输入描述:
输入为n+1个非负整数,用空格分开。
其中:首个数字为非负整数序列的最大值n,后面n个数字为子序列中包含的数字。
输出描述:
输出为1个数字,即未出现在子序列中的那个数。
示例1
输入:
3 3 0 1
输出:
2
算法思路
由于比较的是0...n的数,所以我们可以将序列中出现的数作为下标,将该下标处元素值设置为1(默认为0),表示该下标的数出现过,最后从数组中找值为0的下标输出即为要找的数。
代码实现
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int[] nums = new int[n+1];
for (int i = 0; i < n; i++) {
int num = in.nextInt();
nums[num] = 1;
}
for (int i = 0; i <= n; i++) {
if (nums[i] == 0) {
System.out.println(i);
}
}
}
如果不考虑输入序列的数出现重复的情况,可以用0...n的总和减去输入序列的和,剩下的数即为要找的数。
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int sum = 0;
while (in.hasNext()) {
sum += in.nextInt();
}
System.out.println(n*(n+1)/2 - sum);
}
但这种情况下时间和内存消耗并没有得到改善