编码/解码 ID 反转问题


Encode/Decode ID Reversal issue

  • 场景:

A( 您有一个100 charset,其中前characters A, B, C,后characters -, _

B( encode 函数返回一个长度为 10 的字符串。

C( encodenumber转换为charset中的相关number

示例:A == 0 || B == 1 || C == 2 || - == 98 || _ == 99

可能性数量:100 ^ 10 = 1e+20 || 100,000 Quadrillion || 100,000,000,000 Billion .

  • 问题:你如何判断999iii_i还是i_
  • 注意:上面概述的问题的解决方案应该适用于每种可能的情况

看起来像家庭作业...

让我们来看看我们的问题:

999 不能在我们的字符集中表示为单个字符我们可以用 3 种不同的方式对其进行编码

9 9

9 =>

I I I I

99 9 => _I

9 99 => I_

现在。。。单独的字符集不会进行编码...在这一点上,您可能应该阅读什么是"代码"......http://en.wikipedia.org/wiki/Code

请注意,这与加密完全无关...

所以。。。我们需要一个规则集来编码/解码我们的代码

既然我们应该制定这个规则集,那么我们就可以自由选择如何处理事情,只要我们记住我们必须遵守的其他关键规则......

代码长度应为 10 个字符...从我所看到的最大值来看,否则 III 不可能是我们代码的有效示例......啊所以让我们假设我们可以删除前导零,或者在这种情况下,并进一步假设 III 和 AAAAAAAIII 是相同的

现在我们有一个给定的事实,即我们的代码有 100^10 个可能的码字,只有当长度为 10 的字符集的每个组合都是有效的码字时,才能实现

所以这三个...三、I_和_I...必须是有效的码字...

这是否意味着这三个值都是 999?

短:否

长:

如前所述,需要一个规则集来赋予代码一个含义......

由于没有给出编码规则集,我们似乎可以自由创建一个......

让我们看一下对常规基数 10 个数字进行编码的规则集......

我们有一个从 0 到 9 -> 10 位数字的字符集

数字中数字的位置包含信息...

例如 123 可以写为 1*10^10 + 2*10^1 + 3*10^0

如果我们将其转移到我们的新编码中......让我们称之为基数 100 ...它看起来像这样:

123 -> 1*100^1 + 23*100^0

=> 1=B ...23=X => 123 -> BX

999 -> 9*100^1 + 99*100^0 -> I_

但是谁说我们必须将代码中最左边的数字声明为最重要的数字呢?

如果我们不这样解释呢?

99*100^0 + 9*100^1 = 999 不也是吗?

是的。。。因此,我们也可以将其写成_I...

现在哪一个是正确的?这仅取决于我们代码的规则集...如果它说最左边的数字是最重要的数字,答案是I_......如果最右边的数字是最重要的数字,答案是_I

只要没有指定编码的规则集,这个问题的答案就无法解决......您只能尝试进行有根据的猜测,并使用与我们"正常"的 base 10 编码相同的约定......最左边的数字 = 最高有效数字 -> I_

但请记住...这是一个猜测...如果我在测试中遇到这样的问题,我会解释为什么除非指定了编码规则,否则没有答案。

TLDR:

使用所提供的信息,如果它是i_或_i,这是一个自由选择