1-递归实现数组求和
int getsum(int *a,int n)
{
if(n==0) return 0;
else{
getsum(a,n-1)+a[n-1];
}
}
2-一个变量二维数组
#define MAXX=2
#define MAXY=3
void print(){
int array[MAXX][MAXY]={1,2,3,4,5,6};
for(int i=0;i<MAXX*MAXY;i++){
printf("d%/n",array[i/MAXX][i%MAXY]);//i/maxx实现外层大循环,i%maxy实现内存小循环
}
}
3-递归判断数组递增
int isIncrese(int a[],int n){
if(n==1)
return 1;
else
return a[n]>a[n-1]&&isIncrease(a,n-1);
}
4-排序数组中查找指定元素重复出现次数
示例:{1,2,2,2,3}数组中2出现3次
- 解法1. 顺序查找,找到第一个指定元素位置,开始记录i,出现一次i++,到出现不一样元素时,输出i
- 解法2.二分查找,分别查找该元素出现的第一个位置,在查找出现的最后一个位置,相减求出重复次数
5-无序数组的交集
- 使用hashset,判断是否重复,或者hashmap
- 分别转化为有序数组,针对有序数组进行交集分析
- 位图法
- 野蛮分析法 每一个元素分别判断,n*m
6-有序数组的交集
- 两数组的长度基本一致
- hashmap
- 遍历一个建立hashset,遍历另一个判断是否冲突
- 仿照有序链表的合并
- 两数组的长度悬殊很大
- 遍历长度小的数组,将得到的元素在长数组中进行二分\分块查找
7-重复次数最多的元素
- 位图法
- hashmap
8-O(n)时间复杂度中,寻找数组中出现一半以上的数
- hashmap
- 编程之美,水王问题,,,每次取出两个不同的数,剩下元素中水王仍然超过一半。
- 不断取出不同的的数,剩下的就是水王
- count变量,是+1,否-1
9-求解存放连续数的数组的唯一重复元素,时间复杂度O(n)
- 允许辅助空间——位图法
- 无辅助空间——数组中存放1~n-1: 数组求和-[1,2,,,n-1]的和相减,即为所求元素
10-出现奇数次的元素
- 位图法
- 如果只有一个基数次元素:可使用异或法 k^k=0 k^0=k,,对数组内所有元素集体进行异或
11-数组中符合条件的数组对个数
一个整数数组,元素取值为1~n-1,元素不会重复,查找数对个数,满足a+b=n+1
- 蛮力法 n*m
- 数组排序+二分查找
- a[s]+a[end]>n+1; 则end–
- a[s]+a[end]=n+1 则s++.end–
- a[s]+a[end]
12-数组验证有无重复元素
- 位图法
- 排序+两两比较
- hashset
- hashmap
13-使得数组,左边全为奇数,右边为偶数
快速排序的变形
14-数组去重
- 蛮力法 n*m
- 快速排序+再遍历去重
- 下标数组法
15-求第二大数
两个变量,max,secondMAX
16-求最大最小数
- 两次遍历 比较次数2N
- 一次遍历,每次取一个,1:2比较,比较次数2N
- 一次遍历,每次取两,2:2,比较次数1.5n
- 分治法
17-后M个数移动到前M
类似字符串的移位
18-寻找只出现一次的元素
异或法
19-判断一个整数X是否可以表示n(n>2)个连续正整数的和
X=m+(M+1)+(m+2)+,,,(m+n-1);
X=(2m+n-1)*n/2;
m=(2*x/n-n+1)/2;
问题转化为M是否存在,也就是(2*x/n-n+1)/2是否是偶数