数据结构:数组篇

229 阅读2分钟

数组(Array):

是由相同类型的元素(element)集合组成的固定长度(Size)的一种数据结构。在内存中是连续存储的

可以通过索引(Index)计算出某个元素的地址。

下面直接上算法题

例题一:找出数组中重复的数字。

题目描述:在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。

  • 思路一:使用集合存储已经遍历的数据 Java中Set集合的特性是保存的数据是不可重复的,将数组中的元素放入Set中,当Set集合中包含数组元素时,说明这个元素时重复的
public static int findRepeatNumber(int[] nums) {
        Set<Integer> set=new HashSet<>();
        for(int num:nums){
            if(set.contains(num)){
            return num;
            }
            set.add(num);
        }
        return -1;
    }
  • 思路二:先排序,后查找 先对数组进行排序,要寻找排序后的数组是否有重复元素,只要判断一个元素与这个元素之前或之后的元素是否相等即可
public static int findRepeatNumber(int[] nums) {
        Arrays.sort(nums);
        for(int i=1;i<nums.length;i++){
            if(nums[i]==nums[i-1]){
                return nums[i];
            }
        }
        return -1;
    }
  • 思路三:临时数组 审题:在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内

设置一个全为0长度为n的数组,将原数组中的元素数值与索引相对应,有这个数则将新数组的0设为1

原数组:2,3,1,0,2,3,5

新数组:0,0,0,0,0,0,0

当遍历到原数组第一个元素2时

将新数组设为 0,0,1,0,0,0,0 依此类推

public static int findRepeatNumber(int[] nums) {
       int[] temp=new int[nums.length];
       for(int i=0;i<nums.length;i++){
           int num=nums[i];
           if(temp[num]!=0){
               return num;
           }
           temp[num]=1;
       }
       return -1;
    }

例题二:找出数组中只出现一次的数

题目描述:给定一个整型数组 arr 和一个整数 k(k>1)。 已知 arr 中只有 1 个数出现一次,其他的数都出现 k 次。 请返回只出现了 1 次的数。

k-1表示的是相同数的最后一个

public int foundOnceNumber (int[] arr, int k) {
        Arrays.sort(arr);
        for(int i=0;i<arr.length-1;i++){
            if(arr[i]==arr[i+1]){
                i+=k-1;
            }else {
                return arr[i];
            }
        }
        return arr[arr.length-1];
    }

例题三:二维数组中的查找

在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

[

[1,2,8,9],

[2,4,9,12],

[4,7,10,13],

[6,8,11,15]

]

给定 target = 7,返回 true。

给定 target = 3,返回 false。

public boolean Find(int target, int [][] array) {
        int i = array.length-1;
        int j = 0;
        while(i>=0&&j<array[0].length){
            if(array[i][j]>target){
                i--;
            }else if(array[i][j]<target){
                j++;
            }else{
                return true;
            }
        }
        return false;
    }

例题四:调整数组顺序使奇数位于偶数前面

题目描述:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。

思路:遍历两次数组,第一次只添加奇数到新数组里,第二次只添加奇数到新数组里

public int[] reOrderArray (int[] array) {
    int index = 0;
    int[] res = new int[array.length];
    for (int i : array) {
        if (i % 2 != 0) {
            res[index] = i;
            index++;
        }
    }
    for (int i : array) {
        if (i % 2 == 0) {
            res[index] = i;
            index++;
        }
    }
    return res;
}