給定一個字符串,逐個翻轉字符串中的每個單詞。
示例:
輸入: “the sky is blue”,
輸出: “blue is sky the”.
說明:
無空格字符構成一個單詞。
輸入字符串可以在前面或者後面包含多餘的空格,但是反轉後的字符不能包括。
如果兩個單詞間有多餘的空格,將反轉後單詞間的空格減少到只含一個。
進階: 請選用C語言的用戶嘗試使用 O(1) 空間複雜度的原地解法。
我沒能用進階的要求,還是重新創建了兩個數組用來存儲反轉後的字符串:一個用來存儲整串倒置的字符串,一個用來存儲單個倒置的單詞。這時需要藉助動態數組來設置,以輸入字符串的長度的基準(因爲倒置後的字符串必定小於等於原字符串的長度)。
#include <stdio.h>
#include <malloc.h>
#include <string.h>
void reverseWords(char *s) {
int i = 0, j = 0, k = 0;
while (s[i] != 0)
i++;
int m = i;
//定義動態數組n,tem,同時賦初值0
char *n = (char *)malloc(m * sizeof(char));
char *tem = (char *)malloc(m * sizeof(char));
memset(n, 0, m);
memset(tem, 0, m);
while (i >= 0) {
i--;
j = 0;
while (s[i] != ' ' && i >= 0) { //將倒置後的非空格字符傳送給tem,結束條件爲遇到空格
tem[j] = s[i];
i--;
j++;
}
j--;
while (j >= 0) { //將tem存儲的單詞傳送給字符串n
n[k] = tem[j];
tem[j] = 0;
k++;
j--;
}
if (k != 0 && n[k - 1] != ' ') { //給每個單詞後加空格
n[k] = ' ';
k++;
}
}
while (k > 0) { //判定結束位置是否有多餘的空格
if (n[k - 1] == ' ')
n[k - 1] = '\0';
else
break;
k--;
}
for (i = 0; i < m; i++)
s[i] = n[i];
}
int main()
{
char s[] = "the sky is blue";
reverseWords(s);
printf("%s", s);
}
其中最容易出錯的點就是單詞間的空格和結束時的空格。因爲輸入的字符串不一定是標準格式,即不是單詞間只有一個空格,我們需要對單詞間空格,以及起始和結束位置的空格進行判定。
這種方法比較笨,更優一點的原地倒置C語言算法可參照:
小練習 - LeetCode151 Reverse Words in a String的C語言解法