关于这个练习10,总体上难度中等,一直到G题之前都还挺简单的,从H题(最大数的位置)开始就有一些难度了,主要还是思维上不够开阔。初做H题的时候,我就很困惑:怎样才能输出最大数的位置呢?之前只是有输出某个数组的最大数,可是并没有输出过最大数的位置。后来,在参考了教材之后,才恍然大悟:
H(最大数的位置)
题目描述:输入n 个整数, 存放在数组a[1] 至a[n]中,输出最大数所在位置(n≤1000 )。
输入描述: 第一行,数的个数n; 第二行,n个正整数,每个数在232−1之内。
输出描述: 最大数所在位置,当有多个相同的数,输出第一次出现的位置。
AC代码:
#include<iostream> using namespace std; int main() { int n,i,max=1; cin>>n; int a[1000]={0}; for(i=1;i<=n;i++) { cin>>a[i]; } for(i=2;i<=n;i++) { if(a[i]>a[max]) max=i; } cout<<max<<endl; return 0; }这给了我一种全新的思路,即可以用一个变量作为一个在遍历数组元素的同时记录最大(或最小)元素所在位置的工具,是一个很大的收获。
H题之后的题目之所以让我觉得有难度的原因还是思路上的局限,不够开阔,所以通过这些题我可谓受益匪浅,掌握了很多新的思路。
例如I题(最高分与最低分的差)就让我明白了如何在一个数组中同时找到最大值和最小值:就是让两个变量max和min都等于数组第一个元素的值,然后从下一个元素开始,如果数组中有元素比第一个元素大,就将该元素的值赋值给max,反之则赋值给min,这样就可以同时获得一个数组中的最大值和最小值。
注意的是,如果写成a[i]>a[0] max=a[i](或者是a[i]>a[1] max=a[i]),其实所表达的意思是只要数组中存在比第一个元素大的元素,就把该元素的值赋值给max,这样显然是不能找到最大的元素的,一定要注意,我曾经无数次跳入这个坑。同理也不能通过这样写找到最小的元素。
接下来的题,我觉得最经典的也是最好的题是N题(有序数列插入一个整数),最难的是O题(有序数列合并),因为N题的实质就是插入排序,很重要,必须要掌握,O题在确定循环初始值和循环条件上极容易出错,也是很好的一道题。
N(有序数列插入一个整数)
有一个有序数字序列,从小到大排序,将一个新输入的数插入到序列中,保证插入新数后,序列仍然是升序。
输入描述:第一行输入一个整数N(0≤N≤50)。第二行输入N个升序排列的整数,输入用空格分隔的N个整数。第三行输入想要进行插入的一个整数。
输出描述:输出为一行,N+1个有序排列的整数。
这道题我觉得最好的思路就是让数组的第0个元素就是要插入的元素,之后在数组内比较元素大小,如果大于所比较的元素的值,就将插入的元素往后放,否则不进行交换。
#include<iostream> using namespace std; int main() { int N,i,d; cin>>N; int a[1000]={0}; for(i=1;i<=N;i++) { cin>>a[i]; } cin>>a[0]; for(i=0;i<N;i++) { if(a[i]>=a[i+1]) { d=a[i]; a[i]=a[i+1]; a[i+1]=d; } } for(i=0;i<=N;i++) { printf("%d ",a[i]); } return 0; }O题我的思路是定义三个数组,将要合并的两个数组输入,之后将第一个数组的元素赋值给第三个数组,接着将第二个数组的元素赋值给第三个数组,最后将第三个数组中的元素进行冒泡排序后输出即可。
O(有序数列合并)
题目描述 :输入两个升序排列的序列,将两个序列合并为一个有序序列并输出。
输入描述: 输入包含三行, 第一行包含两个正整数n, m(1 ≤ n,m ≤ 100),用空格分隔。n表示第二行第一个升序序列中数字的个数,m表示第三行第二个升序序列中数字的个数。 第二行包含n个整数(范围1~50000),用空格分隔。 第三行包含m个整数(范围1~50000),用空格分隔。
输出描述: 输出为一行,输出长度为n+m的升序序列,即长度为n的升序序列和长度为m的升序序列中的元素重新进行升序序列排列合并。
AC代码:
#include <iostream> using namespace std; int main() { int m,n,i,j=0,d; cin>>m>>n; int a[1000]={0}; int b[1000]={0}; int c[2000]={0}; for(i=0;i<m;i++) { cin>>a[i]; } for(i=0;i<n;i++) { cin>>b[i]; } for(i=0;i<m;i++) { c[i]=a[i]; } for(i=m;i<m+n;i++) { c[i]=b[j]; j++; } for(i=0;i<n+m-1;i++) { for(j=0;j<m+n-1-i;j++) { if(c[j]>c[j+1]) { d=c[j]; c[j]=c[j+1]; c[j+1]=d; } } } for(i=0;i<m+n;i++) { printf("%d",c[i]); if(i<m+n-1) printf(" "); } return 0; }