以單詞爲單位反轉字符串,要求不申請任何空間

問題描述:

存在一個可讀寫的字符串,其中包括若干單詞,單詞間以空格區分,要求以單詞爲單位對字符串進行反轉。

 

算法思想:

(1)利用異或運算可以進行不申請空間進行字符交換

(2)利用遞歸的思想

(3)使用strchr函數區分單詞

 

解決方案:

(1)利用遞歸和異或運算進行字符交換,這一步將完成字符串的整體反轉

// 遞歸進行字符交換
void recursive_swap_char(char* lhs, char* rhs)
{
	if(rhs <= lhs)
		return;

	*lhs ^= *rhs;
	*rhs ^= *lhs;
	*lhs ^= *rhs;
	
	recursive_swap_char(lhs + 1, rhs - 1);
}

 

(2)逐個對字符串內的單詞進行反轉,則完成以單詞爲單位的反轉

// 遞歸進行單詞中字符反轉
void recursive_word_reverse(char* cur, char* next)
{
	// 如果是最後一個單詞,按字符串進行反轉
	if(next == NULL)
	{
		recursive_swap_char(cur, cur + strlen(cur) - 1);
		return;
	}

	// 當前單詞內進行字符反轉
	recursive_swap_char(cur, next - 1);

	// 反轉下一個單詞
	recursive_word_reverse(next + 1, strchr(next + 1, ' '));
}

 

完整代碼:

#include <iostream>
#include <tchar.h>
using namespace std;
 
// 遞歸進行字符交換
void recursive_swap_char(char* lhs, char* rhs)
{
	if(rhs <= lhs)
		return;

	*lhs ^= *rhs;
	*rhs ^= *lhs;
	*lhs ^= *rhs;
	
	recursive_swap_char(lhs + 1, rhs - 1);
}

// 遞歸進行單詞中字符反轉
void recursive_word_reverse(char* cur, char* next)
{
	// 如果是最後一個單詞,按字符串進行反轉
	if(next == NULL)
	{
		recursive_swap_char(cur, cur + strlen(cur) - 1);
		return;
	}

	// 當前單詞內進行字符反轉
	recursive_swap_char(cur, next - 1);

	// 反轉下一個單詞
	recursive_word_reverse(next + 1, strchr(next + 1, ' '));
}

char* reverse_by_word(char* src)
{
	// 如果只有一個單詞,則直接返回
	if(strchr(src, ' ') == NULL)
		return src;

	// 整體字符串反轉
	recursive_swap_char(src, src + strlen(src) - 1);

	// 反轉單詞
	recursive_word_reverse(src, strchr(src, ' '));

	return src;
}

void print(char* src)
{
	cout << "src:    " << src << endl;
	cout << "dest:   " << reverse_by_word(src) << endl;
}

int _tmain(int argc, _TCHAR* argv[])
{
	char one[] = "one";
	char one_two[] = "one two";
	char one_two_three[] = "one two three";
	char one_two_three_four[] = "one two three four";
	char str_for_test[] = "There is a program for test";
	
	print(one);
	print(one_two);
	print(one_two_three);
	print(one_two_three_four);
	print(str_for_test);

	return 0;
}

運行結果:

不申請空間進行以單詞爲單位反轉字符串的測試用例運行結果

 

附註:

(1)在網上搜到過別的同學的解法,反轉字符串時採用結尾字符('/0')逐次前進的操作,即不斷調用strlen,或者移位,或者加法運算,同時遞歸。而這裏採用快速排序的思想,進行前後兩個指針相互靠攏進行字符交換的遞歸調用,由於是在一個字符串進行操作,因而利用了指針的比較操作是有意義的。

(2)這裏使用的是單詞間只有一個空格,並且最後一個單詞後沒有空格。可能也會出現單詞間有多個空格的情況,解法就需要計算空格的個數,同樣可以通過strchr函數實現。

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