c++ - 用数字对字符串数组进行排序 C++

标签 c++ arrays sorting

<分区>

我无法解决这个问题。 任务很简单,在第一行输入我有多少个例子。 在第二行,我需要输入我要读取的数字数量。 然后我们输入所有由空格分隔的数字。 任务本身做,用数字从小到大对字符串数组进行排序。之后,如果我们输入的是偶数,我们打印中间的数字 -1,如果它们是奇数,我们只打印中间的数字。

到目前为止,如果我使用与 long long 完全相同的代码,它可以完美地工作,但它仅限于 19 位数字,我想扩展程序以便它可以使用更大的数字。

使用排序函数,当我尝试对从 160 到 10 的 16 个元素进行排序时,他们都把它从 110 开始搞砸了,然后在中间是 160 等一个,这绝对没有意义,使用 5 个数字或 8完美无任何问题,使用更多数字失败。

#include <iostream>
#include <algorithm>
#include <string>

using namespace std;




int main() {
int examples;
cin >> examples;
for (size_t i = 0; i < examples; i++)
{
    long long unsigned int  n;
    cin >> n;
    string * numbers = new string[n];
    for (size_t i = 0; i < n; i++)
    {
        cin >> numbers[i];
    }

    sort(numbers, numbers + n);

    if (n % 2 == 0) {
        cout << numbers[n / 2 - 1];
    }
    else
        cout << numbers[n / 2];



}

system("pause");
return 0;
}

最佳答案

首先,如果你用 operator new 分配内存,你必须用 operator delete[] 释放它。

其次,当您对字符串而不是值进行排序时,它们的排序就像字符串一样,这就是您的问题所在。你看,100 按字母顺序小于 2 或 20,这就是它会出现得更早的原因。

这是您的程序给出的输出。检查这条规则,你会发现我是对的。

10 100 110 120 130 140 150 160 20 30 40 50 60 70 80 90

第三,几乎任何事情都不鼓励使用 operator new。您有 STL,而且您似乎在广泛使用它 - 为什么不用 vector ?

第四,你不检查我们写入 numbers[i] 的任何东西是否真的是一个数字。考虑一下。

第五,如果 N 足够长(超过 2^sizeof(size_t)),您的问题将永远不会因整数溢出而停止。

第六,你不检查n == 0,如果你输入它,你最终会得到内存访问冲突。

针对您的问题的快速即时修复:

#include <iostream>
#include <algorithm>
#include <string>
#include <vector>

using namespace std;

int main() {
    int examples;
    cin >> examples;
    for (size_t i = 0; i < examples; i++)
    {
        size_t n;
        cin >> n;
        if (n <= 0)
            break;
        vector<string> numbers(n);
        for (size_t i = 0; i < n; i++)
            cin >> numbers[i];

        //here we add a predicate for string checking,
        //which evaluates the length of string
        //before using the usual operator<.

        sort(begin(numbers), end(numbers), [](const string& s1, const string& s2){
            if (s1.length() < s2.length())
                return true;
            if (s2.length() < s1.length())
                return false;
            else
                return (s1 < s2);
        });

        if (n % 2 == 0) {
            cout << numbers[n / 2 - 1];
        }
        else
            cout << numbers[n / 2];
    }

    system("pause");
    return 0;
}

不过,它还是有一些问题:

  1. 检查 numbers[i] 是否真的是一个数字

  2. 我不确定 我写的谓词没有错误 - 我只是想给你 它应该如何工作的想法。

关于c++ - 用数字对字符串数组进行排序 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40765131/

相关文章:

javascript - 如何在 Javascript 中从另一个数组中删除数组的项目值集

C语言,如何修复段错误

c++ - 如何排序 vector< pair< int , pair<int , pair<string , pair<int , int >>>>>?

c++ - 数组 CUDA 中以下元素的总和

作为 Web 服务的 C++ OpenGL 应用程序

java - 带有比较方法的冒泡排序未运行

swift - 按条件对 NSMutableArray 进行排序

algorithm - 什么时候应该实现简单或高级的排序算法?

c++ - 从字符串数组中删除相邻的重复字符串?

c++ - 动态扩展 QTabBar