面试题58_I_翻转单词顺序

2020-02-19  本文已影响0人  shenghaishxt

题目描述

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

题解一

按照空格切分字符串,这样每个单词就会存入到一个字符串数组中,然后再倒序拼接即可。

class Solution {
    public String reverseWords(String s) {
        // 使用正则表达式,去除多余的空格s
        s = s.trim().replaceAll(" +", " ");
        String[] strings = s.split(" ");
        StringBuilder sb = new StringBuilder();
        for (int i = strings.length - 1; i >= 0; i--) {
            sb.append(strings[i]).append(" ");
        }
        return sb.deleteCharAt(sb.length()-1).toString();
    }
}

题解二

但如果不允许使用JAVA的API的话,如果进行翻转呢?

我们可以通过两次翻转字符串来得到上面的结果。例如对于“student. a am I”,先翻转字符串内所有字符得到"I ma a .tneduts",再对每个单词中的字符顺序进行翻转,就得到了"I am a students."。

下面是参考代码:

class Solution {
    public String reverseWords(String s) {
        // 使用正则表达式,去除多余的空格s
        s = s.trim().replaceAll(" +", " ");
        // 先翻转整个字符串
        char[] chars = s.toCharArray();
        reverse(chars, 0, s.length()-1);
        // 翻转字符串中的每个单词
        int begin = 0, right = 0;
        for (int i = 0; i < chars.length; i++) {
            if (chars[i] == ' ') {
                reverse(chars, begin, i-1);
                begin = i + 1;
            }
        }
        // 最后一个单词单独处理
        reverse(chars, begin, chars.length-1);
        // 字符数组转化为字符串
        return String.valueOf(chars);
    }
    
    private void reverse(char[] chars, int left, int right) {
        if (left > right)
            return;
        while (left < right) {
            char temp = chars[left];
            chars[left++] = chars[right];
            chars[right--] = temp;
        }
    }
}
上一篇 下一篇

猜你喜欢

热点阅读