重複する数値の問題を探します

3734 ワード

これは2つの面接問題で、私はとても面白いと思います.テーマ自体は難しくなく、考え方の問題です.
タイトル1:
既存の0-99は100個の整数で、それぞれ異なり、すべての数を1つの配列に入れ、ランダムに配置します.
配列長101は、余分な数字が0から99のいずれかの数であり、重複する数字を探し出す.
ソリューション:
暴力を繰り返す方法は言わないが、ここでは2つの良い方法を提供している.
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         ,     ,        ,    ,    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の任意の数字が格納されており、数字ごとに1回、
配列中の数字は乱数であり、そこからランダムに1つの数字を取り出して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("
"); 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]); } }