题目描述:
写一个程序,输出从 1 到 n 数字的字符串表示。
1. 如果 n 是3的倍数,输出“Fizz”;
2. 如果 n 是5的倍数,输出“Buzz”;
3.如果 n 同时是3和5的倍数,输出 “FizzBuzz”。
示例:
n = 15,
返回:
[
"1",
"2",
"Fizz",
"4",
"Buzz",
"Fizz",
"7",
"8",
"Fizz",
"Buzz",
"11",
"Fizz",
"13",
"14",
"FizzBuzz"
]
解题思路:没什么特别的,按部就班就行。
class Solution {
public:
vector<string> fizzBuzz(int n) {
vector<string> svec;
for(int i = 0; i < n ; i++){
if((i + 1) % 15 == 0){
svec.push_back("FizzBuzz");
} else if ((i + 1) % 5 == 0){
svec.push_back("Buzz");
} else if ((i + 1) % 3 == 0){
svec.push_back("Fizz");
} else {
svec.push_back(std::to_string(i + 1));
}
}
return svec;
}
};
class Solution {
public:
vector<string> fizzBuzz(int n) {
vector<string> c(n);
for(int i = 0; i < n; i++){
if( (i + 1) % 15 == 0 ){
c[i] += "FizzBuzz";
} else if( (i + 1 )% 5 == 0){
c[i] += "Buzz";
} else if( (i + 1 )% 3 == 0){
c[i] += "Fizz";
} else {
c[i] += to_string(i + 1);
}
}
return c;
}
};
/**
* Return an array of size *returnSize.
* Note: The returned array must be malloced, assume caller calls free().
*/
char** fizzBuzz(int n, int* returnSize) {
*returnSize = n;
char ** arrays;
arrays = (char *)malloc(sizeof(char *) *n);
char ch[n];
for(int i = 0; i < n; i++){
if((i + 1) % 15 == 0){
arrays[i] = strdup("FizzBuzz");
} else if((i + 1) % 5 == 0){
arrays[i] = strdup("Buzz");
} else if((i + 1) % 3 == 0){
arrays[i] = strdup("Fizz");
} else {
sprintf(ch, "%d", i + 1);
arrays[i] = strdup(ch);
}
}
return arrays;
}
技术要点:1.整数转化为字符串;2.strcpy,strdup函数的比较
总结:这道题的思路很简单,按照流程来就行。但是个人感觉,本题考察的重点是如何将一个整数转化为字符串,以及字符串中相关函数的用法等。有人说,居然还有这么水的题目,卤煮以为,一道看似简单的题目,里面可能蕴含着比较深刻的技术原理。在讨论区中大家可能会看到很多是使用了语言中自带的算法来解决问题,并不是说不好,但是对于技术人员来说,尤其是在自己做练习的时候,深入了解问题的本质非常重要。
对技术要点的介绍:1.整数转化为字符串(参考文献:https://www.cnblogs.com/rgvb178/p/5964498.html)
下面是int转string的几种思路:
(1)利用stringstream:
使用stringstream的时候要注意加#include"sstream"。比如说我要把int类型的23转为string类型,那么我可以这样实现:
1 2 3 4 |
|
(2)利用sprintf int->char[]
(3)利用itoa int->char[]
(4)利用to_string 。
2.strcpy.strdup函数的比较(参考文献:https://www.cnblogs.com/liulipeng/archive/2012/10/11/2720370.html)