编程总结
每每刷完一道题后,其思想和精妙之处没有地方记录,本篇博客用以记录刷题过程中的遇到的算法和技巧

412. Fizz BuzzI
写一个程序,输出从 1 到 n 数字的字符串表示。
- 如果 n 是3的倍数,输出“Fizz”;
- 如果 n 是5的倍数,输出“Buzz”;
3.如果 n 同时是3和5的倍数,输出 “FizzBuzz”。
本题重点测试 sprintf函数和指向指针的指针的空间分配处理
char **fizzBuzz(int n, int* returnSize) {
int len = 0;
int in = n;
int i;
char **ret;
ret = (char**)malloc(sizeof(char*) * n); //分配n个指针,每个指针分别指向一个地址
*returnSize = n;
do {
len++;
in /= 10;
} while (in);
for (i = 1; i <= n; i++) {
// 0 不记录,从1开始记录
if (i % 3 == 0 && i % 5 == 0) {
ret[i - 1] = (char *)malloc(strlen("fizzfuzz") + 1);
sprintf(ret[i - 1], "%s", "FizzBuzz");
}
else if (i % 5 == 0) {
ret[i - 1] = (char *)malloc(strlen("Buzz") + 1);
sprintf(ret[i - 1], "%s", "Buzz");
}
else if (i % 3 == 0) {
ret[i - 1] = (char *)malloc(strlen("Fizz") + 1);
sprintf(ret[i - 1], "%s", "Fizz");
}
else {
ret[i - 1] = (char *)malloc(len + 1);
sprintf(ret[i - 1], "%d", i);
}
}
return ret;
}
14. 最长公共前缀

关键手法:横向扫描法
char *longestCommonPrefix(char **strs, int strsSize)
{
int i = 0, j = 0;
char *ret = (char *)malloc(sizeof(char) * (strlen(strs[0])+1)); // 细节啊,这里必须要分配多一个'\0'的空间才行.
int cnt = 0;
int flag = 0;
if (strsSize == 1) {
return strs[0];
}
// 横向扫描法,保持列不动,看字符串数组里多少个列为同字符.
// 遇到不同的字符即退出
for (j = 0; j < strlen(strs[0]); j++) {
for (i = 0; i < (strsSize - 1); i++) {
if (strs[i][j] != strs[i + 1][j]) {
flag = 1;
break; // 一个break只会跳出一层
}
}
if (flag == 0

本文分享了多项编程挑战的解决思路与算法技巧,包括FizzBuzz、最长公共前缀、无重复字符的最长子串等经典问题的实现,以及字符串处理、版本号比较和二进制手表等实用案例。
最低0.47元/天 解锁文章
1万+





