344.反转字符串
这道题双指针太简单了,没什么好说的。
class Solution {
public void reverseString(char[] s) {
int i = 0;
int j = s.length - 1;
while(i <= j){
char temp = s[i];
s[i] = s[j];
s[j] = temp;
i++;
j--;
}
}
}
541. 反转字符串II
这道题做的时候思路混乱,现在弄清了。
由于所有字符在计算机层都是使用二进制表示, 对于"变量"仍可以用上位运算.在掌握异或运算符的概念和运算意义之后, 就可以写出来了.
我们使用异或的方式来交换字符串。
class Solution {
public String reverseStr(String s, int k) {
int i = 0;
char[] ch = s.toCharArray();
for(; i < ch.length; i += 2 * k){
int start = i;
//这里是判断尾数够不够k个来取决end指针的位置
int end = Math.min(ch.length - 1, start + k - 1);
//用异或运算反转
while(start < end){
ch[start] ^= ch[end];
ch[end] ^= ch[start];
ch[start] ^= ch[end];
start++;
end--;
}
}
return new String(ch);
}
}
剑指Offer 05.替换空格
这题太简单,没啥可说的。
class Solution {
public String replaceSpace(String 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.翻转字符串里的单词
class Solution {
public String reverseWords(String s) {
String[] st = s.trim().split(" ");
StringBuilder sb = new StringBuilder();
for(int i = st.length - 1;i >= 0;i--){
if(st[i] == "") continue;
if(i == 0){
sb.append(st[i]);
}else{
sb.append(st[i]);
sb.append(" ");
}
}
return sb.toString();
}
}
剑指Offer58-II.左旋转字符串
该题思路有意思,进行局部反转,之后再全部反转得到目标值。
class Solution {
public String reverseLeftWords(String s, int n) {
char[] ch = s.toCharArray();
reverse(ch,0,n - 1);
reverse(ch,n,s.length() - 1);
reverse(ch,0,s.length() - 1);
return new String(ch);
}
public void reverse(char[] ch,int i, int j){
while(i < j){
ch[i] ^= ch[j];
ch[j] ^= ch[i];
ch[i] ^= ch[j];
i++;
j--;
}
}
}