1. 程式人生 > >劍指offer-50:陣列中重複的數字

劍指offer-50:陣列中重複的數字

題目描述

在一個長度為n的數組裡的所有數字都在0到n-1的範圍內。 陣列中某些數字是重複的,但不知道有幾個數字是重複的。也不知道每個數字重複幾次。請找出陣列中任意一個重複的數字。 例如,如果輸入長度為7的陣列{2,3,1,0,2,5,3},那麼對應的輸出是第一個重複的數字2。

思路

看程式碼吧
由條件可知,數組裡面的數是小於陣列長度。那麼可以根據這個條件遍歷陣列改變每個陣列的值對應下標的數值。

舉個例子:
2,3,1,0,2,5,3
當下標i=0時:改變下標為2的數值
2,3,8,0,2,5,3
當下標i=1時:改變下標為3的數值
2,3,8,7,2,5,3
當下標i=2時:改變下標為1的數值
2,10,8,7,2,5,3
當下標i=3時:改變下標為0的數值
9,10,8,7,2,5,3
當下標i=4時:發現數值8>7(陣列長度),說明出現過2。
9,10,8,7,2,5,3

程式碼

public class Solution50 {

    /**
     *
     * @param numbers  陣列
     * @param length   陣列的長度
     * @param duplication 儲存重複數字
     * @return 如果輸入無效 返回false
     */
    public boolean duplicate(int[] numbers,int length,int[] duplication) {


        if(numbers==null||length<0)
            return
false; for (int num:numbers) { if(num<0||num>length-1) return false; } for (int i=0;i<length;i++){ int index=numbers[i]%length; if(numbers[index]>=length){ duplication[0]=index; return
true; } numbers[index]+=length; } return false; } public static void main(String[] args) { int[] arr={2,3,1,0,2,5,3}; int[] duplication=new int[1]; boolean isValue=new Solution50().duplicate(arr,arr.length,duplication); BeanUtil.print(isValue); if(isValue) BeanUtil.print(duplication[0]); } }

額外的知識點

(1)boolean不是佔1位,計算機處理處理資料的最小單元是1位元組,一般1位的話,其餘7位會被0補齊。
(2)在java虛擬機器規範中,JVM沒有用於操作boolean的位元組碼指令,在編譯後用int的資料型別代替boolean,此時boolean佔4位元組。
(3)boolean[]陣列編譯後會被byte[]陣列代替,此時的boolean佔1位元組。
總結:boolean單獨存在佔4位元組,在boolean[]中佔1位元組!