【问题标题】:Convert a two-letter String to a 3-digit number将两个字母的字符串转换为 3 位数字
【发布时间】:2021-06-05 17:54:13
【问题描述】:

我正在处理一个软件问题,我发现自己需要将 2 个字母的字符串转换为 3 位数字。我们只讨论英文字母(26 个字母)。

所以基本上我需要将 AA、AR、ZF、ZZ 等转换为 0-999 范围内的数字。 我们有 676 个字母和 1000 个数字的组合,因此涵盖了范围。 现在,我可以手动写一张地图,说 AA = 1、AB = 2 等等,但我想知道是否有更好、更“数学”或“逻辑”的解决方案。 数字的顺序当然无关紧要,只要从字母到数字的转换是唯一的并且总是产生相同的结果。

转换应该双向进行(从字母到数字以及从数字到字母)。

有人有想法吗? 非常感谢

【问题讨论】:

    标签: algorithm logic data-conversion


    【解决方案1】:

    将 A-Z 视为以 27 为底的 1-26,其中 0 保留为空白。

    例如'CD' -> 3 * 27 + 4 = 85

    85 -> 85 / 27, 85 % 27 = 3, 4 = C, D

    【讨论】:

    • ...或使用基数 26 并将 0 设为“A”。我更喜欢前者,所以带有前导 As 的字符串是有区别的。
    【解决方案2】:

    如果您不必使用连续数字,则可以将两个字母的字符串视为基于 36 的数字。因此,您可以使用 int 函数将其转换为 Integer。

    int('AA', 36)  # 370
    int('AB', 36)  # 371
    #...
    int('ZY', 36)  #  1294
    int('ZZ', 36)  #  1295
    

    至于如何将数字转回字符串,可以参考How to convert an integer to a string in any base?上的方法

    @furry12 因为第一个数字和最后一个数字之间的差异是 1295-370=925

    def str2num(s):
      return int(s, 36) - 300
    
    print(str2num('AA')) # 70
    print(str2num('ZZ')) # 995
    
    

    【讨论】:

    • 感谢您的回答!这会很好用,但是对于“更高”的字母,它会超出范围(对于 ZZ,结果是 1295,我需要的范围是 0-999)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-01
    • 1970-01-01
    • 2017-02-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多