算法题1

摘自传智播客公开课

package test;
/*
 * 传智播客公开课笔记
 */
public class Arithmetic {
    public static void main(String[] args) {
        /*
        题设:现有0到99,共计100个整数,各不相同,将所有数放入一个
            数组,随机排布。数组长度101,多余的数字是0到99其中任
            意一个数(唯一重复的数字)
        问题:将这个重复的数字找出来
        */
        /*
         * 构造题目
         */
        int[] num = new int[101];
        for(int i=0;i<num.length;i++) {
            num[i] = i;
        }
        num[100] = 55;
        for(int i=0;i<10000;i++) {
            int num1 = (int)(Math.random()*101);
            int num2 = (int)(Math.random()*101);
            int temp;
            temp = num[num1];
            num[num1] = num[num2];
            num[num2] = temp;
        }
           
           
        //题目测试
        for(int i = 0;i<num.length;i++) {
            System.out.print(num[i] + "\t");
            if((i+1)%10==0)
                System.out.println();
        }
           
        //问题解决
        /*
         * 方案一
         */
        feng:
        for(int i = 0;i<num.length;i++) {
            for(int j = i+1;j<num.length;j++) {
                if(num[j]==num[i]) {
                    System.out.println("\n" + "方案一找出来的数字为:" + num[i]);
                    break feng;
                }
            }
        }
        //缺点:随着基数的增大,计算次数可能会成倍增大
           
        /*
         * 方案二
         */
        int sum = 0;
        for(int i=0;i<num.length;i++) {
            sum += num[i];
        }
        for(int i=0;i<100;i++) {
            sum -= i;
        }
        System.out.println("\n" + "方案二找出来的数字为:" + sum);
        //缺点:如果计算的数字特别多,比如有3万亿个数据,超出了数据类型
           
        /*
         * 方案三
         */
        int test = num[0];
        for(int i=1;i<num.length;i++) {
            test = test^num[i];
        }
        for(int i=0;i<100;i++) {
            test = test^i;
        }
        System.out.println("\n" + "方案三找出来的数字为:" + test);
           
    }
}

点赞