[豪の算法奇妙冒险] 代码随想录算法训练营第八天 | 344-反转字符串、541-反转字符串II、Carl54-替换数字
代码随想录算法训练营第八天 | 344-反转字符串、541-反转字符串II、Carl54-替换数字
LeetCode344 反转字符串
题目链接:https://leetcode.cn/problems/reverse-string/description/
文章讲解:https://programmercarl.com/0344.反转字符串.html
视频讲解:https://www.bilibili.com/video/BV1fV4y17748/?vd_source=b989f2b109eb3b17e8178154a7de7a51
挺简单的,使用双指针的思路,一头一尾相互交换元素即可完成字符串的倒置

class Solution {
public void reverseString(char[] s) {
int left = 0;
int right = s.length - 1;
while(left < right){
char temp = s[left];
s[left] = s[right];
s[right] = temp;
left++;
right--;
}
}
}
LeetCode541 反转字符串II
题目链接:https://leetcode.cn/problems/reverse-string-ii/description/
文章讲解:https://programmercarl.com/0541.反转字符串II.html
视频讲解:https://www.bilibili.com/video/BV1dT411j7NN/?vd_source=b989f2b109eb3b17e8178154a7de7a51
这题需要注意for循环遍历字符串时不是i++,而是i+=2*k
在一轮翻转中,首先先求第一个k的位置,如果 start+k > length,说明余下的不足k个,firstK = length,即将余下的全部进行翻转;如果 start+k <= length,则firstK = start+k,把start到firstK的这些字符进行翻转
然后求2k的位置,如果 start + 2*k > length,说明余下的不足2k个,secondK = length;如果 start + 2*k <= length,则secondK = start + 2*k。后续再进行判断,若firstK < secondK,则把firstK和secondK之间的所有字符加入result,这包含了“正常把k~2k之间的字符放入result”和“剩下的字符够k个但不够2k个,把k个翻转后,剩下的正常放入result”两种情况

class Solution {
public String reverseStr(String s, int k) {
int length = s.length();
StringBuilder result = new StringBuilder(length);
for(int start = 0; start < length; start += 2*k){
StringBuilder temp = new StringBuilder();
int firstK = 0;
if(start + k > length){
firstK = length;
}else{
firstK = start + k;
}
temp.append(s.substring(start, firstK));
result.append(temp.reverse());
int secondK = 0;
if(start + 2*k > length){
secondK = length;
}else{
secondK = start + 2*k;
}
if(firstK < secondK){
result.append(s.substring(firstK, secondK));
}
}
return result.toString();
}
}
卡码网54 替换数字
第一次解,使用的是StringBuilder

后面了解到后序处理的思想,就再用后序处理的方法重新做了一遍


浙公网安备 33010602011771号