关于这个练习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;
}