You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何无法用IF/ELSE比较STR与INT及FizzBuzz问题解法

LeetCode FizzBuzz问题解决过程与类型错误分析

问题需求

给定整数n,创建一个列表,遵循以下规则生成元素:

  • 若数字同时被3和5整除,替换为"FizzBuzz"
  • 若数字仅被3整除,替换为"Fizz"
  • 若数字仅被5整除,替换为"Buzz"
  • 其余数字保持原值,最终所有元素转为字符串形式

示例:

  • n=3时返回["1","2","Fizz"]
  • n=5时返回["1","2","Fizz","4","Buzz"]

最初困境与错误原因

在最初实现时,用IF/ELSE语句替换符合条件的数字后,后续判断能否被5整除时触发了TypeError: not all arguments converted during string formatting错误。
原因是:当把整数替换为字符串(比如把3换成"Fizz")后,后续遍历到该元素时,尝试对字符串做取模运算(%)或者与整数比较,会因类型不匹配抛出错误——字符串无法和整数进行算术运算或直接比较。

低效解决方案

为了避开类型错误,先记录所有需要替换的元素,再循环替换对应位置的元素。虽然代码能运行,但多次遍历列表和元素查找导致效率较低:

def fizzbuzz(n):
    answer = []
    fizz_lst = []
    buzz_lst = []
    fizzbuzz_lst = []
    for i in range(n):
        answer.append(i+1)
        if answer[i] % 3 == 0 and answer[i] % 5 == 0:
            fizzbuzz_lst.append(answer[i])
        if answer[i] % 3 == 0:
            fizz_lst.append(answer[i])
        if answer[i] % 5 == 0:
            buzz_lst.append(answer[i])
        for i in range(len(fizzbuzz_lst)):
            if fizzbuzz_lst[i] in answer:
                ourindx = fizzbuzz_lst[i]
                answer[ourindx - 1] = "FizzBuzz"
        for i in range(len(buzz_lst)):
            if buzz_lst[i] in answer:
                ourindx = buzz_lst[i]
                answer[ourindx - 1] = "Buzz"
        for i in range(len(fizz_lst)):
            if fizz_lst[i] in answer:
                ourindx = fizz_lst[i]
                answer[ourindx - 1] = "Fizz"
    int_str = [str(x) for x in answer]
    return int_str

优化后的解决方案

调整思路:遍历列表时跳过已被替换为字符串的元素,仅对整数类型的元素进行IF/ELIF判断替换,从根源上避免类型不匹配的错误,同时减少不必要的操作,提升效率:

class Solution(object):
    def fizzBuzz(self, n):
        answer = []
        for i in range(n):
            answer.append(i + 1)
        for every_iter in answer:
            if type(every_iter) != int:
                continue
            elif every_iter % 3 == 0 and every_iter % 5 == 0:
                answer[every_iter-1] = "FizzBuzz"
            elif every_iter % 3 == 0:
                answer[every_iter-1] = "Fizz"
            elif every_iter % 5 == 0:
                answer[every_iter-1] = "Buzz"
        answer_str = [str(j) for j in answer]
        return answer_str

内容的提问来源于stack exchange,提问作者Deniz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 09:01:09