执行结果:通过
执行用时和内存消耗如下:
char* largestGoodInteger(char* num) {int n = strlen(num);char* res = NULL;for (int i = 0; i < n - 2; ++i) {if (num[i] == num[i + 1] && num[i + 1] == num[i + 2]) {if (res == NULL || strncmp(&num[i], res, 3) > 0) {res = &num[i];}}}char* res2 = (char *)malloc(4);memset(res2, 0, 4);if (res == NULL) {return res2;}strncpy(res2, res, 3);return res2;
}
解题思路:
- 计算字符串长度:
- 使用
strlen(num)
计算输入字符串num
的长度,并将其存储在变量n
中。
- 使用
- 初始化结果指针:
- 使用
char* res = NULL
初始化一个指针res
,用于存储找到的最大好三位连续子串的起始位置。
- 使用
- 遍历字符串:
- 使用一个
for
循环遍历字符串,循环变量i
从 0 到n - 3
(因为我们需要检查三个连续字符,所以确保i + 2
不会超出字符串长度)。 - 在每次迭代中,检查当前字符
num[i]
是否与它的下一个字符num[i + 1]
和下下个字符num[i + 2]
相同。
- 使用一个
- 更新最大好三位连续子串:
- 如果找到了一个好三位连续子串(即
num[i] == num[i + 1] && num[i + 1] == num[i + 2]
),则检查当前子串是否大于之前找到的子串(如果有的话)。 - 使用
strncmp(&num[i], res, 3)
比较当前子串和之前找到的子串。如果res
是NULL
(即还没有找到任何好三位连续子串)或者当前子串字典序大于res
指向的子串,则更新res
为当前子串的起始位置。
- 如果找到了一个好三位连续子串(即
- 准备返回结果:
- 使用
malloc
分配一个长度为 4 的字符数组res2
(3 个字符用于存储最大好三位连续子串,1 个字符用于字符串结束符\0
)。 - 使用
memset
将res2
初始化为全零,确保字符串以\0
结尾。 - 如果
res
是NULL
(即没有找到任何好三位连续子串),则直接返回res2
(此时res2
是一个空字符串)。
- 使用
- 复制并返回结果:
- 如果找到了好三位连续子串(即
res
不是NULL
),则使用strncpy
将res
指向的子串复制到res2
中。 - 返回
res2
,它包含了找到的最大好三位连续子串。
- 如果找到了好三位连续子串(即
注意事项
- 分配的内存
res2
需要在函数外部适当地释放,以避免内存泄漏。 - 该函数假设输入字符串
num
是有效的,并且至少包含 3 个字符。 - 如果没有找到任何好三位连续子串,函数返回一个包含空字符串的新分配内存。调用者需要负责释放这个内存。