题目
写一个程序,输出从 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” ]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/fizz-buzz
自己写的普通方法,在非3、5倍数的时候赋值比较复杂,用了数字转字符串
//普通方法
//字符串反转(逆置)"abc"->"cba"
void Reverse(char* str)
{
int t;
int len = strlen(str);
for (int i = 0, j = len - 1; i < j; i++, j--)
{
t = str[i];
str[i] = str[j];
str[j] = t;
}
}
//数字转字符串
char* Myitoa(char* str, int n)
{
int i = 0;
while (n != 0)
{
str[i++] = n % 10 + '0';
n /= 10;
}
str[i] = '\0';
Reverse(str);
return str;
}
char** fizzBuzz(int n, int* returnSize)
{
*returnSize = n;
char** s = (char**)malloc(sizeof(char*) * n);
char tmp;
for (int i = 1; i <= n; i++)
{
if (i % 3 == 0 && i % 5 == 0)
{
s[i - 1] = (char*)malloc(9);
strcpy(s[i - 1], "FizzBuzz");
}
else if (i % 3 == 0)
{
s[i - 1] = (char*)malloc(5);
strcpy(s[i - 1], "Fizz");
}
else if (i % 5 == 0)
{
s[i - 1] = (char*)malloc(5);
strcpy(s[i - 1], "Buzz");
}
else
{
s[i - 1] = (char*)malloc(n + 1);
Myitoa(s[i - 1], i);
}
}
return s;
}
itoa函数在VS可以直接用,但在leecode貌似不行
实际上,有说明:itoa并不是一个标准的C函数,它是Windows特有的,如果要写跨平台的程序,请用sprintf。标准库中有sprintf,功能比这个更强,用法跟printf类似:char str[255];
sprintf(str, “%x”, 100); //将100转为16进制表示的字符串。
进阶一下,只把自己写的Myitoa函数换成sprintf
char** fizzBuzz(int n, int* returnSize)
{
*returnSize = n;
char** s = (char**)malloc(sizeof(char*) * n);
char tmp;
for (int i = 1; i <= n; i++)
{
if (i % 3 == 0 && i % 5 == 0)
{
s[i - 1] = (char*)malloc(9);
strcpy(s[i - 1], "FizzBuzz");
}
else if (i % 3 == 0)
{
s[i - 1] = (char*)malloc(5);
strcpy(s[i - 1], "Fizz");
}
else if (i % 5 == 0)
{
s[i - 1] = (char*)malloc(5);
strcpy(s[i - 1], "Buzz");
}
else
{
s[i - 1] = (char*)malloc(n + 1);
sprintf(s[i - 1], "%d", i);
}
}
return s;
}
评论区也有不使用strcpy,一直使用sprintf的操作
char** fizzBuzz(int n, int* returnSize)
{
char* fizz = (char*)malloc(sizeof("Fizz"));
char* buzz = (char*)malloc(sizeof("Buzz"));
char* fizzbuzz = (char*)malloc(sizeof("FizzBuzz"));
sprintf(fizz, "%s", "Fizz");
sprintf(buzz, "%s", "Buzz");
sprintf(fizzbuzz, "%s", "FizzBuzz");
char** res = (char**)malloc(sizeof(char*) * n);
*returnSize = n;
for (int i = 1; i <= n; i++)
{
if (i % 15 == 0)
res[i - 1] = fizzbuzz;
else if (i % 5 == 0)
res[i - 1] = buzz;
else if (i % 3 == 0)
res[i - 1] = fizz;
else
{
res[i - 1] = (char*)malloc(10);
sprintf(res[i - 1], "%d", i);
}
}
return res;
}