总结:
- 关键点是分析规律,可通过分析简单具体的例子,试图寻找普遍的规律。
- 利用数组随机存取和连续存储的特点,方便操作。
- 特别注意有序或无序状态。
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 }