找出不在预定数组中的自然数

有这么一个有趣的问题,问:
有这么一个不重复的自然数数组,自然数长度为N,而数组长度为N-2,依次随机把自然数放进数组中,请找出2个没有被放进去的自然数。
例如:这个自然数数组是[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]这十个数,某次随机放入的顺序是[2, 1, 3, 5, 7, 9, 0, 4],那么6和8这两个数没有被放入进来。
有两个思路可以解决这个问题

桶排序解决

桶排序的思路是:假设键值的范围是从0到N-1,我们需要标记为0,1,2…N-1的桶。如果元素的键值是i,那么就将该元素放入桶i中。每个桶中的都存在和键值具有相同值的元素。
这道题目有10个自然数需要10个桶,遍历这个数组,数组值为桶的下标,并且将值加1。最后查看桶号,哪号桶为空(值为0)则为没有放进的自然数。

public class Ziranshu {

    public static void main(String[] args) {
        int[] a = {2, 1, 3, 5, 7, 9, 0, 4};
        int[] tong = new int[10];

        for(int i = 0; i < a.length; i++) {
            tong[a[i]] = 1;
        }

        for(int i = 0; i < tong.length; i++) {
            if(tong[i] == 0) {
                System.out.println(i);
            }
        }
    }

}

利用Set不重复属性解决

Set具有无序不重复的属性,当然如果你想排下序,可以用TreeSet。思路就是把8个元素一次放进set,然后再向已经存在的这个长度为8的set添加元素,元素值就是0-9之间的这十个数字,如果set中已经存在值,则size()长度不会被改变,否则size()加1.如果长度改变,则打印出当前添加的数字。

import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
import java.util.TreeSet;

public class Ziranshu1 {

    public static void main(String[] args) {
        int[] a = {2, 1, 3, 5, 7, 9, 0, 4};
        Set<Integer> numbers = new TreeSet<Integer>();
        for(int i = 0; i < a.length; i++) {
            numbers.add(a[i]);
        }

        int length = numbers.size();
        for(int i = 0; i < 10; i++) {
            numbers.add(i);
            if(length != numbers.size()) {
                length = numbers.size();
                System.out.println(i + "不在内");
            }
        }
    }

}

猜你喜欢

转载自blog.csdn.net/zhang5476499/article/details/72614704