您的位置:首页 > 其它

【2012年华为校园招聘软开上机-成都】字母转换、统计单词个数

2013-09-11 15:22 495 查看
2013-09-11 15:18:51

1 字串转换

问题描述:

将输入的字符串(字符串仅包含小写字母‘a’到‘z’),按照如下规则,循环转换后输出:a->b,b->c,…,y->z,z->a;若输入的字符串连续出现两个字母相同时,后一个字母需要连续转换2次。例如:aa 转换为 bc,zz 转换为 ab;当连续相同字母超过两个时,第三个出现的字母按第一次出现算。

要求实现函数:

int convert(char *input,char* output)
【输入】 char *input , 输入的字符串
【输出】 char *output ,输出的字符串
【返回】 无

示例

输入:char*input="abcd"
输出:char*output="bcde"
输入:char*input="abbbcd"
输出:char*output="bcdcde"

2 字符串处理转换

问题描述:

在给定字符串中找出单词( “单词”由大写字母和小写字母字符构成,其他非字母字符视为单词的间隔,如空格、问号、数字等等;另外单个字母不算单词);找到单词后,按照长度进行降序排序,(排序时如果长度相同,则按出现的顺序进行排列),然后输出到一个新的字符串中;如果某个单词重复出现多次,则只输出一次;如果整个输入的字符串中没有找到单词,请输出空串。输出的单词之间使用一个“空格”隔开,最后一个单词后不加空格。

要求实现函数:

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[]=""

代码:

#include<iostream>
#include <cassert>
#include <map>
#include<string>
using namespace std;

typedef char DataType;

const size_t SIZE = 100;

void StringConvert(DataType *pInputStr,DataType *pOutputStr)
{
assert(pInputStr != NULL && pOutputStr != NULL);

DataType *pInCur = pInputStr;
//DataType *pInPre = "\0";
DataType CharInPre = '\0';
DataType *pOutCur = pOutputStr;
size_t increment = 0;

while (*pInCur)
{
assert(*pInCur >= 'a' && *pInCur <= 'z');

if (*pInCur == CharInPre)
{
increment = 2;
//pInPre = '\0';  //用指针将会改变源输入字符串,因此用CharInPre
CharInPre = '\0';  //将CharInPre归零,使得出现2次以上的字符俺第一次出现处理
}
else
{
increment = 1;
CharInPre = *pInCur;
}

//*pOutCur = 'a' + (*pInCur - 'a' + increment) % ('z' - 'a');
*pOutCur++ = 'a' + (*pInCur - 'a' + increment) % 26;
++pInCur;
}
}

bool IsAlphabet(char ch)
{
return ( (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z'));
}

void CountWord(const string &inputStr,string &outputStr)   //注意此处输出必须使用引用形参
{
multimap<int,string,greater<int>> mapLengthWord;
//map<int,string,greater<int>> mapLengthWord;

string tmpStr;
size_t tmpLen = 0;
size_t index = 0;

while (index < inputStr.length() )
{
tmpStr.erase(0,tmpStr.length());  //注意清零

while (index < inputStr.length())
{
if ( !IsAlphabet(inputStr.at(index)) )
{
break;
}
tmpStr.push_back(inputStr.at(index));
++index;
}

tmpLen = tmpStr.length();

if ( tmpLen >= 2)
{
mapLengthWord.insert(multimap<int,string>::value_type (tmpLen,tmpStr));
}

++index;
}

multimap<int,string,greater<int>> ::iterator iter;
//map<int,string,greater<int>> ::iterator iter;
//cout<<"mapLengthWord.size() = "<<mapLengthWord.size()<<endl;

for (iter = mapLengthWord.begin();iter != mapLengthWord.end();++iter)
{
cout<<iter->first<<" "<<outputStr<<endl;
if (iter != mapLengthWord.begin() )   //不支持iter + n的算术操作
{
outputStr.append(" " + iter->second);
}
else
{
outputStr.append(iter->second);
}
}
}

void TestDriver()
{
//测试StringConvert
//DataType pInputStr[SIZE] = "abcd";
//DataType pInputStr[SIZE] = "abbcd";
//DataType pInputStr[SIZE] = "abbbcd";
/*DataType pInputStr[SIZE] = "";
DataType pOutputStr[SIZE] = "";
StringConvert(pInputStr,pOutputStr);

cout<<"pInputStr = "<<pInputStr<<endl;
cout<<"pOutputStr = "<<pOutputStr<<endl;*/

//测试CountWord
//string inputStr = "some local buses, some1234123drivers";
//string inputStr = "sometimes abc de, some1234123here#a@as$drivers";
string inputStr = "%A^123 t 3453i*()";
string outputStr;

CountWord(inputStr,outputStr);

cout<<"inputStr = "<<inputStr<<endl;  //要输出string类型的变量,需包含string头文件
cout<<"outputStr = "<<outputStr<<endl;
}

int main()
{
TestDriver();
return 0;
}


测试结果:

inputStr = sometimes abc de, some1234123here#a@as$drivers
outputStr = sometimes drivers some here abc de as
请按任意键继续. . .
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: