数据结构---字符串

1. 翻转句子中单词的顺序,但单词内字符的顺序不变

思路:先逆转整个句子,然后从首字符开始扫描,每扫描到一个单词(遇到空白或结束字符),对这个单词进行逆转。

1.  void Reverse(char *pBegin, char *pEnd)  
2.  {  
3.      if(pBegin == pEnd)  
4.          return;  
5.      while(pBegin < --pEnd)  
6.      {  
7.          char tmp = *pBegin;  
8.          *pBegin = *pEnd;  
9.          *pEnd = tmp;  
10.         pBegin++;  
11.     }  
12. }  
13. void ReverseSentence(char *pSentence)  
14. {  
15.     if(pSentence == NULL)  
16.         return;  
17.   
18.     Reverse(pSentence, pSentence+strlen(pSentence));  
19.     char *pBegin = pSentence;  
20.     char *pEnd = pSentence;  
21.     while(*pEnd != '\0')  
22.     {  
23.         if(*pEnd != ' ')  
24.             pEnd++;  
25.         else  
26.         {  
27.             //遇到空格,逆转这个单词  
28.             Reverse(pBegin, pEnd);   
29.             pBegin = ++pEnd;  
30.         }  
31.     }  //循环结束时,pEnd指向句子末尾,pBegin指向最后一个单词开头位置
32.     //逆转最后一个单词  
33.     Reverse(pBegin, pEnd);  
34. } 
2. 字符串转换成整数

问题描述:输入一个表示整数的字符串,把该字符串转换成整数并输出。例如输入字符串”345”,则输出整数345。
思路:转换的过程比较简单,每次读入一个字符,将之前保存的值乘以10,然后再加上这个字符表示的数字。这是正常情况。这个问题主要是考察各种不正常情况的处理。假设函数的声明为 int StrToInt(const char *str);
(1)输入的字符串指针为空;
(2)数字前面有正负号的处理;
(3)字符串表示的数字超过了32位整数能表示的范围,即溢出处理;
(4)输入了非法字符,即除了数字及正负号的其他字符;
(5)以字符’ 0 ‘开始的串,’ 0 ‘后面还跟了其他字符,也是非法的。

如果能很好的处理这些情况,那么程序的健壮性大大增强。其中有两种情况处理起来有点麻烦,第一,如何处理溢出,我们可以使用std::numeric_limits::max(),可以定义一个long long的变量,然后与这个最大值相比,从而判断是否溢出了。第二。由于返回值为一个整型数,那么如果转换失败,返回什么呢?如果是’0 ’ ,那么就无法区分正常输入”0”的情况。两种方案,修改函数声明,通过返回值表明转换的成功与否,或者定义一个全局变量,用来保存转换的成功与否。参考代码中使用了第二种方案。

1.  bool strToIntOK; //全局的变量    
2.  int StrToInt(const char *str)    
3.  {    
4.      strToIntOK = false;    
5.      if(str == NULL)  //空指针    
6.          return 0;    
7.          
8.      if(str[0] == '0' && str[1] != '\0') //以'0'开始但不是"0" 这条其实可以忽略    
9.          return 0;    
10.         
11.     unsigned i = 0;    
12.     bool minus = false;    //负数标记    
13.     if(str[i] == '-' || str[i] == '+') //判断是不是以正负号开始    
14.     {    
15.         minus = (str[i] == '-')? true: false; //问号表达式   
16.         i++;    
17.     }    
18.         
19.     long long result = 0;  //转换的结果   
20.     while(str[i] != '\0')    
21.     {    
22.         char c = str[i++];    
23.         if(c >= '0' && c <='9')   //为数字 
24.         {    
25.             result = result * 10 + (c - '0');    
26.             if(minus) //负溢出  
27.             {  
28.                 if(result - 1 > numeric_limits<int>::max())   
29.                     return 0;    
30.             }  
31.             else //正溢出  
32.             {  
33.                 if(result > numeric_limits<int>::max())  
34.                     return 0;    
35.             }  
36.         }    
37.         else    
38.         {    
39.             return 0;    
40.         }    
41.     }    
42.     strToIntOK = true;    
43.     //结果返回 需强制转换一下    
44.     return minus? (int)(-result):(int)result;    
45. }
46. #include <limits>
47. numeric_limits<type>:
numeric_limits<type>::digits    type的位数。
numeric_limits<type>::max()    type的最大值。
numeric_limits<type>::min()    type的最小值

3. 在一个字符串中找到第一个只出现一次的字符。如输入abaccdeff,则输出b。

思路:这一题不难,因为每个字符只有8位共256个,因此可以用计数法。首先统计字符串中每个字符的出现次数,然后从头遍历字符串,对于当前字符,查询统计表,如果出现的次数为1,则输出该字符即可。

1.  char FirstAppearOnce(char *pStr)  
2.  {  
3.      if(pStr == NULL)  
4.          return '\0'; //未找到返回空字符  
5.    
6.      int count[256] = {
  0};  //出现次数,所以用int
7.      char *pTmp = pStr;  
8.        
9.      while(*pTmp != '\0')  //统计字符串中每个字符出现的次数  
10.     {  
11.         count[*pTmp]++;  
12.         pTmp++;  
13.     }  
14.     while(*pStr != '\0') //遍历字符串,找到第一个只出现一次的字符  
15.     {  
16.         if(count[*pStr] == 1)  
17.             break;  
18.         pStr++;  
19.     }  
20.     return *pStr; //找到的字符  
21. }  
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值