面试题:求数组元素的交集、从数组中随机选取元素、分解质因数、一左一右顺序排列数组
来源:互联网 发布:淘宝女鞋凉鞋 编辑:程序博客网 时间:2024/05/06 10:36
面试题:求数组元素的交集、从数组中随机选取元素、分解质因数、一左一右顺序排列数组
1、求数组元素的交集
/** 两个数组分别按升序排列,且元素互异* 找出两个数组的交集**/#include <stdio.h>#define N 5#define M 6void findcommon(int *a, int *b, int n, int m){if(NULL==a || b==NULL)return ;if(n<=0 || m<=0)return ;int i=0;int j=0;while(i<n && j<m) //利用了二分查找的思想{if(a[i]<b[j]){i++;}else if(a[i]>b[j]){j++;}else if(a[i]==b[j]){printf("%d ", a[i]);i++;j++;}}}void main(){int a[N] = {1, 3, 5, 7, 9};int b[M] = {2, 4, 5, 6, 9, 12};findcommon(a, b, N, M);printf("\n");}
/** 从数组a[N]中随机选取m(m<=N)个数* a[N]中各个元素互不相同*/ #include <stdio.h>#include <stdlib.h>void selectrandomly(int *a, int n, int m){if(NULL==a)return ;if(n<=0 || m<0)return ;if(m>n)return ;int i=0, j=0, t=0;for(i=0; i<m; i++){j = rand()%(n-i)+i; //产生从i到n-1之间的随机数t = a[i];a[i] = a[j];a[j] = t;}for(i=0; i<m; i++){printf("%d ", a[i]);}}void main(){srand((unsigned)time(0));int a[5] = {1, 2, 3, 4, 5};int n=5, m=3;selectrandomly(a, n, m);printf("\n");}
在C语言里所提供的随机数发生器的用法:现在的C编译器都提供了一个基于ANSI标准的伪随机数发生器函数,用来生成随机数。它们就是rand()和srand()函数。这二个函数的工作过程如下:
1) 首先给srand()提供一个种子,它是一个unsigned int类型,其取值范围从0~65535;
2) 然后调用rand(),它会根据提供给srand()的种子值返回一个随机数(在0到32767之间)
3) 根据需要多次调用rand(),从而不间断地得到新的随机数;
4) 无论什么时候,都可以给srand()提供一个新的种子,从而进一步“随机化”rand()的输出结果。
如何产生设定范围内的随机数
由于rand产生的随机数从0到rand_max,而rand_max是一个很大的数,那么如何产生从X~Y的数呢?
从X到Y,有Y-X+1个数,所以要产生从X到Y的数,只需要这样写:
k=rand()%(Y-X+1)+X;
这样,就可以产生你想要的任何范围内的随机数了。
3、分解质因数
代码:
/**分解质因数**思路:先找到一个最小的质数k,按照下面的方法执行*(1)如果该质数恰巧等于n,说明分解质因数已经结束,直接打印出来*(2)若n>=k,但n%k==0,打印k,并执行n=n/k,重复第一步;*(3)若n%k!=0, k=k+1, 重复第一步。**/#include <stdio.h>#include <math.h>void analyse(int n){if(n<2){printf("%d 不能进行因数分解\n", n);return ;}printf("%d = ", n);int k=2;if(n==2){printf("%d\n", n);}else{for(k=2; k<=sqrt(n); k++){if(n%k==0){ n = n/k; printf("%d*", k); k--;}}printf("%d\n", n);}}void main(){analyse(90);}
运行结果:
4、一左一右顺序排列数组
代码:
/**给定一个数组input[]*如果数组长度n为奇数,则将数组中最大的元素放到 output[] 数组最中间的位置; *如果数组长度n为偶数,则将数组中最大的元素放到 output[] 数组中间两个位置偏右的那个位置上。 *然后再按从大到小的顺序,依次在第一个位置的两边,按照一左一右的顺序,依次存放剩下的数。*例如:*input[] = {3, 6, 1, 9, 7};*output[] = {3, 7, 9, 6, 1}; *input[] = {3, 6, 1, 9, 7, 8} ;*output[] = {1, 6, 8, 9, 7, 3}。**函数接口 void sort(int *input, int n, int *output)**/#include <stdio.h>void sort(int *input, int n, int *output){if(input==NULL || output==NULL || n<=0){return ;}int i=0, j=0, tmp = 0;// 对数组元素排序,冒泡排序for(i=0; i<n-1; i++){for(j=i; j<n; j++){if(input[j]>input[i]){tmp = input[j];input[j] = input[i];input[i] = tmp;}}}// 按照数组元素的下标奇偶来存放int left = n/2-1;int right = n/2;for(i=0; i<n; i++){if(i%2==0){output[right++]=input[i];}else{output[left--]=input[i];}}for(i=0; i<n; i++)printf("%d ", output[i]);}void main(){/*int a[5]={3, 6, 1, 9, 7};int b[5];int n = 5;*/int a[6]={3, 6, 1, 9, 7, 8};int b[6];int n = 6;sort(a, n, b);printf("\n");}
运行结果:
0 0
- 面试题:求数组元素的交集、从数组中随机选取元素、分解质因数、一左一右顺序排列数组
- 百度面试题:从已排序的数组中求绝对值最小的元素
- 从包含N个元素的数组里,随机选取M个元素.
- 数据结构面试题总结3——数组:求数组中两个元素的最小距离
- 随机查找数组中第i个元素(按顺序排列的)
- 面试题整理-从数组中删除指定元素
- 高效地随机选取数组中的元素
- blueprint数组求随机元素
- 两数组求交集元素-C描述
- 面试题:数组中找重复元素
- 百度面试题:求一个已排序的数组中绝对值最小的元素
- 百度面试题:求一个已排序的数组中绝对值最小的元素
- 【谷歌面试题】求数组中两个元素的最小距离
- 面试题:求2个有序数组的有序交集
- 面试题:求2个有序数组的有序交集
- 面试题:从1001个整数元素的数组中找出重复的数字
- 面试题81:有序数组中绝对值最小的元素
- 数据结构面试题总结6——数组:求两个数组中满足给定和的两个元素
- 二进制实用程序(objdump, readelf,ar, nm等)
- linux service命令
- 如何写Makefile from 精华文章@chinaunix.net
- linux命令英文缩写的含义(方便记忆)
- C语言条件编译及编译预处理阶段
- 面试题:求数组元素的交集、从数组中随机选取元素、分解质因数、一左一右顺序排列数组
- 第八周项目6本月有几天
- dev/null和dev/zero
- linux驱动头文件说明
- 揭秘:茗记甜品加盟骗局背后的真相
- CPU 用户时间 系统时间
- 静态库和动态库的区别
- Linux -soname深入理解
- NOR Flash的烧写方式