本题其实不难,不过如果考虑到Follow Up中对C语言 的空间复杂度要求,就稍微有一点难度,不过其实也就是一道普通的medium题,本题令人困惑的点是到底什么built-in function是可以用的,什么built-in function是不能用的。
不过为了尽可能贴近题意,我还是用了类似C语言空间复杂度的解法,虽然对于我用的Java来说,由于要使用
String,所以不存在的空间复杂度,但是解法还是尽量往那边靠
步骤:
- 把
String转化成CharArray reverse整个array- 用遍历,对每个word进行reverse操作
- 进行space的合并和清理
本题的难度在于细节,而即便细节也不算太复杂,我看完答案后第一遍就通过了,所以其实还好
代码如下:
class Solution {public String reverseWords(String s) {if (s == null || s.isEmpty()) {return s;}char[] sArr = s.toCharArray();reverse(sArr, 0, sArr.length - 1);reverseEachWord(sArr);return cleanSpace(sArr);}private String cleanSpace(char[] str) {int i = 0;int j = 0;while (j < str.length) {if (str[j] == ' ') {++j;continue;}if (i > 0) {str[i++] = ' '; // if not beginning, append space before the word}while (j < str.length && str[j] != ' ') {str[i++] = str[j++];}}return String.valueOf(str).substring(0, i);}private void reverseEachWord(char[] str) {int i = 0;while (i < str.length) {if (str[i] == ' ') {++i;continue;}int j = i + 1;while (j < str.length && str[j] != ' ') {++j;}reverse(str, i, j - 1);i = j + 1;}}private void reverse(char[] str, int i, int j) {while (i < j) {char tmp = str[i];str[i] = str[j];str[j] = tmp;++i;--j;}}}
