当前位置: 首页 > 知识库问答 >
问题:

最短字符串,用于尝试所有3位锁

丰超
2023-03-14

在最近的一次采访中,有人问我这个问题。一个三位数锁的键值可以在“000”-“999”之间。所以基本上必须尝试1000个组合才能打开锁。所以我必须生成最短的字符串,以便检查所有可能的组合(即“000”-“999”之间)。因此,例如,如果我们有字符串“01234”,那么它会检查组合“012”、“123”和“234”。所以我必须生成一个字符串来检查所有组合。我尝试使用哈希集来实现这一点,我从“000”开始,然后取字符串中的最后两个字符,即“00”,然后附加一个从0到9的新数字并检查它是否存在于哈希集中。如果不是,我将该数字附加到输出字符串并重复该过程。有没有其他有效而干净的方法来解决这个问题。

共有1个答案

伯建安
2023-03-14

您描述的过程是基于最短字符串的每个代码都只有一次的假设。事实证明这个假设是正确的。这是一个简单的回溯实现(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

这个程序很有效。

 类似资料:
  • 问题内容: 我正在尝试从Java字符串中找到所有三个字母子字符串。 例如,从字符串“ example string”中,我应该得到“ exa”,“ xam”,“ amp”,“ mpl”,“ ple”,“ str”,“ tri”,“ rin”,“ ing”。 我尝试使用Java正则表达式“([[a-zA-Z]){3}”,但仅得到“ exa”,“ mpl”,“ str”,“ ing”。 有人可以告诉我

  • 问题内容: 显然,它不是根据长度来比较它们,而是通过编码来比较它们。但是,我不知道它是如何工作的。我需要一些解释:-) 问题答案: 字符串按字典顺序进行比较。即逐个字符,直到它们不相等或没有要比较的字符为止。“11”的首字符小于“ 3”的首字符。 如果我们使用字母,则因为不小于,不小于,但是由于小于,小于。 您可以将字符串显式转换为数字:

  • 在这个问题之前,我先要说明一个事实,那就是我学习编程才一个月,而这个学校的作业却把我难住了。具体地说,它是摩尔斯电码到英语翻译器(反之亦然)...这是我被困住的部分:

  • 你们又听见有吩咐古人的话,说:“不可背誓,所起的誓,总要向主谨守”。只是我告诉你们,什么誓都不可起,不可指着天起誓,因为天是神的座位。不可指着地起誓,因为地是他的脚蹬,也不可指着耶路撒冷起誓,因为耶路撒冷是大君的京城。又不可指着你的头起誓,因为你不能使一根头发变黑变白了。你的话,是,就说是。不是,就说不是。若再多说,就是出于那恶者。(Matthew 5:33-37) 字符串(3) 字符串是一个话题

  • 我正在做一个程序,用户给我一个10行或更少的数组,可以检查是否有少于x个字符的行(由用户给出x)。。。现在我所有的都是这个,但我不确定什么不起作用。任何解释方面的帮助都将不胜感激! 输入应为: ie数组=('hi my name is'、'rick'、'23') 插入字符数: 输入-5 输出-'rick','23' 基本上,我希望它列出的所有行的字符都少于用户提供的值。

  • 问题内容: 在Java中,迭代字符串中所有字符的最快方法是: 或这个: 编辑: 我想知道的是,在长时间的迭代过程中重复调用该方法的开销是否小于或大于在开始时执行一次单次调用然后在迭代过程中直接访问数组的开销。 如果有人能够针对不同的字符串长度提供可靠的基准测试,那将是非常不错的,同时考虑到JIT的预热时间,JVM的启动时间等,而不仅仅是两个调用之间的区别。 问题答案: 在我的AMDx64 8cor