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
递归,枚举法
动态规划问题有点难