文章目录
- 334.反转字符串
- 541.反转字符串II
- 151.反转字符串中的单词
- 剑指offer 05.替换空格
- 剑指offer58-II.左旋转字符串
- 解题方法
- 题目思路
- 示例代码
- 总结
解题思路
1.334.反转字符串 解题思路
双指针左右交换
代码如下(示例):
class Solution {
public void reverseString(char[] s) {
int left = 0;//左指针
int right = s.length-1; //右指针
while(left < right){ //位移运算符的交换
s[left] ^= s[right];
s[right] ^= s[left];
s[left] ^= s[right];
left++;
right--;
}
}
}
2.541.反转字符串II 解题思路
题目意思是每2k个反转前k个,尾数不够k个则把剩余的全部反转
代码如下(示例):
class Solution {
public String reverseStr(String s, int k) {
char[] ch = s.toCharArray();
for(int i = 0; i < ch.length; i += 2 * k){ //i每次走2k位
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);
}
}
3.反转字符串中的单词 解题思路
首先去除空格,然后反转整个字符串,再反转每个单词
代码如下(示例):
class Solution {
/**
* 不使用Java内置方法实现
* <p>
* 1.去除首尾以及中间多余空格
* 2.反转整个字符串
* 3.反转各个单词
*/
public String reverseWords(String s) {
// System.out.println("ReverseWords.reverseWords2() called with: s = [" + s + "]");
// 1.去除首尾以及中间多余空格
StringBuilder sb = removeSpace(s);
// 2.反转整个字符串
reverseString(sb, 0, sb.length() - 1);
// 3.反转各个单词
reverseEachWord(sb);
return sb.toString();
}
private StringBuilder removeSpace(String s) {
// System.out.println("ReverseWords.removeSpace() called with: s = [" + s + "]");
int start = 0;
int end = s.length() - 1;
while (s.charAt(start) == ' ') start++;
while (s.charAt(end) == ' ') end--;
StringBuilder sb = new StringBuilder();
while (start <= end) {
char c = s.charAt(start);
if (c != ' ' || sb.charAt(sb.length() - 1) != ' ') {
sb.append(c);
}
start++;
}
// System.out.println("ReverseWords.removeSpace returned: sb = [" + sb + "]");
return sb;
}
/**
* 反转字符串指定区间[start, end]的字符
*/
public void reverseString(StringBuilder sb, int start, int end) {
// System.out.println("ReverseWords.reverseString() called with: sb = [" + sb + "], start = [" + start + "], end = [" + end + "]");
while (start < end) {
char temp = sb.charAt(start);
sb.setCharAt(start, sb.charAt(end));
sb.setCharAt(end, temp);
start++;
end--;
}
// System.out.println("ReverseWords.reverseString returned: sb = [" + sb + "]");
}
private void reverseEachWord(StringBuilder sb) {
int start = 0;
int end = 1;
int n = sb.length();
while (start < n) {
while (end < n && sb.charAt(end) != ' ') {
end++;
}
reverseString(sb, start, end - 1);
start = end + 1;
end = start + 1;
}
}
}
4.剑指offer 05.替换空格 解题思路
将s用StringBuilder定义,替换操作更方便
代码如下(示例):
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();
}
}
5.剑指offer58-II.左旋转字符串 解题思路
先整体反转,再反转最后n个,最后反正剩余的
代码如下(示例):
class Solution {
public String reverseLeftWords(String s, int n) {
char[] chars = s.toCharArray();
reverse(chars, 0, chars.length - 1); //反转整体
reverse(chars, 0, chars.length - 1 - n); //反转前面的
reverse(chars, chars.length - n, chars.length - 1); //反转最后n个
return new String(chars);
}
//双指针反转函数
public void reverse(char[] chars, int left, int right) {
while (left < right) {
chars[left] ^= chars[right];
chars[right] ^= chars[left];
chars[left] ^= chars[right];
left++;
right--;
}
}
}
总结
字符串的题还是比较复杂的,需要方法以及分析,可惜时间不够,没有把卡哥的方法都走一遍,二刷再走吧