华为笔试——C++特定位数比较

题目:特定位数比较

题目介绍:输入两行数据,第一行为 m 个正整数,以空格隔开;第二行为正整数 n ,且 n<= m;要求对第一行的数字的后三位大小进行排序,输出排行 n 的数字,其中,若不满三位数则直接比较;若两数字比较结果相等则两数相对位置不变;排序时位置从1开始。

例:

输入:

12 450 9001 5231 8231 7231

5

输出:

7231

分析:因为输入中并没有正整数 m 即输入正整数的个数,因此我们需要先解决“输入一行数字,以空格间隔,以回车结尾,存储在数组里”的问题,这个问题有两种解决方案,一种是直接int p[100] ;每有一个数字存储进数组k++,最终 k 的值就是数组的长度;另一种是用 vector 和 reserve ,预设100空间,这样不用占用太多内存,详情见代码。其次要解决的问题就是数字的后三位比较,这个直接取余1000就可以办到。最后的问题是排序,把源数组和取余后的数组放在一起,序号一一应对,拍完序直接输出下标 [ n-1 ] 即可。

 1 #include <iostream>
 2 #include <vector>
 3 #include <stdlib.h>
 4 using namespace std;
 5 int main()
 6 {
 7     vector <int> p;
 8     int i = 0, j = 0, k = 0;
 9     int n;
10     int mid = 0;
11     int a;
12     char c;
13     p.reserve(100);
14     p.push_back(0);
15     while (cin >> a)
16     {
17         p[k++] = a;
18         p.push_back(k);
19         if ((c=getchar()) == '
')
20         {
21             break;
22         }
23     }
24     int *q = new int[k];
25     for (i = 0; i < k; i++)
26     {
27         q[i] = p[i] % 1000;
28     }//取后三位数字
29     for (i = 0; i < k; i++)
30     {
31         for (j = 0; j < k; j++)
32         {
33             if (q[i] > q[j] && i < j)
34             {
35                 mid = q[i];
36                 q[i] = q[j];
37                 q[j] = mid;//中间数
38                 mid = p[i];
39                 p[i] = p[j];
40                 p[j] = mid;
41             }
42         }
43     }
44     cin >> n;
45     cout << p[n - 1] << endl;
46 }

结果如图:

原文地址:https://www.cnblogs.com/ljy1227476113/p/9631758.html