现在的位置: 首页 > 综合 > 正文

atoi实现和翻转一个字符串句子

2013年03月01日 ⁄ 综合 ⁄ 共 2080字 ⁄ 字号 评论关闭

int m_atoi(const   char   *s)
{
      const char   *p   =   s;
      char   c;
      int   i   =   0;
   bool isThan0 = true;
      while(c=*p++)
      {
            if(c>='0'   &&   c<='9')
            {
                  i   =   i*10   +   (c-'0');
            }
   else if(c=='.')
    break;
   else if(c=='-')
   {
    isThan0=false;
    continue;
   }
            else
                return   0;                     //Invalid   string
      }
      if(isThan0) return   i;
   else return 0-i;
}

 

 

翻转句子中单词的顺序。
题目:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。句子中单词以空格符隔开。
为简单起见,标点符号和普通字母一样处理。
例如输入“I am a student.”,则输出“student. a am I”。

第一个想法是借助栈实现,每解析一个单词压栈,解析完依次出栈,要求额外较大的空间开销;

仔细思考就可以得到如下结果:

首先把整个句子反转为 .tneduts a ma I

再次对每个单词反转为 students. a am I

就可以满足要求,并且只在交换时需要较少的额外空间开销;

代码实现如下:

view plaincopy to clipboardprint?
01.// 反转字符串,给出字符串开头和结尾指针  
02.void WRVS_ReverseString(TCHAR *pBegin, TCHAR *pEnd)  
03.{  
04.    // 参数有效性  
05.    if (pBegin==NULL || pEnd==NULL)  
06.    {  
07.        return;  
08.    }  
09. 
10.    // 反转字符串  
11.    TCHAR tmpChar;  
12.    while (pBegin < pEnd)  
13.    {  
14.        tmpChar = *pBegin;  
15.        *pBegin = *pEnd;  
16.        *pEnd = tmpChar;  
17.        pBegin++;  
18.        pEnd--;  
19.    }  
20.}  
21. 
22.// 反转句子  
23.TCHAR* WRVS_ReverseSentence(TCHAR *pSentence)  
24.{  
25.    // 参数有效性  
26.    if (pSentence == NULL)  
27.    {  
28.        return NULL;  
29.    }  
30. 
31.    // 查找句子结尾  
32.    TCHAR *pEnd = pSentence;  
33.    while (*pEnd != _T('/0'))  
34.    {  
35.        pEnd++;  
36.    }  
37.    pEnd--;  
38. 
39.    // 反转整个句子  
40.    TCHAR *pBegin = pSentence;  
41.    WRVS_ReverseString(pBegin, pEnd);  
42. 
43.    // 对反转之后的每个单词再次反转  
44.    pBegin = pSentence;  
45.    pEnd = pSentence;  
46.    while (*pBegin != _T('/0'))  
47.    {  
48.        if (*pBegin == _T(' '))  
49.        {  
50.            pBegin++;  
51.            pEnd++;  
52.            continue;  
53.        }  
54.        // pBegin和pEnd之间是一个单词则反转  
55.        else if (*pEnd==_T(' ') || *pEnd==_T('/0'))  
56.        {  
57.            pEnd--;  
58.            WRVS_ReverseString(pBegin, pEnd);  
59.            pEnd++;  
60.            pBegin = pEnd;  
61.        }  
62.        else 
63.        {  
64.            pEnd++;  
65.        }         
66.    }  
67. 
68.    // 返回反转后结果  
69.    return pSentence;  
70.} 

 

抱歉!评论已关闭.