leetcode題目: 翻轉字符串裏的單詞 (C語言解法)

題目鏈接

給定一個字符串,逐個翻轉字符串中的每個單詞。
示例:
輸入: “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語言解法

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章