为何无法用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
相关产品推荐
相关产品推荐

