• 华为笔试——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 }

    结果如图:

  • 相关阅读:
    uoj35 后缀排序
    bzoj1026windy数
    poj2761 feed the dog
    codevs2875RY哥查字典
    bzoj1683[Usaco2005 Nov]City skyline 城市地平线
    codevs2464超级麻将
    初赛乱记
    让NOI Linux变得可用
    [HAOI2015] 按位或
    一句话CF
  • 原文地址:https://www.cnblogs.com/ljy1227476113/p/9631758.html
Copyright © 2020-2023  润新知