尝试所有 3 位数字锁的最短字符串
Posted
技术标签:
【中文标题】尝试所有 3 位数字锁的最短字符串【英文标题】:Shortest string to try all 3 digit lock 【发布时间】:2015-10-13 20:06:45 【问题描述】:我在最近的一次采访中被问到这个问题。三位数锁的密钥值可以在“000”-“999”之间。所以基本上必须尝试 1000 种组合才能打开锁。所以我必须生成最短的字符串,以便检查所有可能的组合(即“000”-“999”之间)。例如,如果我们有字符串“01234”,那么它将检查“012”、“123”和“234”的组合。所以我必须生成一个字符串来检查所有组合。我尝试使用哈希集来实现这一点,我从“000”开始,然后取字符串中的最后两个字符,即“00”,然后附加一个从 0 到 9 的新数字,并检查它是否存在于哈希集中。如果不是,我将该数字附加到输出字符串并重复该过程。有没有其他有效和干净的方法来解决这个问题。
【问题讨论】:
en.wikipedia.org/wiki/De_Bruijn_sequence(文末有python程序) 除非那份工作是在一个非常特定的环境中,否则这对我来说似乎是一个奇怪的面试问题。这不是一个在几分钟内想出的简单算法,所以问题只是测试你是否在教育的某个阶段偶然发现了这个概念。当然,组合学也有实际应用,所以如果工作涉及该领域,我想看看申请人是否认识这种模式可能会很有趣。 (虽然你可以直接问:)) 是的,De_Bruijn-sequence 看起来确实类似于问题陈述。谢谢 【参考方案1】:您描述的过程是基于这样的假设,即最短的字符串每个代码都只有一次。事实证明,这个假设是正确的。 这是一个简单的回溯实现(C++):
#include <stdio.h>
bool used[1000];
int digits[33333];
bool backtrack(int index, int total)
if (total == 1000)
printf("%d\n", index);
for (int i = 0; i < index; ++i)
printf("%d", digits[i]);
printf("\n");
return true;
for (int d = 0; d < 10; ++d)
int prev = 100*digits[index-2]+10*digits[index-1]+d;
if (!used[prev])
digits[index] = d;
used[prev] = true;
if (backtrack(index+1, total+1))
return true;
used[prev] = false;
int main(void)
digits[0] = 0;
backtrack(2, 0);
return 0;
输出:
1002
00010020030040050060070080090110120130140150160170\
18019021022023024025026027028029031032033034035036\
03703803904104204304404504604704804905105205305405\
50560570580590610620630640650660670680690710720730\
74075076077078079081082083084085086087088089091092\
09309409509609709809911121131141151161171181191221\
23124125126127128129132133134135136137138139142143\
14414514614714814915215315415515615715815916216316\
41651661671681691721731741751761771781791821831841\
85186187188189192193194195196197198199222322422522\
62272282292332342352362372382392432442452462472482\
49253254255256257258259263264265266267268269273274\
27527627727827928328428528628728828929329429529629\
72982993334335336337338339344345346347348349354355\
35635735835936436536636736836937437537637737837938\
43853863873883893943953963973983994445446447448449\
45545645745845946546646746846947547647747847948548\
64874884894954964974984995556557558559566567568569\
57657757857958658758858959659759859966676686696776\
78679687688689697698699777877978878979879988898999\
00
程序是有效的。
【讨论】:
以上是关于尝试所有 3 位数字锁的最短字符串的主要内容,如果未能解决你的问题,请参考以下文章