Write a program that outputs the string representation of numbers from 1 to n.
But for multiples of three it should output “Fizz” instead of the number and for the multiples of five output “Buzz”. For numbers which are multiples of both three and five output “FizzBuzz”.
- My train of thought:
这个题目看起来特别简单,不过脑子一样5分钟写完,直接看我的笨蛋解法好了。
#include<stdio.h>
#include<iostream>
#include<string>
#include<vector>
using namespace std;
int main()
{
int n;
vector<string>output;
string s;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
s=to_string(i);
if(i%3==0&&i%5!=0)
output.push_back("Fizz");
else if(i%5==0&&i%3!=0)
output.push_back("Buzz");
else if(i%3==0&&i%5==0)
output.push_back("FizzBuzz");
else output.push_back(s);
}
for(vector<string>::iterator iter=output.begin();iter!=output.end();++iter)
{
cout<<*iter<<endl;
}
}
这个解法实在是没什么好讲的,不过to_string()这个C11的新特性非常好用,可以方便的转换数字为字符串。
但前提是你的编译器要支持GCC-4.7及以上版本。很不巧的是我一直在用的DEV-CPP只有GCC-4.6.2, 于是乎,我先是下载了GCC-5.01准备自己安装上去,结果好像有点点麻烦,就放弃了,直接去下载了DEV-CPP 5.11 with GCC-4.9.2(下载地址:https://sourceforge.net/projects/orwelldevcpp/files/?source=navbar),安装完之后,记得右上角要勾选gcc-4.9.2
还有一小步不能忘,单击,工具->编译选项,如图所示,勾选“编译时加入以下命令”,然后复制粘贴“-std=c++11”
这个解法乍一看问题不大,但是足足跑了9ms(your runtime beats 4.26% of cpp submissions)非常悲剧,还是看一下优解吧。
- Better solution
class Solution {
public:
vector<string> fizzBuzz(int n) {
vector<string>output(n);
for(int i=1;i<=n;i++)
{
if(i%3==0)
output[i-1]+=string("Fizz");
if(i%5==0)
output[i-1]+=string("Buzz");
if(output[i-1]=="")
output[i-1]+=to_string(i);
}
return output;
}
};
注意,如果要直接使用output[i],那么在初始化vector的时候就需要定义好容器大小,vectoroutput(n),否则编译不通过。
还有一个百思不得其解的疑问,就是为什么最后一句output[i-1]+=to_string(i);如果换成output[i-1]=to_string(i);编译速度几乎就是慢了一倍,从3ms变成6ms,希望如果有人看到这个问题可以解答。