1. 程式人生 > >Duplicate51(陣列中重複的數字)

Duplicate51(陣列中重複的數字)

/**
 * @author LemonLin
 * @Description :Duplicate51
 * @date 2018/9/20-11:29
 *
 * 陣列中重複的數字:
 * 在一個長度為n的數組裡的所有數字都在0到n-1的範圍內。 陣列中某些數字是重複的,但不知道有幾個數字是重複的。
 * 也不知道每個數字重複幾次。請找出陣列中任意一個重複的數字。例如,如果輸入長度為7的陣列{2,3,1,0,2,5,3},
 * 那麼對應的輸出是第一個重複的數字2。
 *
 *
 * 思路一:時間複雜度O(n),空間複雜度O(n)
 * 利用一個新開闢的陣列來儲存每次讀取的給定的陣列值,比如給定陣列為{4,2,1,5,6,0,1}
 * 那麼讀取到4,就在新陣列的下標為4的地方存入4,讀取2,存入2,以此類推,存入之前判斷一下陣列中是否
 * 已經存在這個數,如果存在就找到了對應的一個重複的數
 *
 *
 * 思路二:時間複雜度O(n),空間複雜度O(1)
 *
 * 如果這個陣列中沒有重複的數字,那麼排序完數字i將出現在下標為i的位置;
 * 從頭到尾依次掃描這個陣列中的每個數字。當掃描到下標為i的數字時,用一個m來暫存,對比是不是等於i.
 *       如果是,接著掃描下一個數字。
 *       如果不是,再拿它和第m個數字進行比較。
 *              如果它和第m個數字相等,就找到了一個重複的數字
 *              如果不相等,就把第i個數字和第m個數字交換,把m放到屬於它的位置
 *
 *
 *
 *
 *
 */
public class Duplicate51 {

    /**
     *@Description
     *@params numbers:     an array of integers
     *  *      length:      the length of array numbers
     *  *       duplication: (Output) the duplicated number
     *  *     in the array number,length of duplication array is 1,so using duplication[0]
     *@author LemonLin
     *@date  2018/9/20
     */
    public boolean duplicate(int numbers[],int length,int [] duplication) {


        int temp=0;
        for (int i=0;i<numbers.length;i++){
            temp = numbers[i];
            if (temp == i){
                continue;
            }else if (temp == numbers[temp]){
                duplication[0]=temp;
                return true;
            }else {
                int temp2=0;
                temp2 = numbers[temp];
                numbers[temp]=numbers[i];
                numbers[i] = temp2;
                i--;
            }
        }
        return false;
    }


    public static void main(String[] args) {

        int test[]={2,3,1,0,2,5,3};
        Duplicate51 duplicate51 =new Duplicate51();

        int duplicate[]={0};
        duplicate51.duplicate(test,test.length,duplicate);

        System.out.println(duplicate[0]);

    }
}