c++ - 检查两个数字是否互为排列?

标签 c++ c performance

给定两个数字 a, b 使得 1 <= a , b <= 10000000000 (10^10)。我的问题是检查它们中的数字是否相互排列。最快的方法是什么?我想使用散列但无法找到任何合适的散列函数。有什么建议吗?

例如- 123 是 312 的有效排列

我也不想对数字中的数字进行排序。

最佳答案

如果您指的是数字的字符(例如 1927 和 9721),(至少)有几种方法。

如果允许排序,一种方法是简单地将它们 sprintf 到两个缓冲区,对缓冲区中的字符进行排序,然后查看字符串是否相等。

然而,鉴于您希望对数字进行排序,另一种选择是设置一个十元素数组,所有元素初始设置为零,然后处理第一个数字中的每个数字,递增相关元素。

然后对第二个数字执行相同的操作,但递减。

如果最后仍然全为零,则这些数字是彼此的排列。

这是一种高效的 O(n) 算法,其中 n 是两个数字中的位数。这种野兽的伪代码类似于:

def arePermutations (num1, num2):
    create array count, ten elements, all zero.
    for each digit in num1:
        increment count[digit]
    for each digit in num2:
        decrement count[digit]
    for each item in count:
        if item is non-zero:
            return false
    return true

在 C 中,以下完整程序说明了如何完成此操作:

#include <stdio.h>
#include <stdlib.h>

#define FALSE (1==0)
#define TRUE  (1==1)

int hasSameDigits (long num1, long num2) {
    int digits[10];
    int i;

    for (i = 0; i < 10; i++)      // Init all counts to zero.
        digits[i] = 0;

    while (num1 != 0) {           // Process all digits.
        digits[num1%10]++;        // Increment for least significant digit.
        num1 /= 10;               // Get next digit in sequence.
    }

    while (num2 != 0) {           // Same for num2 except decrement.
        digits[num2%10]--;
        num2 /= 10;
    }

    for (i = 0; i < 10; i++)
        if (digits[i] != 0)       // Any count different, not a permutation.
            return FALSE;

    return TRUE;                  // All count identical, was a permutation.
}

int main (int c, char *v[]) {
    long v1, v2;

    if (c != 3) {
        printf ("Usage: %s <number1> <number2>\n", v[0]);
        return 1;
    }

    v1 = atol (v[1]);
    v2 = atol (v[2]);
    if (hasSameDigits (v1, v2)) {
        printf ("%d and %d are permutations\n", v1, v2);
    } else {
        printf ("%d and %d are not permutations\n", v1, v2);
    }

    return 0;
}

只需将两个(正)数字传递给它,假设它们适合 long,它会告诉您它们是否具有相同的数字计数。

关于c++ - 检查两个数字是否互为排列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3219112/

相关文章:

javascript - 任何不使用 $(test).stuff(); 的理由与测试.stuff();鉴于该测试 = $ ('something' );?

sql-server - 最大化 SQL Server Service Broker 吞吐量

不同文件中的 C++ 类问题

java - 使用小数据类型是否会减少内存使用(来自内存分配而不是效率)?

c++ - 如何通过填充选项将一个矩形缩放到另一个矩形(例如将图片缩放到窗口)并保持纵横比?

c - C 版本是否向后兼容?

c - 每 x 秒运行一次函数

javascript - 当我创建许多对象时,kineticjs 会变慢

c++ - STL ostream_iterator 写入屏幕,即使我覆盖了它?

c++ - 为什么我的二十面体画不出来?