zl程序教程

您现在的位置是:首页 >  其它

当前栏目

找反复数字问题

数字 反复 问题
2023-09-27 14:25:17 时间
这是两道面试题,我觉着非常有意思。题目本身并不难。仅仅是思路的问题。

题目1:
现有0-99共100个整数,各不同样,将全部的数放入一个数组,随机排布。
数组长度101。多余的数字是0到99当中随意一个数,将反复数字找出。

解决方式:
暴力迭代那种方式就不说了,这里提供两种比較好的方式:
public class Algo1
{
    public static void main(String[] args)
    {
        int[] arr = new int[101];
        create(arr);//构建乱序数组
        
        method1(arr);
        method2(arr);
        
        for(int i = 0; i < arr.length; i++)
        {
            System.out.print(arr[i] + " ");
        }
        
    }
    
    /**
     * 方案1:
     * 题目中指明了0~99这99个数是肯定会出现的。那么非常easy。仅仅要我们遍历数组。然后求和。将和减去0累加到99的和,之差即为反复的数
     */
    public static void method1(int[] arr)
    {
        int sum = 0;
        for(int i = 0; i < arr.length; i++)
        {
            sum += arr[i];
        }
        int constant = 0;
        for(int j = 0; j < 100; j++)
        {
            constant += j;
        }
        
        int value = sum - constant;
        System.out.println("反复数字为:"+value);
    }
    
    /**
     * 方案2:
     * 能够利用异或运算的特性: a^b^b = a  
     * 即一个数两次异或还有一个数还等于这个数本身
     * --------------------------
     * 仅仅要我们遍历数组,让第一个数与后面全部数异或,将结果再依次与0~99全部数异或结果即为反复的数
     */
    public static void method2(int[] arr)
    {
        for(int i = 1; i < arr.length; i++)
        {
            arr[0] = arr[0]^arr[i];
        }
        for(int i = 0; i <= 99; i++)
        {
            arr[0] = arr[0]^i;
        }
        System.out.println("反复数字为:"+arr[0]);
    }
    /**
     * 创建题设所要求的数组
     */
    public static void create(int[] arr)
    {
        for(int i = 0; i < arr.length; i++)
        {
            arr[i] = i;
        }
        arr[100] = 93;//反复的数字
        int temp,num1,num2;
        //乱序
        for(int j = 0; j < 1000; j++)
        {
            num1 = (int) (Math.random()*101);
            num2 = (int) (Math.random()*101);
            temp = arr[num1];
            arr[num1] = arr[num2];
            arr[num2] = temp;
        }
    }
}

题目2:
 现有一个长为100的数组,里面存放0~99中的随意数字,每一个数字出现一次。
 数组中的数字是乱序的,如今从中随机取出一个数字并替换成0~99中的还有一个数字,
 试找到这个反复数字
解决方式:
public class Algo2
{
    public static void main(String[] args)
    {
        int[] arr = new int[100];
        create(arr);
        for(int i = 0; i < 100; i++)
        {
            System.out.print(arr[i]+" ");
        }
        System.out.println("\n");
        System.out.println("反复数字为:"+method(arr));
    }
    
    /**
     * 解决方式:
     * 构建一个和原数组大小一致的暂时数组,用于记录每一个索引位所代表的数据出现的次数,
     * 比方temp[5] = 2,表示5这个数字出现了两次。

* 通过遍历一次数组就可以得到结果. */ public static int method(int[] arr) { int[] temp = new int[arr.length]; for(int i = 0; i < arr.length;i++) { temp[arr[i]]++; if(temp[arr[i]] == 2) { return arr[i]; } } return -1; } /** * 构建题设所要求的数组 */ public static void create(int[] arr) { for(int i = 0; i < arr.length; i++) { arr[i] = i; } int num1,num2,temp; for(int i = 0; i < 1000; i++) { num1 = (int) (Math.random()*100); num2 = (int) (Math.random()*100); temp = arr[num1]; arr[num1] = arr[num2]; arr[num2] = temp; } do { num1 = (int) (Math.random()*100); num2 = (int) (Math.random()*100); }while(num1 == num2); arr[num1] = arr[num2]; System.out.println("反复数字为:"+arr[num1]); } }