问题描述:小明随机生成了n(n < 100000)个0到999之间的整数,可能有重复的整数,请你帮他按从小到大输出这些整数(忽略重复数字) 解题方法1:先排序,再去重 解决方法2:用元素a[i] 记录其对应下标i的出现次数 描述:对任意输入的一行字符,统计所有英文字母在字符串中出现的频率 描述:集合A有m个整型元素,集合B有n个整型元素,请将两个整数集合A和B合并为集合C,并将集合C中的元素按升序输出 具体代码实现: 运行结果: 描述:在一个有序的整数序列中搜索给定值X。若找到,返回X所在的位置,否则返回查找失败,标志-1. 二分搜索实现 描述:在一个有序的整数序列中搜索给定值X。若找到,返回X所在的位置,否则返回查找失败,标志Not Found! 运行结果:
一维数组应用(C语言)
1、去重处理
例如:假设n = 8,小明随机生成的8个数是:1 5 2 4 5 6 5 2
输出结果为:1 2 4 5 6#include<stdio.h> #define N 20 /*函数原型*/ void InputArr(int arry[],int n); void SortArr(int arry[],int n); void PrnArr(int arry[],int n); int main(void) { int a[N]; int n; printf("Please enter the integers:n"); scanf("%d",&n); InputArr(a,n); //输入 SortArr(a,n); //排序 PrnArr(a,n); //去重后输出 return 0; } void InputArr(int arry[],int n) { int i; for(i = 0;i < n ;i++) scanf("%d",&arry[i]); } void SortArr(int arry[],int n) { int i,j; int temp; for(i = 0;i < n - 1;i++) { for(j = i + 1;j < n ;j++) if(arry[i] > arry[j]) { temp = arry[i]; arry[i] = arry[j]; arry[j] = temp; } } } void PrnArr(int arry[],int n) { int i; for(i = 0;i < n;i++) { if(i == 0) //如果是第一个元素则输出 printf("%dn",arry[i]); else //若不是第一个元素 if(arry[i] != arry[i - 1]) //如果当前元素与前面一个元素不相等,则输出当前元素 printf("%dn",arry[i]); } }
(1)、输入所有整数。用a[i]记录编号i出现的次数
(2)、顺序输出数组a中所有非元素的下标。调用PrintIndex()实现
#include<stdio.h> #define N 1000 int PrintIndex(int arry[]); //输出arry对应非0的下标原型 int main(void) { int n; int number; int arry[N] = {0}; //把数组arry所有元素初始化为0 printf("Please enter the numbers of integers:n"); scanf("%d",&n); printf("Please enter the integers %d :n",n); while(n--) { scanf("%d",&number); //输入一个整数number arry[number]++; //用arry[number]记录number出现的次数 } PrintIndex(arry); //去重并输出 return 0; } int PrintIndex(int arry[]) //输出arry对应非0的下标 { int i; for(i = 0;i < N ;i++) { if(arry[i] > 0) printf("%d ",i); } printf("n"); }
2、字母使用频率统计
#include<stdio.h> int main(void) { char ch; int a[26] = {0}; while((ch = getchar()) != 'n') { if(ch >= 'A' && ch <= 'Z') //将大写字母转换为小写字母 ch = ch + 32; if(ch >= 'a' && ch <= 'z') //每出现一次+1 a[ch - 'a']++; } for(int i = 0;i < 26;i++) printf("count of %c is %d n",'a' + i,a[i]); return 0; }
3、集合的合并—–利用有序关系简化问题
思路分析: (1)、分别对A、B两个集合中的元素进行升序 (2)、集合A、B、C分别用三个变量i、j、k (3)、while(i < m 并且 j < n),重复以下操作: 若 a[i] < b[j]; c[k] = a[i]; i++; k++; 若 b[j] < a[i]; c[k] = b[j]; j++; k++; 若 a[i] == b[j]; c[k] = a[i]; i++; j++; k++; (4)、while(i < m),执行 c[k++] = a[i++]; (5)、while(j < n),执行 c[k++] = b[b++];
#include<stdio.h> #define N 1000 void InputArr(int arry[],int n); void SortArr(int arry[],int n); int main(void) { int i,j,k; int m,n; int a[N/2],b[N/2],c[N]; printf("请输入集合A和集合B的元素个数:n"); scanf("%d %d",&m,&n); printf("请输入集合A的元素:n"); InputArr(a,m); printf("请输入集合B的元素:n"); InputArr(b,n); SortArr(a,m); //对集合A进行排序 SortArr(b,n); //对集合B进行排序 i = j = k = 0; while (i < m && j < n) { if(a[i] < b[j]) { c[k] = a[i]; i++; k++; } else if(a[i] > b[j]) { c[k] = b[j]; j++; k++; } else { c[k] = a[i]; i++; j++; k++; } } while (i < m) { c[k] = a[i]; i++; k++; } while (j < n) { c[k] = b[j]; j++; k++; } printf("集合C的元素为:n"); for(i = 0;i < k;i++) printf("%d ",c[i]); printf("n"); return 0; } void InputArr(int arry[],int n) { int i; for(i = 0;i < n;i++) scanf("%d",&arry[i]); } void SortArr(int arry[],int n) { int i,j; int temp; for(i = 0;i < n -1;i++) { for(j = i + 1;j < n;j++) if(arry[i] > arry[j]) { temp = arry[i]; arry[i] = arry[j]; arry[j] = temp; } } }
4、二分搜索
二分搜索过程可以描述为以下递归过程:if(low > high) return -1; //搜索区域为空 else { int mid = (low + high) / 2; if(x = mid) //搜索成功 if(x < mid) //左边搜索 if(x > mid) //右边搜索 }
int BSearch(int a[],int x,int low,int high) { if(low > high) return -1; else { int mid = (low + high) / 2; if(x == a[mid]) return mid; if(x < mid) return BSearch(a,x,low,mid - 1); if(x > mid) return BSearch(a,x,mid + 1,high); } }
#include<stdio.h> #define N 100 void InputArr(int a[],int n); //输入原型 void SortArr(int a[],int n); //排序原型 void BSearch(int a[],int x,int low,int high); //二分查找原型 int main(void) { int n; int a[N]; printf("请输入元素的个数n:n"); scanf("%d",&n); InputArr(a,n); //输入元素存入数组 SortArr(a,n); //将数组中的元素进行升序 printf("排序后输出:n"); //排序后进行输出测试 int i; for(i = 0;i < n;i++) printf("%d n",a[i]); int x; int low; int high; low = a[0]; //确定最小值 high = a[n-1]; //确定最大值 printf("最大值high,最小值low分别是 :n"); //测试最大值与最小值 printf("%d %d n",a[0],a[n-1]); printf("请输入要查找的元素:n"); //输入要查找的元素 scanf("%d",&x); BSearch(a,x,low,high); //二分法进行查找 return 0; } void InputArr(int a[],int n) { int i; printf("请依次输入n个元素:n"); for(i = 0;i < n;i++) scanf("%d",&a[i]); } void SortArr(int a[],int n) { int i; int j; int temp; for(i = 0;i < n -1;i++) { for(j = i + 1;j < n;j++) { if(a[i] > a[j]) { temp = a[i]; a[i] = a[j]; a[j] = temp; } } } } void BSearch(int a[],int x,int low,int high) { if(low > high) printf("Not Found!n"); //没有找到 else { int mid = (low + high) / 2; if(x == a[mid]) { printf("其下标为:%dn",mid); //输出下标 return ; } else if(x < mid) BSearch(a,x,low,mid - 1); else if(x > mid) BSearch(a,x,mid + 1,high); } }
最后感谢各位的支持,欢迎关注公众号”编程学思”,谢谢大家!
本网页所有视频内容由 imoviebox边看边下-网页视频下载, iurlBox网页地址收藏管理器 下载并得到。
ImovieBox网页视频下载器 下载地址: ImovieBox网页视频下载器-最新版本下载
本文章由: imapbox邮箱云存储,邮箱网盘,ImageBox 图片批量下载器,网页图片批量下载专家,网页图片批量下载器,获取到文章图片,imoviebox网页视频批量下载器,下载视频内容,为您提供.
阅读和此文章类似的: 全球云计算