1. 程式人生 > >劍指offer之數組

劍指offer之數組

簡單 class 整數 通過 所有 string 右上角 col 如果

總結:

  1. 關鍵點是分析規律,可通過分析簡單具體的例子,試圖尋找普遍的規律。
  2. 利用數組隨機存取和連續存儲的特點,方便操作。
  3. 特別註意有序或無序狀態。
 1 public class Solution {
 2 /*面試題3:
 3 在一個長度為n的數組裏的所有數字都在0到n-1的範圍內。 數組中某些數字是重復的,
 4 但不知道有幾個數字是重復的。也不知道每個數字重復幾次。請找出數組中任意一個重復的數字。
 5 例如,如果輸入長度為7的數組{2,3,1,0,2,5,3},那麽對應的輸出是第一個重復的數字2。
 6  */
 7 //從頭開始掃描,判斷數字和下標是否符合,符合則不作處理,繼續判斷下一個數字
8 //不符合則先判斷當前數字與其所對應位置的數字是否相等,若相等則找到重復數字,即當前數字 9 //若不相等則交換數字的位置,交換後繼續判斷當前位置的數字,註意是繼續當前位置的判斷while控制,符合才進入下一輪for循環 10 public boolean duplicate(int number[],int length,int[] dup ){ 11 int temp; 12 if(length <=1) return false; 13 for(int i = 0;i <number.length;i++){ 14 while
(number[i] != i){//當前數字不等於前下標,則判斷等於數字下標的位置的數字 15 if(number[number[i]] != number[i]){//若不相等,則交換 16 temp = number[number[i]]; 17 number[number[i]] = number[i]; 18 number[i] = temp; 19 } 20 else{//若相等,則說明找到重復數字,返回並退出
21 dup[0] = number[i]; 22 return true; 23 } 24 } 25 } 26 return false; 27 } 28 /*面試題4: 29 在一個二維數組中,每一行都按照從左到右遞增的順序排序, 30 每一列都按照從上到下遞增的順序排序。請完成一個函數, 31 輸入這樣的一個二維數組和一個整數,判斷數組中是否含有該整數。 32 */ 33 /* 34 思路:關鍵在於找到規律,從右上角開始判斷,逐漸的去除行或者列(轉變為對行號或列號的簡單操作) 35 */ 36 public boolean Find(int target, int [][] array) { 37 int i = 0,len = array.length;//行數 38 int j = array[0].length - 1; 39 while(i < len && j >= 0){ 40 if(target == array[i][j]) return true; 41 else if(target < array[i][j]) j--; 42 else i++; 43 } 44 return false; 45 } 46 public static void main(String args[]){ 47 int num[] = {2,3,1,0,2,5,3},dup[]={0}; 48 int a[][] = {{1,2,8,9},{2,4,9,12},{4,7,10,13},{6,8,11,15}}; 49 Solution s = new Solution(); 50 Boolean flag = s.duplicate(num, num.length,dup); 51 if(flag){ 52 System.out.println(dup[0]); 53 } 54 System.out.println(s.Find(10,a)); 55 } 56 }

劍指offer之數組