前言
到字符串部分了,主要用的就是双指针,我看了一下后面的part,字符串后面还有一个主要的双指针part。一分耕耘一分收获。
没有结果的日子都在努力扎根!
问题描述
字符串的这几部分都比较简单,中等难度的题也被我找到了好理解的方法去做,争取早点刷够题!
从理解程度上来说,这几个代码都比较好理解,没有陌生的内置方法。
代码分析
344题:
class Solution {
public void reverseString(char[] s) {
int left = 0;
int l = s.length;
int right = l-1;
for(;left < right; left++, right--){
char temp;
temp = s[left];
s[left] = s[right];
s[right] = temp;
}
}
}
541题最主要在于2*k的处理,其实题干需要多读一下,就是k个字符反转,下个k不动,继续下下个k反转。
class Solution {
public String reverseStr(String s, int k) {
char str[] = s.toCharArray();
for(int i = 0; i < str.length; i += 2*k){
if(i + k <= str.length){//等于的时候也可以继续算,因为有k个值
reverse(str, i, i+k-1);
continue;
}
reverse(str, i, str.length - 1);//i代表k个值开始的点,str.length-1代表结束的点。
}
return new String(str);
}
public void reverse(char s[], int i, int j){
char temp;
for(;i < j;i++,j--){
temp = s[i];
s[i] = s[j];
s[j] = temp;
}
}
}
剑指05题替换空格,可以用内置方法,也可以用双指针,但是双指针真的太长了,内置方法又太简单,折中吧。这个sb真好用,遇见好几次了。
class Solution {
public String replaceSpace(String s) {
if(s == null || s.length() == 0)
return s;
StringBuilder sb = new StringBuilder();
for(int i = 0; i < s.length(); i++) {
if (s.charAt(i) == ' ') {
sb.append("%20");
}
else {
sb.append(s.charAt(i));
}
}
return sb.toString();
}
}
这个151题是个很典型的双指针问题,此处双指针不是之前的left和right,而是index和right,从后面开始指,再正向遍历这个小字符串到sb里面存放。图片中的想法是看的LeetCode评论。
class Solution {
public String reverseWords(String s) {//双指针
StringBuilder sb = new StringBuilder();
int left = 0;
int right = s.length() - 1;
char str[] = s.toCharArray();
while(str[left] == ' ') left++;//排除头尾空格
while(str[right] == ' ') right--;
while(left <= right){
int index = right;//倒序反转
while(index >= left && str[index] != ' ') index--;
for(int i = index + 1;i <= right; i++)//遇到空格就停下,把index到right的字符给加进sb中
sb.append(str[i]);
if(index > left) sb.append(" ");//在sb中追加空格
while(index >= left && str[index] == ' ') index--;
right = index;
}
return sb.toString();
}
}
今天的刷题就结束了。