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.}