本题其实不难,不过如果考虑到Follow Up中对C语言151. Reverse Words in a String - 图1 的空间复杂度要求,就稍微有一点难度,不过其实也就是一道普通的medium题,本题令人困惑的点是到底什么built-in function是可以用的,什么built-in function是不能用的。

    不过为了尽可能贴近题意,我还是用了类似C语言151. Reverse Words in a String - 图2空间复杂度的解法,虽然对于我用的Java来说,由于要使用String,所以不存在151. Reverse Words in a String - 图3的空间复杂度,但是解法还是尽量往那边靠

    步骤:

    1. String 转化成 Char Array
    2. reverse整个array
    3. 用遍历,对每个word进行reverse操作
    4. 进行space的合并和清理

    本题的难度在于细节,而即便细节也不算太复杂,我看完答案后第一遍就通过了,所以其实还好
    代码如下:

    1. class Solution {
    2. public String reverseWords(String s) {
    3. if (s == null || s.isEmpty()) {
    4. return s;
    5. }
    6. char[] sArr = s.toCharArray();
    7. reverse(sArr, 0, sArr.length - 1);
    8. reverseEachWord(sArr);
    9. return cleanSpace(sArr);
    10. }
    11. private String cleanSpace(char[] str) {
    12. int i = 0;
    13. int j = 0;
    14. while (j < str.length) {
    15. if (str[j] == ' ') {
    16. ++j;
    17. continue;
    18. }
    19. if (i > 0) {
    20. str[i++] = ' '; // if not beginning, append space before the word
    21. }
    22. while (j < str.length && str[j] != ' ') {
    23. str[i++] = str[j++];
    24. }
    25. }
    26. return String.valueOf(str).substring(0, i);
    27. }
    28. private void reverseEachWord(char[] str) {
    29. int i = 0;
    30. while (i < str.length) {
    31. if (str[i] == ' ') {
    32. ++i;
    33. continue;
    34. }
    35. int j = i + 1;
    36. while (j < str.length && str[j] != ' ') {
    37. ++j;
    38. }
    39. reverse(str, i, j - 1);
    40. i = j + 1;
    41. }
    42. }
    43. private void reverse(char[] str, int i, int j) {
    44. while (i < j) {
    45. char tmp = str[i];
    46. str[i] = str[j];
    47. str[j] = tmp;
    48. ++i;
    49. --j;
    50. }
    51. }
    52. }