剑指offer之数组

Posted lizijiangmm

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指offer之数组相关的知识,希望对你有一定的参考价值。

总结:

  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之数组的主要内容,如果未能解决你的问题,请参考以下文章

剑指offer五十一之构建乘积数组

剑指offer五十之数组中重复的数字

《剑指Offer》之二维数组中的查找

剑指offer之二维数组中的查找

LeetCode810. 黑板异或游戏/455. 分发饼干/剑指Offer 53 - I. 在排序数组中查找数字 I/53 - II. 0~n-1中缺失的数字/54. 二叉搜索树的第k大节点(代码片段

剑指offer(二十六)之数组中重复的数字