[刷题记录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循环,每个step2k
  • 理解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. 左旋转字符串

思路

  1. 反转区间为前n的子串
  2. 反转区间为n到末尾的子串
  3. 反转整个字符串

代码

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();
}
posted @   喜欢毛绒绒的番茄子  阅读(3)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示