C++ FizzBuzz实现中vector push_back()元素被覆盖问题排查
问题分析与解决
嘿,这个问题其实一眼就能看穿——你在条件判断的时候用错变量啦!
核心错误
你代码里的条件判断用的是输入参数n,而不是循环里的当前数字i:
// 你的错误判断(误用了n) if (n % 15 == 0) os.push_back("FizzBuzz"); else if (n % 3 == 0) os.push_back("Fizz"); else if (n % 5 == 0) os.push_back("Buzz");
而FizzBuzz的核心逻辑,是要对循环中的每个i(从1到n的每一个数字)做判断,就像你给出的正确代码那样:
// 正确的判断(用循环变量i) if(i%3==0 && i%5==0) ans.push_back("FizzBuzz"); else if(i%3==0) ans.push_back("Fizz"); else if(i%5==0) ans.push_back("Buzz");
为什么会出现“所有元素被覆盖”的现象
- 当
n=15时,n%15==0是永远成立的,所以循环的每一次都会执行push_back("FizzBuzz"),最终容器里全是这个字符串; - 当
n=3时,n%3==0永远成立,所以每次都添加"Fizz"; - 当
n=4时,n%15、n%3、n%5都不成立,所以每次都会执行push_back(to_string(i)),这时候看起来结果是对的,但完全是巧合——比如你测试n=5的话,你的代码会输出全["Buzz"],这就明显不对了。
修正后的代码
只需要把条件里的n全部换成i就可以正常运行了:
class Solution { public: vector<string> fizzBuzz(int n) { vector<string> os; for (int i = 1; i <= n; i++) { if (i % 15 == 0) os.push_back("FizzBuzz"); else if (i % 3 == 0) os.push_back("Fizz"); else if (i % 5 == 0) os.push_back("Buzz"); else os.push_back(to_string(i)); } return os; } };
内容的提问来源于stack exchange,提问作者Nimitz
相关产品推荐
相关产品推荐

