344. 反转字符串
这题用双指针丝滑pass
class Solution {
public void reverseString(char[] s) {
int right = s.length - 1;
int left = 0;
while(left <= right){
char tmp = s[left];
s[left] = s[right];
s[right] = tmp;
left++;
right--;
}
}
}
541. 反转字符串 II
看到题目的第一感觉就是使用双指针,但当代码实现时发现并没有完全理解题目的意思,我以为题意时只处理字符串大小为 (k < string < 2k || string < k)
这两种情况。
但实际题意为每隔 2k个字符就翻转前k个字符 在这种情况下就需要对左右指针进行泛化处理,left = i; right = i + k -1;
class Solution {
public void swap(char[] str, int left, int right){
while(left < right){
char tmp = str[left];
str[left] = str[right];
str[right] = tmp;
left++;
right--;
}
}
public String reverseStr(String s, int k) {
char[] str = s.toCharArray();
int left;
int right;
for(int i = 0; i < str.length; i += 2*k){
if(str.length >= i + k){
left = i;
right = i + k - 1;
swap(str, left, right);
continue;
}
left = i;
right = str.length - 1;
swap(str, left, right);
}
return new String(str);
}
}
剑指 Offer 05. 替换空格
-
自己的解法:
另开一个StringBuilder存储新的字符串,将空格处替换为%20 -
遇到的困难
对StringBuilder的一些方法理解不透彻如:append 和 insert的区别
Append是直接从尾端插入,Insert为指定位置插入
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();
}
}
-
代码随想录双指针解法
花了很多时间在debug上
重点看动画,理解双指针
替换空隔
我原来写的,报数组下标越界错误
for(char x: s.toCharArray()){
if(x == ' ') sb.append(" ");
}
答案写的
for (int i = 0; i < s.length(); i++) {
if(s.charAt(i) == ' '){
sb.append(" ");
}
}
最终代码
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(" ");
}
}
if(sb.length() == 0){
return s;
}
int left = s.length() - 1;
s += sb.toString();
int right = s.length() - 1;
char[] ch = s.toCharArray();
while(left >= 0){
if(ch[left] == ' '){
ch[right--] = '0';
ch[right--] = '2';
ch[right] = '%';
}else{
ch[right] = ch[left];
}
left--;
right--;
}
return new String(ch);
}
}
151. 反转字符串中的单词
- 自己的方法
1)利用.trim()
去掉首位空格,然后再用split(" ")
根据空格划分成数组
2)倒叙逐个插入单词。
class Solution {
public String reverseWords(String s) {
String[] str = s.trim().split(" ");
StringBuilder sb = new StringBuilder();
for(int i = str.length - 1; i >=0; i--){
if(str[i].equals("")) continue;
sb.append(str[i] + " ");
}
return sb.toString().trim();
}
}
-
双指针法
重点看动画演示
-
遇到的困难
对
String.substing()
中的endIndex不太理解 -
收获
substring(beginIndex, endIndex) 为左闭右开
class Solution {
public String reverseWords(String s) {
StringBuilder res = new StringBuilder();
s = s.trim();
int i = s.length() - 1;
int j = i;
while(i >= 0){
while(i>=0 && s.charAt(i) != ' ') i--;
res.append(s.substring(i+1,j+1) + " ");
while(i >= 0 && s.charAt(i) == ' ') i--;
j = i;
}
return res.toString().trim();
}
}
剑指Offer58-II.左旋转字符串
利用String中的substring方法丝滑解题
class Solution {
public String reverseLeftWords(String s, int n) {
if(s == null || s.length() == 0
|| s.length() == 1 || n >= s.length()) return s;
String end = s.substring(0,n);
String begin = s.substring(n,s.length());
s = begin + end;
return s;
}
}