Day~1:序列找数

123 阅读1分钟

描述

从非负整数序列 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);
    }

但这种情况下时间和内存消耗并没有得到改善