字符串處理轉換(華爲2013校園招聘上機筆試題 )

問題描述:    
在給定字符串中找出單詞( “單詞”由大寫字母和小寫字母字符構成,其他非字母字符視爲單詞的間隔,如空格、問號、數字等等;另外單個字母不算單詞);找到單詞後,按照長度進行降序排序,(排序時如果長度相同,則按出現的順序進行排列),然後輸出到一個新的字符串中;如果某個單詞重複出現多次,則只輸出一次;如果整個輸入的字符串中沒有找到單詞,請輸出空串。輸出的單詞之間使用一個“空格”隔開,最後一個單詞後不加空格。
要求實現函數:
void my_word(charinput[], char output[])
【輸入】  char input[], 輸入的字符串
【輸出】  char output[],輸出的字符串
【返回】 無
示例
輸入:charinput[]="some local buses, some1234123drivers" ,
輸出:charoutput[]="drivers local buses some"
輸入:charinput[]="%A^123 t 3453i*()" ,
輸出:charoutput[]=""
以上摘自 http://blog.csdn.net/lanyan822/article/details/7983832 ,但是考慮到沒有給出這個的源代碼,自己隨手寫了一個,寫得不好,僅供娛樂,歡迎大神指點。

#include <string>
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

int my_cmp(string &str1,string &str2)//比較函數
{
	return str1.length() > str2.length();
}
void my_word(char input[],char output[])
{//考慮到存C代碼編程複雜,用C++實現算法
	vector<string> wordList;//單詞鏈表
	bool flag = true;//表示開始記錄單詞
	string temp;//臨時單詞緩存
	for(unsigned int i = 0;i < strlen(input);++i)//遍歷輸入 字符串,必要
	{
		if(input[i] == ' ' && !temp.length())//接收到空格表示開始記錄切單詞緩存爲空
		{
			flag = true;
			continue;
		}
		if(flag)
		{
			if((input[i] >= 'a')&&(input[i] <= 'z') ||(input[i] >= 'A')&&(input[i] <= 'Z'))
			{//如果接收到字母開始記錄
				temp += input[i];
			}
			else if(input[i] == ' ')//一個單詞接受完成
			{
				if(temp.length() > 1 && find(wordList.begin(),wordList.end(),temp) == wordList.end())//單個字母不接受且保證不重複插入
				{
					wordList.push_back(temp);
				}
				temp.clear();
			}
			else//接收到其他字符丟棄
			{
				flag = false;
				temp.clear();
			}
		}
	}
	sort(wordList.begin(),wordList.end(),my_cmp);//字符串長度降序排列
	int placeFlag = 0;//記錄輸出字符串當前位置
	for(unsigned int i = 0;i < wordList.size();++i)//必要轉換
	{
		strcpy(&output[placeFlag],((string)wordList.at(i)).c_str());
		//memcpy(&output[placeFlag],((string)wordList.at(i)).c_str(),((string)wordList.at(i)).size());//這種方式對於大數據的情況下效率高很多,但是注意要在output字符串最後加上‘\0’結束符
		placeFlag += ((string)wordList.at(i)).length();
		if(i != wordList.size() - 1)//爲了滿足最後一個單詞不加空格
			output[placeFlag++] = ' ';
	}
}


int _tmain(int argc, _TCHAR* argv[])
{
	char getLin[1000];
	my_word("abc ad a wer fdsaf7897 dfakdjfadfa*%$%^",getLin);
	
	return 0;
}


 

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