剑指offer系列——44.翻转单词顺序列/翻转字符串里的单词

Q:牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?
A:熟练运用reverse函数

    string ReverseSentence(string str) {
        if (str.empty())
            return str;
        int index1 = 0;
        int index2 = 0;
        reverse(str.begin(), str.end());
        while (index1 < str.size()) {
            while (str[index2] != ' ' && index2 < str.size())
                index2++;
            reverse(str.begin() + index1, str.begin() + index2);
            index2++;
            index1 = index2;
        }
        return str;
    }

Q:给定一个字符串,逐个翻转字符串中的每个单词。

示例 1:
输入: "the sky is blue"
输出: "blue is sky the"
示例 2:
输入: "  hello world!  "
输出: "world! hello"
解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
示例 3:
输入: "a good   example"
输出: "example good a"
解释: 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
 
说明:
无空格字符构成一个单词。
输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。

A:
各种库函数齐上阵

    public String reverseWords(String s) {
        if (s.isEmpty())
            return "";
        String[] str = s.split(" ");//可能有“”
        ArrayList<String> array = new ArrayList<>();
        for (String sub : str) {
            if (!sub.isEmpty())
                array.add(sub);
        }
        Collections.reverse(array);
        return String.join(" ", array);
    }

但调用了API,有点对不起这中等难度啊
纯手写API:

    public String reverseWords(String s) {
        if (s.isEmpty())
            return "";
        int slow = 0;
        int fast = slow;
        Stack<String> stack = new Stack<>();
        while (slow != s.length()) {
            if (s.charAt(slow) == ' ') {
                slow++;
                continue;
            } else {
                fast = slow + 1;
                while (fast < s.length() && s.charAt(fast) != ' ') {
                    fast++;
                }
                stack.push(s.substring(slow, fast));
                slow = fast;
            }
        }
        StringBuilder stringBuilder = new StringBuilder();
        if(stack.empty())
            return "";
        stringBuilder.append(stack.pop());
        while(!stack.empty()){
            stringBuilder.append(" ");
            stringBuilder.append(stack.pop());
        }
        return stringBuilder.toString();
    }
posted @ 2020-02-20 16:43  Shaw_喆宇  阅读(111)  评论(0编辑  收藏  举报