class Solution {
public void reverseString(char[] s) {
int left = 0;
int right = s.length - 1;
char temp;
while (left < right) {
temp = s[left];
s[left] = s[right];
s[right] = temp;
left++;
right--;
}
}
}
遍历字符串s,每次步进2k,判断剩余字串是否小于k,若小于k,k等于剩余字符串数量。
class Solution {
public String reverseStr(String s, int k) {
char[] result = s.toCharArray();
for (int i = 0; i < s.length(); i += 2 * k) {
// 判断剩余字符串是否小于k
k = i + k > s.length() ? s.length() - i : k;
if (s.length() - i >= k) {
int left = i;
int right = i + k - 1;
while (left < right) {
char temp = result[left];
result[left++] = result[right];
result[right--] = temp;
}
}
}
return new String(result);
}
}
剑指Offer 05.替换空格
采用后序方式,预先计算出字符串扩容后的大小使用双指针从后向前填充
public String replaceSpace(String s) {
StringBuilder str = new StringBuilder();
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i) == ' ') {
str.append(" ");
}
}
int left = s.length() - 1;
s += str;
int right = s.length() - 1;
char[] chars = s.toCharArray();
while (left > 0) {
if (chars[left--] == ' ') {
chars[right--] = '0';
chars[right--] = '2';
chars[right--] = '%';
continue;
}
chars[right--] = chars[left--];
}
return new String(chars);
}
学习解题思路:1.移除多余空格2.将整个字符串反转3.将每个单词反转
class Solution {
public String reverseWords(String s) {
// 去除多余空格
StringBuilder sb = removeSpace(s);
// 反转字符串
reverstString(sb, 0, sb.length() - 1);
// 反转单个单词
int start = 0;
int end = 1;
int num = sb.length();
while (start < num) {
while (end < num && sb.charAt(end) != ' ') {
end++;
}
reverstString(sb, start, end - 1);
start = end + 1;
end = start + 1;
}
return sb.toString();
}
// 去除多余的空格
private StringBuilder removeSpace(String s) {
int left = 0;
int right = s.length() - 1;
StringBuilder sb = new StringBuilder();
// 移除首尾两端的空格
while (s.charAt(left) == ' ') {
left++;
}
while (s.charAt(right) == ' ') {
right--;
}
for (int i = left; i <= right; i++) {
if (s.charAt(i) != ' ' || sb.charAt(sb.length() - 1) != ' ') {
sb.append(s.charAt(left));
}
left++;
}
return sb;
}
// 反转指定区间的单词
public void reverstString(StringBuilder sb, int start, int end) {
while (start < end) {
char temp = sb.charAt(start);
sb.setCharAt(start, sb.charAt(end));
sb.setCharAt(end, temp);
start++;
end--;
}
}
}
剑指Offer58-II.左旋转字符串
学习思路,通过局部反转加整体反转达到最后需要的结果
public String reverseLeftWords(String s, int n) {
int length = s.length();
StringBuilder sb = new StringBuilder(s);
reverseString(sb, 0, n - 1);
reverseString(sb, n, length - 1);
return sb.reverse().toString();
}
public void reverseString(StringBuilder sb, int start, int end) {
while (start < end) {
char temp = sb.charAt(start);
sb.setCharAt(start, sb.charAt(end));
sb.setCharAt(end, temp);
start++;
end--;
}
}