lotus

贵有恒何必三更眠五更起 最无益只怕一日曝十日寒

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

1. 题目

 

 

题目

 

考查点

这个算法题的考查点是:

  • 字符串的处理,如去除空格,分割单词,拼接字符串等。
  • 双指针的使用,如左右指针,单词边界指针等。
  • 字符串的反转,如整体反转,局部反转等。

2. 解法

思路

这个代码的思路是先去除字符串首尾的空格,然后反转整个字符串,再反转每个单词。这样就可以实现将每个单词逐个翻转的效果。

例如,给定字符串 “the sky is blue”,

  • 经过去除空格后得到 “the sky is blue”,
  • 反转整个字符串后得到 “eulb si yks eht”,
  • 再反转每个单词后得到 “blue is sky the”,就是最终的结果。

 

 

代码的思路。这个代码可以分为三个步骤:

  1. 去除字符串首尾的空格,使得字符串只包含有效的单词和单词之间的空格。
  2. 反转整个字符串,使得每个单词的顺序颠倒,但是每个单词内部的字符顺序不变。
  3. 反转每个单词,使得每个单词内部的字符顺序也颠倒,从而实现将每个单词逐个翻转的效果。

 

具体实现

public String reverseWords(String s) {
    s = s.trim(); // 去除首尾空格
    StringBuilder sb = new StringBuilder(); // 用于存储结果
    for (int i = 0; i < s.length(); i++) {
        if (s.charAt(i) == ' ' && sb.length() > 0 && sb.charAt(sb.length() - 1) == ' ') {
            continue; // 跳过多余的空格
        } else {
            sb.append(s.charAt(i)); // 添加字符到结果
        }
    }
    int left = 0; // 左指针
    int right = sb.length() - 1; // 右指针
    while (left < right) {
        char tmp = sb.charAt(left); // 交换左右字符
        sb.setCharAt(left, sb.charAt(right));
        sb.setCharAt(right, tmp);
        left++; // 移动左指针
        right--; // 移动右指针
    }
    int boundary = 0; // 单词边界指针
    while (boundary < sb.length()) {
        left = boundary; // 左指针指向单词开头
        while (boundary < sb.length() && sb.charAt(boundary) != ' ') {
            boundary++; // 移动边界指针到单词结尾
        }
        right = boundary - 1; // 右指针指向单词结尾
        while (left < right) {
            char tmp = sb.charAt(left); // 交换左右字符
            sb.setCharAt(left, sb.charAt(right));
            sb.setCharAt(right, tmp);
            left++; // 移动左指针
            right--; // 移动右指针
        }
        boundary++; // 移动边界指针到下一个单词开头
    }
    return sb.toString(); // 返回结果字符串
}

  

3. 总结

posted on 2023-04-28 20:51  白露~  阅读(14)  评论(0编辑  收藏  举报