面试算法篇-数组

0.各种基础排序(快排*,归并*,选择,希尔等)
1.给定一个 1-100 的整数数组,请找到其中缺少的数字。

思路1:
只缺少一个数,其不重复的情况下可以求和,已知1-100的和是5050,对应的数组求和sum,用5050-sum=result,这个result就是缺少的数字,

思路2
创建一个array length=100,index和实际值对号入座,遍历对应index为空的,就是缺少的数字.

思路3
利用位运算的异或运算⊕
a ^ a = 0
a ^ b ^ b = a
成对数字异或运算等于0;

2.请在给出的整数数组中找到重复的数字。

思路1
使用hashMap,key是数字,value是count,连续遍历两次

public void find(int[] arr){
            if(arr.length > 0){
                Map<Integer,Integer> map = new HashMap<Integer,Integer>();
                for(int i=0;i<arr.length;i++){
                    if(null == map.get(arr[i])){
                        map.put(arr[i],1);
                    }else{
                        Integer count = map.get(arr[i]);
                        map.remove(arr[i]);
                        map.put(arr[i],count+1);
                    }
                }
                for(Integer key:map.values){
                    if(map.get(key)>1){
                        system.out.print("result:"+value);
                    }
                }
            }
        }

思路2
先排序,这让重复的数字肯定相邻,比较两个相邻的数字是否相等,找到这个数字.

public  void find(int[] arr){
    if(arr.length > 0){
        Arrays.sort(arr);
        for(int i=0;i<arr.length-1;i++){
            int n = i+1;
            if(arr[i] == arr[n]){
                system.out.print("result:"+arr[i]);
            }
        }
    }
}
3.在未排序的整数数组中找到最大值与最小值

思路1
定义两个数字min,max,一次遍历:
arr[i]>max,则 max = arr[i]
arr[i]<min,则 min = arr[i]

4.请找出一个有序数组中两个元素的和等于给定数字

思路1
用hashMap 时间复杂度O(n)

思路2
从左到右遍历数组,在遍历的过程中,取一个元素 a,然后让 sum 减去 a,这样可以得到 b,即 b = sum - a。然后由于数组是有序的,我们再利用二分查找,在数组中查询 b 的下标。
时间复杂度O(nlgN)

思路3
双指针 O(n)

public int[] find(int[] arr,int tager){
    int start = 0;
    int end = arr.length-1;
    while(end > start){
        if(arr[start]+arr[end] > tager){
            end--;
        }else if(arr[start]+arr[end] < tager){
            start++;
        }else{
            int[] result = new int[2];
            result[0] = arr[start];
            result[1] = arr[end];
            return result;
        }
    }
}
5.如何删除现有数组中的重复项

思路1
使用Set的特性

思路2
创建一个新数组,将原来的元素一个个添加进去,添加前判断是否重复,
时间复杂度O(n平方),而且还需要额外增加空间.

思路3
使用HashMap,遍历一次将所有元素放入map,放入前先get,get不到则放入.
哈希算法时间复杂度O(1),整体时间复杂度O(2n+1) = O(n),需要使用额外空间.

6.数组旋转 *(高频)

思路1
1.获取最高位的数字
2.把其他位上的数字都抬高一位
3.把最初获得最高位的数字赋值到最低位置上

public void rotate(int[] arr,int k){
    int lenght = arr.lenght;
    if(lenght < 1){
        return;
    }
    k = k % lenght;
    int i = 0;
    while(k > i){
        i++;
        int last = arr[lenght - 1];
        for(int n= lenght-1;n>0;n--){
            arr[n-1] = arr[n];
        }
        arr[0] = last;
    }
}

思路2
创建一个新数组,将旋转结果放入新数组中

public int[] rotate(int[] arr,int k){
    int lenght = arr.length;
    if(length < 1){
        return arr;
    }
    int[] result = new int[lenght];
    k= k % lenght;
    for(int n = 0; n < lenght ; n++){
        if(n+k > lenght-1){
            result[n] = arr[(n+k)-lenght];
        }else{
            result[n] = arr[n+k];
        }
    }
    return result;
}
7.请找出数组中所有总和等于给定数字的组合

思路1
递归,枚举法
动态规划问题有点难

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值