字节青训营题目之神奇数字组合 | 豆包MarsCode AI刷题

129 阅读2分钟

分类:方向一:学习方法与心得-题目解析

问题描述

小R发现了一个神奇的字符串 S,这个字符串的长度为 N,仅包含两种数字:“1”和“2”。这两个数字非常神奇,因为它们可以通过不同的大小写转换成对应的英文单词:“one”和“two”。

例如,数字“1”可以对应于“one”、“One”、“ONe”等形式,数字“2”可以对应于“two”、“Two”、“tWo”等形式。现在小R需要计算从字符串 S 中可以生成的不同字符串的总数量。

你需要帮助小R找到这个数量,并返回结果。

例如:当 N = 1 且 S = "2" 时,字符串 S 可以表示为以下 9 种不同的形式:"2""two""Two""tWo""twO""TWo""TwO""tWO""TWO"。因此,总数量为 9

思路分析

这道题考查的是字符串的基本操作。在编程和算法的世界中,字符串处理是一个永恒的主题。它不仅涉及到基础的字符串操作,还可能涉及到复杂的模式匹配、文本处理等高级技巧。

这道题的其实应该归为简单题,但是乍一看比较绕。数字又有1又有2的,排列顺序也不同。但是细心看的话,1和2这两个数字所对应的英文单词长度都是3,因此,每个数字都有9种可能的转换方式(2的三次方+1),因此对于长度为N的字符串,总的组合数就是9^N。这是一个非常简单直接的解决方案,但它的可扩展性较差,因为它直接依赖于字符串的长度。因此,可扩展性比较强的写法是2**len(string)+1

不过针对这个问题,我们可以使用字典来更快速地解决这个问题。把每个数字对应的长度写成字典,这样可以避免幂运算。虽然对编程不太友好,但是数字比较少,是完全可以接受的。用python实现起来也不算难。为了减少变量,我们可以对字符串中的字符进行遍历,而不是对字符的下标进行遍历。

代码实现

def solution(N: int, S: str) -> int:
    # 定义字符“1”和“2”的转换可能数
    conversions = {
        '1': 9,  # 1 有 9 种可能
        '2': 9   # 2 有 9 种可能
    }
    
    # 初始化总组合数为1
    total_combinations = 1
    
    # 遍历字符串 S 中的每个字符,计算总的可能组合数
    for char in S:
        if char in conversions:
            total_combinations *= conversions[char]
    
    return total_combinations

if __name__ == '__main__':
    print(solution(N=1, S="2"))  # 输出 9
    print(solution(N=2, S="12"))  # 输出 81
    print(solution(N=3, S="121"))  # 输出 729

最后,提交这个Python代码,运行测试用例和官方用例,全部可以测试通过。