字符串章节类似于数组章节,但是又有略微不同。今天的题目分别是LeetCode.344反转字符串和LeetCode.541反转字符串Ⅱ。
LeetCode.344反转字符串

对于本题,如果仔细学习和思考了代码随想录前面的内容,并且结合题目描述,空间复杂度为O(1),是比较容易想到解决办法的。在看到这道题的时候,第一反应会想到使用双指针法,进而思考使用快慢指针还是使用对撞指针,因为本题需要我们反转字符串,将最前面和最后面的元素进行互换,然后向中心靠近,继续互换,所以自然而然想到对撞指针。
public static void reverseString(char[] s){
for (int i = 0,j=s.length-1; i < s.length/2; i++;j--) {
char temp=s[i];
s[i]=s[j];
s[j]=temp;
}
}
本题代码十分简洁。主要思路是,一个指针指向第一个元素,另一个指向最后一个元素,将其互换后,将两个指针分别向中间移动,继续互换,重复该操作。注意的点有三个,分别是循环条件,奇偶区分,以及for循环的写法。第一点,循环条件。这里的循环条件到数组长度一半处就可以停止,如果到数组末尾再结束,会将数组元素交换两遍,最后将返回原数组。第二点,奇偶的区分。这里其实可以不用特别区分数组长度是奇数还是偶数,因为如果数组元素有偶数个,刚好可以两两交换,如果数组元素为奇数个,那么两两交换剩下最中间那个元素,交换之后那个位置仍为该元素,所以该位置的元素交换与否并不重要。第三点是for循环的写法,注意多个变量时的写法。
LeetCode541.反转字符串Ⅱ

本题有点像上一道题,但是在上一道题的基础上,添加了很多新的要求。在第一次看这道题目的时候,我按照题干模拟了一遍,但是提交代码后有一个测试用例没有通过,那个测试用例字符串较长,k的值也较大,导致我也没办法去调试找问题。之后在看过本题的评论和讲解后,彻底明白本题的意思:反转k个,跳过k个,或者说每隔k个反转k个,最后不足k个全部反转。
public static String revs(String s,int start,int end){
char[] chars =s.toCharArray();
for (int i = start,j=end; i <=(start+end)/2 ; i++,j--) {
char temp=chars[i];
chars[i]=chars[j];
chars[j]=temp;
}
return new String(chars);
}
public static String reverseStr(String s,int k){
for (int i = 0; i < s.length(); i=i+2*k) {
if (s.length()-i<k) {
s=revs(s,i,s.length()-1);
}else {
s=revs(s, i, i + k-1);
}
}
return s;
}
这里一共定义了两个函数,第一个用于字符串的翻转,第二用于实现翻k跳k的逻辑。在revs()函数中,代码逻辑和上一题几乎完全一样,不过这里另外添加了反转起点和反转终点,我习惯的是左闭右闭的区间,所以就是反转时包括start和end。reverseStr()函数中,注意for循环中的表达式,因为翻k后需要跳k,所以一翻一跳为一次循环。在每次循环后需要判断是否不足k个,如果不足k个,将end参数设置为数组最后一个元素的下标。如果不是,则注意数组下标的对应,可以适当举一些实例来辅助思考。
7896

被折叠的 条评论
为什么被折叠?



