01.算法设计(一)

算法主要注意以下两点:
- 运行时间
- 内存消耗

下面是第一个小算法

package test;

import org.junit.Test;

public class DemoTest {
    /**
     * 假设:现在有0-99 , 共计100个整数, 各不相同。将所有数字放入一个数组,随机排布。
     * 数组长度101,多余的数字是从0-99之间的任意一个数字(唯一重复的数字)
     * 问题:将这个重复的数字找出来
     */
    @Test
    public void test1(){
        //1.创建长度101的数组,并对其进行数据初始化
        int[] arr = new int[101];
        for(int i=0;i<=99;i++){
            arr[i]=i;
        }
        arr[100] = 69;
        //2.把数据打乱, 随机排列一下
        for(int i=0;i<111;i++){
            int num1 = (int) (Math.random()*101);
            int num2 = (int) (Math.random()*101);
            //让arr[num1] = arr[num2]两个数据互换位置
            int temp = arr[num1];
            arr[num1] = arr[num2];
            arr[num2] = temp;
        }
        //测试一下我们组装的数据
//      for(int i=0;i<101;i++){
//          System.out.println(arr[i]);
//      }


        /**
         *开始完成题目
         *解决方案一 
         *缺点:速度太慢
         */
        fornum:
        for(int i=0;i<arr.length;i++){
            //取出第一个数字,然后与后面所有数字依次比对
            //arr[i] 和 arr[i+1]比较
            for(int j=i+1;j<arr.length;j++){
                if(arr[i]==arr[j]){
                    //找到后,打印,并退出外层循环
                    System.out.println("找到了重复数字:"+arr[j]);
                    break fornum;
                }
            }
        }

        /**
         * 解决方案二:
         * 0-99有一个重复的数字
         * 将数组中所有的数字加一起的和 (0-99的和 + 重复数字)
         * 将上述结果减去0-99的和 剩下的就是重复的数字
         * 缺点:如果有三万亿个数字的话, 会超出数据类型的长度。会爆掉
         */
        //1.求arr的和
        int sum=0;
        for(int i=0;i<=arr.length;i++){
            sum += i;
        }
        //2.依次减去0-99
        for(int i=0;i<=99;i++){
            sum -=i;
        }
        System.out.println(sum);

        /**
         * 方案三:
         * 使用异或^
         * 0^1^2...99^m^0^1^2...^99 = m
         */
        //使用数组中的第一个数据,异或后面所有的数据
        for(int i=1;i<arr.length;i++){
            arr[0] = arr[0]^arr[i];
        }
        //再异或一遍0-99的数字
        for(int i=1;i<=99;i++){
            arr[0] = arr[0]^i;
        }
        System.out.println(arr[0]);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值