劍指offer-50:陣列中重複的數字
阿新 • • 發佈:2018-12-18
題目描述
在一個長度為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位元組!