常见的数组问题
来源:互联网 发布:学好高中数学的软件 编辑:程序博客网 时间:2024/06/05 19:41
1、给定一个含有n个元素的整型数组a,求a中所有元素的和。(要求采用递归的方式,一行代码)
参考答案:
#include<stdio.h>int sum(int* a,int n);int main(){ int array[5] = {1,2,3,4,5}; int summer; summer = sum(array,sizeof(array)/sizeof(array[0])); printf("sum %d\n",summer); return 0;}int sum(int* a,int n){ return n == 0 ? 0 : sum(a,n-1) + a[n-1];}2、给定一个含有n个元素的整型数组a,找出其中的最大值和最小值
本题如果你能用分治法来求解的话,就比单纯的采用遍历法高一阶了
#include<stdio.h>#define N 5int get_minvalue(int* a,int n);int get_maxvalue(int* a,int n);int get_min_max(int* a,int n,int* min,int* max);void MaxandMin(int *a, int l, int r, int* maxValue, int* minValue);int main(){ int array[N] = {3,6,9,1,6}; int min,max; min = get_minvalue(array,N); max = get_maxvalue(array,N); printf("min value %d,max value %d\n",min,max); get_min_max(array,N,&min,&max); printf("min value %d,max value %d\n",min,max); MaxandMin(array,0,N-1,&max,&min); printf("min value %d,max value %d\n",min,max); return 0;}int get_min_max(int* a,int n,int* min,int* max){ int i; *min = *max = a[0]; for(i = 1; i < n; i++) { if(*min > a[i]) *min = a[i]; if(*max < a[i]) *max = a[i]; } return 0;}int get_minvalue(int* a,int n){ int minvalue = a[0]; int i; for(i = 1; i < n; i++) { if(a[i] < minvalue) minvalue = a[i]; } return minvalue;}int get_maxvalue(int* a,int n){ int maxvalue = a[0]; int i; for(i = 1; i < n; i++) { if(a[i] > maxvalue) maxvalue = a[i]; } return maxvalue;}void MaxandMin(int *a, int l, int r, int* maxValue, int* minValue){ if(l == r) { *maxValue = a[l] ; *minValue = a[l] ; return ; } if(l + 1 == r) { if(a[l] >= a[r]) { *maxValue = a[l] ; *minValue = a[r] ; } else { *maxValue = a[r] ; *minValue = a[l] ; } return ; } int m = (l + r) / 2 ; int lmax ; int lmin ; int rmax ; int rmin ; MaxandMin(a, l, m, &lmax, &lmin); MaxandMin(a, m + 1, r, &rmax, &rmin); *maxValue = lmax > rmax ?lmax:rmax; *minValue = lmin < rmin ?lmin:rmin;}
3、给定一个含有n个元素的整型数组,求其最大值和次大值
本以为和上面最大值和最小值的方法一样,不同之处只是取最大和次大的区别,但是在测试的时候遇到问题,比如对l == r的处理,如果相同则最大和次大是同一数,如下列的数组,有一组就会是lmax = lsec = 9;而9是最大的数,结果就是最大和次大都是9,所以须要解决这个问题,第一,如果只有一个数的数组,那么最大和次大都是同一数,这没有问题;第二,如果数组大小不是1,那么如果遇到 l == r的情况时,我们就设定为int的最小值INT_MIN,这样就可以解决上面遇到的问题了。
#include<stdio.h>#include<limits.h> #define N 5//#define N 1int get_max_sec(int* a,int l,int r,int* max,int* sec);int main(){ int array[N] = {3,6,9,1,5}; //int array[N] = {3}; int max,sec; get_max_sec(array,0,N-1,&max,&sec); printf("max value %d,second value %d\n",max,sec); return 0;}int get_max_sec(int* a,int l,int r,int* max,int* sec){ if(l == r) { if(r == 0) { *max = *sec = a[l]; } else { *max = a[l]; *sec = INT_MIN; } return 0; } if(l + 1 == r) { if(a[l] >= a[r]) { *max = a[l]; *sec = a[r]; } else { *max = a[r]; *sec = a[l]; } //*max = a[l] >= a[r] ? a[l] : a[r]; //*sec = a[l] >= a[r] ? a[r] : a[l]; return 0; } int mid = (l + r)/2; int lmax,lsec,rmax,rsec; get_max_sec(a,l,mid,&lmax,&lsec); get_max_sec(a,mid + 1,r,&rmax,&rsec);printf("lmax %d lsec %d rmax %d rsec %d\n",lmax,lsec,rmax,rsec); if(lmax > rmax) { *max = lmax; *sec = lsec > rmax ? lsec : rmax; } else if(lmax < rmax) { *max = rmax; *sec = rsec > lmax ? rsec : lmax; } return 0;}
4、求数组中出现次数超过一半的元素(另一种说法是:给定一个n个整型元素的数组a,其中有一个元素出现次数超过n / 2,求这个元素。)
我们可以想象一下,n个整形元素的数组,超过n/2个元素是相同的,无论如果排序,至少有3个元素是相邻的。网上提供了两种方法,一,先排序,取中间元素即可,如果你能选择一些牛叉的排序方法,你可以加分;二,计数,从前往后,如果值相同则+1,否则-1,如果计数小于0,则清空,再开始,直到最后,剩下的那个就是要找的元素了。
排序的方法以后单独开个板块,这里只是看看第二种方法。
#include<stdio.h>#define N 10int find_data(int*a ,int n,int* data);int main(){ int array[N] = {1,2,1,2,4,2,2,2,4,2}; int data; find_data(array,N,&data); printf("the value is %d\n",data); return 0;}/* 计数的方法查找元素 */int find_data(int* a,int n,int* data){ int curr_value; int count; int i; curr_value = a[0]; count = 1; for(i = 1; i < N;i++) { if(curr_value == a[i]) count++; else { count--; if(count < 0) { curr_value = a[i]; count = 1; } } } *data = curr_value; return 0;}
5、给定一个含有n个元素的整型数组,找出数组中的两个元素x和y使得abs(x - y)值最小(求数组中元素的最短距离)
使两个数的绝对值最小,当然是先排序,然后看看那两个相邻元素之间的绝对值最小了
#include<stdio.h>#include<stdlib.h>#include<limits.h>#define N 5int compare(const void* a,const void* b);int find_abs_min(int* a,int n);int main(){ int array[N] = {0,2,1,9,4}; find_abs_min(array,N); return 0;}int compare(const void* a,const void* b){ return *(int*)a - *(int*)b ;}int find_abs_min(int* a,int n){ int i; int min_value,j,k; qsort(a,n,sizeof(int),compare); min_value = INT_MAX; j = k = 0; for(i = 0;i < n - 1;i++) { if(a[i+1] - a[i] < min_value) { min_value = a[i+1] - a[i]; j = a[i+1]; k = a[i]; } } printf("min_value %d,%d - %d\n",min_value,j,k); return 0;}
6、给定两个含有n个元素的有序(非降序)整型数组a和b,求出其共同元素
#include<stdio.h>#define N 5int find_comm(int* a,int* b,int n);int main(){ int a[N] = {0,1,2,3,4}; int b[N] = {1,3,5,7,9}; find_comm(a,b,N); return 0;}int find_comm(int* a,int* b,int n){ int i = 0, j = 0; while(i < n && j< n) { if(a[i] < b[j]) i++; else if(a[i] == b[j]) { printf("comm value is %d\n",a[i]); i++; j++; } else j++; } return 0;}
7、给定三个含有n个元素的整型数组a,b和c,求他们最小的共同元素
下面的参考答案给出的是三个数组所有相同元素,其第一个就是最小的共同元素。
#include<stdio.h>#define AN 5#define BN 6#define CN 4int compare(const void* a,const void* b);int find_min_comm(int* a,int* b,int* c,int an,int bn,int cn);int main(){ int a[AN] = {2,3,6,4,7}; int b[BN] = {3,7,9,2,1,5}; int c[CN] = {1,3,5,2}; find_min_comm(a,b,c,AN,BN,CN); return 0;}int compare(const void* a,const void* b){ return *(int*)a - *(int*)b;}int find_min_comm(int* a,int* b,int* c,int an,int bn,int cn){ int i,j,k; qsort(a,an,sizeof(int),compare); qsort(b,bn,sizeof(int),compare); qsort(c,cn,sizeof(int),compare); i = j = k = 0; while(i < an && j < bn && k < cn) { if(a[i] < b[j]) i++; else { if(b[j] > c[k]) k++; else if(b[j] < c[k]) j++; else { if(a[i] == b[j]) { printf("comm %d\n",a[i]); //break; i++;j++;k++; } else { j++;k++; } } } } return 0;}
- 常见的数组问题
- 数组常见的问题
- php二维数组中常见的问题
- java中的数组的常见操作问题
- 开发中常见的js数组问题。
- 数组操作的两个常见小问题
- 算法中常见的数组问题
- 数组与集合中常见的问题:数组中常见的问题:数组与ArrayList之争
- php一维数组遍历中常见的问题
- java中数组常见的排序问题整理
- 我们常见的数组
- 数组的常见操作
- 数组的常见操作
- 数组的常见操作
- 数组的常见操作
- 数组的常见操作
- 常见数组的方法
- c#数组的常见操作
- 【模拟】分数化小数
- 【转】在二元树中找出和为某一值的所有路径
- 简述HTTP网络协议工作原理的流程
- vsftpd服务器的安装与详解
- boost源码剖析之:多重回调机制signal(上)
- 常见的数组问题
- js控制表单不能输入空格
- 【动态规划】覆盖墙壁
- PHP self parent
- 面试题7答案
- 1.黑马程序员-HelloWorld!
- Web打印的解决方案之普通报表打印
- 【mysql】mysql中需要注意的几个sql语句
- Struts2通过实体传递参数