剑指 Offer 58 - I. 翻转单词顺序

    技术2024-01-17  100

    [剑指 Offer 58 - I. 翻转单词顺序]

    难度 简单

    输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student. “,则输出"student. a am I”。

    示例 1:

    输入: "the sky is blue" 输出: "blue is sky the"

    示例 2:

    输入: " hello world! " 输出: "world! hello" 解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。

    示例 3:

    输入: "a good example" 输出: "example good a" 解释: 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。

    说明:

    无空格字符构成一个单词。输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。

    **注意:**本题与主站 151 题相同:https://leetcode-cn.com/problems/reverse-words-in-a-string/

    **注意:**此题对比原题有改动

    来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/fan-zhuan-dan-ci-shun-xu-lcof 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    解法一:双指针

    从字符串的尾部开始将每个单词的范围通过双指针限定出来,然后将该单词加入返回的字符串中,直到所有单词都完成该操作。

    class Solution { public String reverseWords(String s) { s = s.trim(); //删除首尾空格 int i = s.length() - 1, j = i; StringBuilder ans = new StringBuilder(); while(j >= 0) { while(j >= 0 && s.charAt(j) != ' ') { j--; //搜索首个空格 } ans.append(s.substring(j + 1, i + 1) + " "); while(j >= 0 && s.charAt(j) == ' ') { j--; //跳过单词间空格 } i = j; //让 i 跳到下一个单词的结束位置 } return ans.toString().trim(); } }

    解法二:分割单词

    使用 split 函数以空格为间隔来分割 s , 并将分割后的单词保存到字符串数组中, 然后反向遍历字符串数组 strs,将 strs 中的单词加入到 ans 中。

    class Solution { public String reverseWords(String s) { String[] strs = s.trim().split(" "); //删除首尾空格,分割字符串 StringBuilder ans = new StringBuilder(); for(int i = strs.length - 1; i >= 0; i--) { // 倒序遍历单词列表 if(strs[i].equals("")) continue; // 遇到空单词则跳过 ans.append(strs[i] + " "); // 将单词拼接至 StringBuilder } return ans.toString().trim(); // 转化为字符串,删除尾部空格,并返回 } }
    Processed: 0.009, SQL: 9