Given an input string, reverse the string word by word.
For example,
Given s = "the sky is blue"
,
return "blue is sky the"
.算法
給定一個字符串,將其反轉,其的字詞不轉數組
先對整個字符串反轉,再將每一個單詞進行反轉 spa
算法實現類.net
public class Solution { public String reverseWords(String s) { if (s == null) { return null; } char[] chars = s.toCharArray(); // 字符壓縮 int realLength = compressWhiteSpace(chars); // 交換整個字符串 swapRange(chars, 0, realLength - 1); // 記錄單詞的起點 int start = 0; // 記錄單詞的終點 int end; while (start < realLength) { // 從start位置開始找第一個非空白字符 while (start < realLength && chars[start] == ' ') { start++; } end = start + 1; // 找第一個空白字符 while (end < realLength && chars[end] != ' ') { end++; } // 反轉字符 swapRange(chars, start, end - 1); // 記錄新的開始位置 start = end; } return new String(chars, 0, realLength); } /** * 對字符數組的的空白字符進行壓縮 * * @param chars 字符數組 * @return 新的長度 */ public int compressWhiteSpace(char[] chars) { if (chars == null || chars.length == 0) { return 0; } // 放在字符的位置 int pos = 0; for (int i = 0; i < chars.length; i++) { // 從i位置開始找第一個非空白字符 while (i < chars.length && chars[i] == ' ') { i++; } // 已經處理完了 if (i >= chars.length) { break; } // 從i位置開始處理非空白字符,直到遇到空白字符 // 就是處理一個單詞 while (i < chars.length && chars[i] != ' ') { chars[pos] = chars[i]; pos++; i++; } // 處理完一個單詞要空一格,最後一個單詞不有多空一格【A】 if (pos < chars.length) { chars[pos] = ' '; } pos++; } // int result = pos - 1; // System.out.println("|" + new String(chars, 0, result) + "|"); // 說明字符串中只有空白字符 if (pos == 0) { return 0; } else { // System.out.println("|" + new String(chars, 0, pos - 1) + "|"); // 減一就是要去掉多餘的一個空格,見【A】 return pos - 1; } } /** * 反轉字字數數組中[x, y]位置的字符 * * @param chars 字符數組 * @param x x位置 * @param y y位置 */ public void swapRange(char[] chars, int x, int y) { for (; x < y; x++, y--) { swap(chars, x, y); } } /** * 交換數組中x,y兩個位置的單詞 * * @param chars 字符數組 * @param x x位置 * @param y y位置 */ public void swap(char[] chars, int x, int y) { char z = chars[x]; chars[x] = chars[y]; chars[y] = z; } }