c++ - 如何根据不寻常数字的数量对数组进行排序

标签 c++ arrays sorting

我必须编写一个接受整数数组作为参数的函数 并向用户显示“不寻常”的数字。只出现的数字 在一个整数而不是其余的整数中,然后对数组进行排序以使整数 出现次数最多的异常数字将移至第一个 数组的元素,然后是下一个整数 出现次数最多的异常数字。

Input:

113
122
1000

Output:
There is 3 unusual digits:

0 occurs 3 times in 1000
2 occurs 2 times in 122
3 occurs 1 time in 113

Sorted:

1000
122
113

我的问题是如何检索与异常数字关联的整数,以便将来对它们进行排序?

我想知道 0 来自哪个整数以及它在该整数中出现了多少次。

这是我目前所拥有的,如果代码有问题,我深表歉意。我不允许使用除 iostream 之外的任何其他库,并且所有函数调用都必须自己编写。

#include <iostream>

using namespace std;

void getUncommon(int* iAry, int size) {
    const int size2 = 10;
    int* tmpAry = new int[size];
    int totalCount[size2] = { 0 };
    int currentCount[size2] = { 0 };
    int totalUncommon = 0;
    int i, j;

    for (i = 0; i < size; i++) {
        tmpAry[i] = iAry[i];
        if (tmpAry[i] < 0)
            tmpAry[i] *= -1;

        for (j = 0; j < size2; j++)
            currentCount[j] = 0;

        if (tmpAry[i] == 0) {
            currentCount[0] = 1;
        }

        while (tmpAry[i] / 10 != 0 || tmpAry[i] % 10 != 0){
            currentCount[tmpAry[i] % 10] = 1;
            tmpAry[i] /= 10;
        }

        for (j = 0; j < size2; j++) {
            totalCount[j] += currentCount[j];
        }
    }

    for (i = 0; i < size2; i++) {
        if (totalCount[i] == 1) {
            totalUncommon++;
        }
    }

    cout << "Total of uncommon digits: " << totalUncommon << endl
        << "Uncommon digits:\n";
    if (totalUncommon == 0) {
        cout << "\nNo uncommon digits found.";
    }
    else {
        for (i = 0; i < size2; i++) {
            if (totalCount[i] == 1) {
                cout << i << endl;
            }
        }
    }

    return;
}

int main(){
    int* my_arry;
    int size;
    int i;

    cout << "How many integers? ";
    cin >> size;
    my_arry = new int[size];

    for (i = 0; i < size; i++) {
        cout << "Enter value #" << i + 1 << " : ";
        cin >> my_arry[i];
    }

    cout << "\nThe original array:" << endl;
    for (i = 0; i < size; i++) {
        cout << my_arry[i] << endl;
    }

    cout << "\nCalling function -\n" << endl;

    getUncommon(my_arry, size);

    delete[] my_arry;

    return 0;
}

提前致谢。

最佳答案

您可以创建一个映射,其中数字 0 1 2 ... 9 作为键,以及一对指向整数的指针/索引,其中包含数字和出现次数整数中的数字作为键值对的值

开始迭代整数列表,从每个整数中提取数字及其出现次数。您可以通过使用模运算符或使用字符串函数(在将整数转换为字符串之后)来实现。 现在,对于每个整数,访问整数中所有数字的数字映射,如果该值未初始化,则使用指向该整数的指针/索引和该整数中该数字的出现次数更新该值。如果映射条目已经填充,则意味着它不是“不寻常”的数字。因此,您可以用一个标记来标记该 map 条目,该标记表明该特定数字并非“异常”,因此无需更新该条目。

以这种方式遍历整个整数列表后,您可以遍历 map 以找出哪些数字不寻常。您还可以从 map 键值对的 value 部分中的指针/索引访问包含的整数。您可以使用任何排序算法轻松地对这些条目进行排序(因为要排序的值的数量非常少,无需担心时间复杂度,选择最简单的值)出现次数值。

关于c++ - 如何根据不寻常数字的数量对数组进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33094887/

相关文章:

c++ - 将 C++ std::string 转换为 UTF-16-LE 编码的字符串

Javascript按给定的数组元素拆分字符串

c - 在 C 编程中将结构体数组传递给函数

jquery - 按行中最后一个单元格的背景颜色对表格进行排序

c++ - 关于括号、 bool 逻辑和 '\n'

c++ - 如何将负数打印为 0?

c++ - 在 C++11 中使用 OpenMP 查找计算值的最大值

php 变量不是数组。在变量中使用 mysql_query 插入数据

具有多个值(字符串和数字)的 JavaScript array.sort

c# - 在处理 C# Outlook 之前按接收时间对电子邮件进行排序