编程总结
在专栏日刻一诗中有初级关于字符串处理函数的介绍,而本专栏强化学习是进阶篇,将记录一些刷题实际遇到的“坑”
541. 反转字符串 II
void swap(char *a, char *b) {
char tmp = *a;
*a = *b, *b = tmp;
}
void reverse(char *l, char *r) {
while (l < r) {
swap(l++, r--);
}
}
char *reverseStr(char *s, int k)
{
int n = strlen(s);
int resNum = n;
for (int i = 0; i < n; i += 2 * k) {
resNum = n - i;
if (resNum < k) {
reverse(&s[i], &s[n - 1]); // 注意这里的减1,我们 reverse函数是直接操作下标
}
else if (resNum >= 2 * k) {
reverse(&s[i], &s[i + k - 1]); // 注意这里的减1,我们 reverse函数是直接操作下标
}
else if (resNum < 2 * k && resNum >= k) { // 注意这里的减1,我们 reverse函数是直接操作下标
reverse(&s[i], &s[i + k - 1]);
}
}
return s;
}
思路, LeetCode 的题一定要有一个统筹的观念,起初做这题时,一直陷入在各个条件的判断中,衍生了很多不必要的操作代码
下面这两个函数处理手法也可以记住:
// 交换
void swap(char *a, char *b) {
char tmp = *a;
*a = *b, *b = tmp;
}
// 反转
void reverse(char *l, char *r) {
while (l < r) {
swap(l++, r--);
}
}
1071. 字符串的最大公因子
解题思路 如果两个字符串之间存在最大公因子:
(1) 短串一定是和在长串的前strlen(短串)字符组成的子串相同;
(2) 长串不断减去短串,得到的两个字符串(原有短串和差串)同样满足(1)中关系;
(3) 当等到的两个串相同时,即为最大公因子。
char *gcdOfStrings(char *str1, char *str2)
{
char *lger = strlen(str1) > strlen(str2) ? str1 : str2;
char *sher = strlen(str1) > strlen(str2) ? str2 : str1;
if (strcmp(lger, sher) == 0) {
return sher;
}
if (strncmp(lger, sher, strlen(sher)) != 0) {
return "";
}
// +strlen(sher) 指针后移sher的长度,去到lger中后半段
return gcdOfStrings(lger + strlen(sher), sher);
}