01.算法设计(二)

/**
 * 题设:现在有0-99,共计100个整数,各不相同,将所有数放入一个数组,随机排布,
 * 数组长度100,将里面任意一个数字替换成0-99的另一个数字(唯一重复的数字)
 * 问题:将这个重复的数字找出来
 */

同样的这段代码, 也可以解决01.算法设计(一)的问题。

package test6;

import org.junit.Test;

public class test6 {
    @Test
    public void test1(){
        //组装数据
        int[] arr = new int[100];
        for(int i=0;i<=99;i++){
            arr[i] = i;
        }
        //随机打乱数组的排列顺序100次。
        for(int i=0;i<100;i++){
            int num1 = (int) (Math.random()*100);
            int num2 = (int) (Math.random()*100);
            int temp = arr[num1];
            arr[num1] = arr[num2];
            arr[num2] = temp;
        }
        //将其中的一个数,替换成另一个
        int n1 = (int) (Math.random()*100);
        int n2 = (int) (Math.random()*100);
        if(n1==n2){//如果两个值相同, 在随机生成一次,保证题目正确
            n1 = (int) (Math.random()*100);
        }
        arr[n1] = arr[n2];
        //查看我们题目的数组是什么样的
        for(int i=0;i<arr.length;i++){
            System.out.print(arr[i]+",");
        }
        /**
         * 使用方案一,同样可以解决
         */
        /**
         * 方案二:创建一个辅助的数组空间(相同长度),里面元素全都是0
         * 2.遍历原始数组,使用里面的数组作为新数组的下标,进行自加
         * 如果出现多次 那么值,肯定>1
         */
         //由于用的是数组,数组是需要消耗内存空间的,所以,这种方式,加快了速度, 但是消耗了内存
        int[] newArr = new int[100];
        for(int i=0;i<arr.length;i++){
            newArr[arr[i]]++;
            if(newArr[arr[i]]>1){
                System.out.println("重复的数字是:"+arr[i]);
            }
        }
    }
}

下面是原理图:
这里写图片描述

猜你喜欢

转载自blog.csdn.net/waei08/article/details/78527359
01.