目录
前言
hello,大家好,这篇博客我们来继续分享LeetCode 20天算法刷题计划(点击跳转LeetCode20天算法刷题计划)第四天的两道题目。用到的知识点还是双指针。闲言少叙,让我们开始吧。
1. 344 反转字符串
1.1 题目链接
https://leetcode-cn.com/problems/reverse-string/
1.2 题目描述
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。你可以假设数组中的所有字符都是 ASCII 码表中的可打印字符。
1.3 题目分析
这道题目是字符串反转,其实我们思考一下可以发现,所谓的反转,就是将第一个字符与最后一个字符互换位置,第二个字符与倒数第二个字符互换位置,以此类推。所以,我们可以想到,这道题目可以用双指针来实现,最后变成两个元素的位置的交换。
动画演示如下:
1.4 代码实现
void swap(char *a, char *b) {
char t = *a;
*a = *b, *b = t;
}
void reverseString(char *s, int sSize) {
for (int left = 0, right = sSize - 1; left < right; ++left, --right) {
swap(s + left, s + right);
}
}
1. 557 反转字符串中的单词III
2.1 题目链接
https://leetcode-cn.com/problems/reverse-words-in-a-string-iii/
2.2 题目描述
给定一个字符串,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。
2.3 题目分析
这道题和上一道题目类似,但是难度比上一道题目更大,因为我们要反转的是单词,而不是字母。空格是这道题解决的一个重要突破口。我们知道单词是以空格划分的,如果我们开辟出一块与原字符串等大的空间,然后用指针遍历原字符串,遇到空格后就代表一个单词结束,然后把该单词放到新开辟的空间的对应末未,这样一次找到每一个单词,也就完成了语句的逆序。
2.4 代码实现
char* reverseWords(char* s) {
int length = strlen(s);
char* ret = (char*)malloc(sizeof(char) * (length + 1));
ret[length] = 0;
int i = 0;
while (i < length) {
int start = i;
while (i < length && s[i] != ' ') {
i++;
}
for (int p = start; p < i; p++) {
ret[p] = s[start + i - 1 - p];
}
while (i < length && s[i] == ' ') {
ret[i] = ' ';
i++;
}
}
return ret;
}
后记
好的,今天我们的博文就分享到这里啦,希望对大家有所帮助。日拱一卒,继续努力。