Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何解决电话号码排列问题_C++_Permutation - Fatal编程技术网

C++ 如何解决电话号码排列问题

C++ 如何解决电话号码排列问题,c++,permutation,C++,Permutation,问题是: 一家公司正在向员工分发电话号码,以使事情变得更简单。下一个数字不能等于最后一个数字是唯一的规则,例如0223是不允许的,而2023是允许的。每次至少排除三位数字。编写一个函数,该函数包含电话号码的长度和将被排除的数字。该功能应打印所有可能的电话号码 我是在一次面试中得到这个问题的,我在大学里也见过类似的问题。这是一个排列问题。我的问题是,在没有一百万个for循环的情况下,解决这个问题的最佳方式或体面方式是什么 我确实明白,从技术上讲,这就是它的工作原理 电话号码长度=3 [0-9],[

问题是:

一家公司正在向员工分发电话号码,以使事情变得更简单。下一个数字不能等于最后一个数字是唯一的规则,例如0223是不允许的,而2023是允许的。每次至少排除三位数字。编写一个函数,该函数包含电话号码的长度和将被排除的数字。该功能应打印所有可能的电话号码

我是在一次面试中得到这个问题的,我在大学里也见过类似的问题。这是一个排列问题。我的问题是,在没有一百万个for循环的情况下,解决这个问题的最佳方式或体面方式是什么

我确实明白,从技术上讲,这就是它的工作原理

电话号码长度=3

[0-9],[0-9]不包括最后一位,[0-9]不包括最后一位

但我不确定如何将其转化为代码。任何语言都可以

谢谢各位:


而且我可能问错地方了。如果是,请告诉我。

解决此问题的简单方法是使用递归。下面是我的注释C++代码:

void solve(整数深度、整数大小、向量和当前顺序){
//如果递归深度等于大小,这意味着我们已经决定了大小
//数字,这意味着curr_seq.size()==size。换句话说,我们
//在这一点上决定了足够的号码来创建一个完整的电话号码,所以
//我们打印并返回。
如果(深度==大小){
对于(内部项目:当前顺序){

cout我想我喜欢递归解决方案,但您也可以生成所有排列,直到极限(迭代),过滤掉任何重复的数字,并打印成功的候选:

#include <iomanip>
#include <iostream>
#include <sstream>

using namespace std;

// Because C/C++ still has no integer power function.
int ipow(int base, int exp) {
    int result = 1;
    for (;;) {
        if (exp & 1)
            result *= base;
        exp >>= 1;
        if (!exp)
            return result;
        base *= base;
    }
}

void noconsec(const int len) {
    int lim = ipow(10, len);

    // For e.g. len 4 (lim 10000),
    // obviously 00xx won't work, so skip anything smaller than lim / 100.
    int start = (len <= 2) ? 0 : (lim / 100);

    for (int num = start;num < lim;num++) {
        // Convert to string.
        std::stringstream ss;
        ss << std::setw(len) << std::setfill('0') << num;
        std::string num_s = ss.str();

        // Skip any consecutive digits.
        bool is_okay = true;
        auto prev_digit = num_s[0];
        for (int digit_idx = 1;digit_idx < num_s.length();digit_idx++) {
            auto digit = num_s[digit_idx];
            if (prev_digit == digit) {
                is_okay = false;
            }
            prev_digit = digit;
        }

        // Output result.
        if (is_okay) {
            cout << num_s << "\n";
        }
    }
}

int main(const int argc, const char * const argv[]) {
    noconsec(4);
}
#包括
#包括
#包括
使用名称空间std;
//因为C/C++仍然没有整数幂函数。
int ipow(int base,int exp){
int结果=1;
对于(;;){
if(exp&1)
结果*=基数;
exp>>=1;
如果(!exp)
返回结果;
基数*=基数;
}
}
void noconsec(常量内部长度){
int lim=ipow(10,len);
//例如len 4(lim 10000),
//显然00xx不起作用,所以跳过任何小于lim/100的值。

int start=(len也许你可以写一个递归过程?你学过这项技术吗?我在面试中尝试了一个递归函数,但我的大脑失败了。啊,很抱歉。但是,一种不用递归就可以做到这一点的方法,可能只需要迭代从0到10^(位数)的所有整数-1,然后测试每个号码。例如,当电话号码的长度为3时,您可以从0迭代到999,并注意每个号码如何对应一个唯一的3位电话号码序列(每个电话号码序列对应于其中一个3位数字).然后,只需测试每个数字。我也做了一些。我做了一个变量,保存值为10^lengthOfNum,而我做了(Idepth
指重现
solve()
的深度,这意味着它还表示我们目前已经决定了多少个数字(当前有多少个数字)。我正在将其标记为正确答案,因为它确实有效,但我不确定curr_seq如何知道如何分离每个数字。以下是程序在到达for循环时如何一步一步地为我工作。我将检查其是否为空或之前的数字是否与现在的数字不相同。然后,它将附加此数字并将其推送到数组中,以便首先他将是0。然后它将在下一个位置再次运行函数,如果它是3的大小,它将位于十个地方。或者在中间。在那里它会混淆。它将追加1到0,因此数组是{0,1}。我的问题是@望远镜每次运行相同的函数时都使用相同的向量,所以它不应该重复3次0123456789吗?它如何知道在字符串的第三位停止?