问题1:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。句子中单词以空格符隔开。为简单起见,标点符号和普通字母一样处理。例如输入“I am a student.”,则输出“student. a am I”。
思路:先逆转整个句子,然后从首字符开始扫描,每扫描到一个单词(遇到空白或结束字符),对这个单词进行逆转。
代码:采用左闭右开的形式
void Reverse(char *pBegin, char *pEnd)
{
if(pBegin == pEnd)
return;
//pEnd先减减,这里就考虑 过滤空格了
while(pBegin < --pEnd) //例:abc
{
char tmp = *pBegin;
*pBegin = *pEnd;
*pEnd = tmp;
pBegin++;
}
}
void ReverseSentence(char *pSentence)
{
if(pSentence == NULL)
return;
Reverse(pSentence, pSentence+strlen(pSentence));
char *pBegin = pSentence;
char *pEnd = pSentence;
while(*pEnd != '\0') //不为结束符
{
if(*pEnd != ' ') //不为空格
pEnd++;
else
{
//遇到空格,逆转这个单词
Reverse(pBegin, pEnd);
pBegin = ++pEnd;
}
}
//逆转最后一个单词
Reverse(pBegin, pEnd);
}
问题2:在字符串中删除特定元素
具体描述,输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。例如,输入”They are students.”和”aeiou”,则删除之后的第一个字符串变成”Thy r stdnts.”。
//函数功能 : 在字符串中删除特定字符
//函数参数 : pSrc为源字符串,pDel为特定字符集
//返回值 : 空
void DeleteSpecialChars(char *pSrc, char *pDel)
{
if(pSrc == NULL || pDel == NULL)
return;
int lenSrc = strlen(pSrc);
int lenDel = strlen(pDel);
if(lenSrc == 0 || lenDel == 0)
return;
//又是运用哈希表
bool hash[256] = { false };
for(int i = 0; i < lenDel; i++) //建立删除字符的索引
hash[pDel[i]] = true; //以字符为索引下标
//开始删除
char *pCur = pSrc;
while(*pSrc != '\0')
{
if(hash[*pSrc] == false) //不用删除
*pCur++ = *pSrc;
pSrc++;
}
*pCur = '\0';
}
问题3:在一个字符串中找到第一个只出现一次的字符。如输入abaccdeff,则输出b。
还是用哈希算法
//函数功能 : 在一个字符串中找到第一个只出现一次的字符
//函数参数 : pStr为源字符串
//返回值 : 目标字符
char FirstAppearOnce(char *pStr)
{
if(pStr == NULL)
return '\0'; //未找到返回空字符
//因为asicc码,不会超过256所以用数组
int count[256] = {0};
char *pTmp = pStr;
while(*pTmp != '\0') //统计字符串中每个字符出现的次数
{
count[*pTmp]++;
pTmp++;
}
while(*pStr != '\0') //遍历字符串,找到第一个只出现一次的字符
{
if(count[*pStr] == 1)
break;
pStr++;
}
return *pStr; //找到的字符
}
问题4:输入一个表示整数的字符串,把该字符串转换成整数并输出。例如输入字符串"345",则输出整数345。
这个问题主要是考察各种不正常情况的处理。假设函数的声明为 int StrToInt(const char *str);
(1)输入的字符串指针为空;
(2)数字前面有正负号的处理;
(3)字符串表示的数字超过了32位整数能表示的范围,即溢出处理;
(4)输入了非法字符,即除了数字及正负号的其他字符;
(5)以字符' 0 '开始的串,' 0 '后面还跟了其他字符,也是非法的。
bool strToIntOK; //全局的变量
int StrToInt(const char *str)
{
strToIntOK = false;
if(str == NULL) //空指针
return 0;
if(str[0] == '0' && str[1] != '\0') //以'0'开始但不是"0" 这条其实可以忽略
return 0;
unsigned i = 0;
bool minus = false; //负数标记
if(str[i] == '-' || str[i] == '+') //判断是不是以正负号开始
{
minus = (str[i] == '-')? true: false;
i++;
}
long long result = 0; //转换的结果
while(str[i] != '\0')
{
char c = str[i++];
if(c >= '0' && c <='9')
{
//c - '0' 将字符转换为数字
result = result * 10 + (c - '0');
if(minus) //负溢出
{
if(result - 1 > numeric_limits<int>::max())
return 0;
}
else //正溢出
{
if(result > numeric_limits<int>::max())
return 0;
}
}
else
{
return 0;
}
}
strToIntOK = true;
//结果返回 需强制转换一下
return minus? (int)(-result):(int)result;
|