[刷题记录Day8]Leetcode
No.1
题目
反转字符串
思路
- 双指针,从头尾向中间遍历
代码
public void reverseString(char[] s) {
char temp;
int left = 0, right = s.length - 1;
while (left < right) {
temp = s[left];
s[left] = s[right];
s[right] = temp;
left++;
right--;
}
}
No.2
题目
反转字符串 II
思路
- 灵活使用
for
循环,每个step
是2k
- 理解
Math.min(s.length() - 1, start + k - 1)
,根据end
的位置不同做调整 - 换位置时候的start和end是左闭右闭区间
代码
public String reverseStr(String s, int k) {
char[] copyS = s.toCharArray();
for (int i = 0; i < s.length(); i += 2 * k) {
int start = i, end = Math.min(s.length() - 1, start + k - 1);
while (start < end) {
char temp = copyS[start];
copyS[start] = copyS[end];
copyS[end] = temp;
start++;
end--;
}
}
return new String(copyS);
}
No.3
题目
剑指 Offer 05. 替换空格
思路
- 利用StringBuilder的append
代码
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();
}
No.4
题目
反转字符串中的单词
很考验字符串操作,实现比看起来要复杂得多
思路
- 不用内置函数做
- 移除首尾及中间多余空格
- 将整个字符串反转
- 将每个单词反转
代码
public String reverseWords(String s) {
// 去除首尾及中间的多余空格
StringBuilder sb = removeSpaces(s);
// 反转整个字符串
reverseString(sb, 0, sb.length() - 1);
// 反转单个单词
reverseEachWord(sb);
return sb.toString();
}
private StringBuilder removeSpaces(String str) {
int left = 0, right = str.length() - 1;
StringBuilder res = new StringBuilder();
// 去除首尾多余空格
while (str.charAt(left) == ' ') left++;
while (str.charAt(right) == ' ') right--;
while (left <= right) {
// 遇到非空格就append,遇到空格了,只保留已经在res中的那个
if (str.charAt(left) != ' ' || res.charAt(res.length() - 1) != ' ')
res.append(str.charAt(left));
left++;
}
return res;
}
private void reverseString(StringBuilder sb, int left, int right) {
while (left < right) {
char temp = sb.charAt(left);
sb.setCharAt(left, sb.charAt(right));
sb.setCharAt(right, temp);
left++;
right--;
}
}
private void reverseEachWord(StringBuilder sb) {
int left = 0, right = left + 1;
while (right < sb.length()) {
// 找到要反转的区间[left, right - 1]
while (right < sb.length() && sb.charAt(right) != ' ') right++;
reverseString(sb, left, right - 1);
left = right + 1;
right = left + 1;
}
}
No.5
题目
剑指 Offer 58 - II. 左旋转字符串
思路
- 反转区间为前n的子串
- 反转区间为n到末尾的子串
- 反转整个字符串
代码
public String reverseLeftWords(String s, int n) {
StringBuilder sb = new StringBuilder(s);
for (int i = 0; i < n; i++) {
char c = sb.charAt(0);
sb.deleteCharAt(0);
sb.append(c);
}
return sb.toString();
}