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