剑指Offer - 九度1508 - 把字符串转换成整数

剑指Offer - 九度1508 - 把字符串转换成整数
2014-02-06 23:46
题目描述:

将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。

输入:

输入可能包含多个测试样例。
对于每个测试案例,输入为一个合法或者非法的字符串,代表一个整数n(1<= n<=10000000)。

输出:

对应每个测试案例,
若输入为一个合法的字符串(即代表一个整数),则输出这个整数。
若输入为一个非法的字符串,则输出“My God”。

样例输入:
5
-5
+8
样例输出:
5
-5
8
题意分析:
  给定一个字符串,判断是否表示一个有效的整数。注意以下几点即可:
    1. 判断非法字符,只有数字和
    2. 正负号只能出现在第一位,也不能多次出现。
    3. 数字范围得控制,超出了INT_MIN或是INT_MAX的话得判定为非法。
  时间复杂度为O(n),n为字符串长度,空间复杂度O(1)。
剑指Offer - 九度1508 - 把字符串转换成整数
 1 // 688177    zhuli19901106    1508    Accepted    点击此处查看所有case的执行结果    1020KB    1323B    0MS
 2 // 201401311802
 3 #include <climits>
 4 #include <cstdio>
 5 #include <cstring>
 6 using namespace std;
 7 
 8 int main()
 9 {
10     int i;
11     char s[100];
12     int len;
13     long long int n;
14     int flag;
15     bool suc;
16 
17     // don‘t use "while (gets(s) != NULL)"!
18     while (scanf("%s", s) == 1) {
19         len = strlen(s);
20         suc = true;
21         do {
22             if (len <= 0) {
23                 suc = false;
24                 break;
25             }
26 
27             if (len == 1 && (s[0] == + || s[0] == -)) {
28                 suc = false;
29                 break;
30             }
31 
32             for (i = 0; i < len; ++i) {
33                 if (s[i] == - || s[i] == +) {
34                     if (i != 0) {
35                         suc = false;
36                         break;
37                     }
38                 } else if (!(s[i] >= 0 && s[i] <= 9)) {
39                     suc = false;
40                     break;
41                 }
42             }
43             if (!suc) {
44                 break;
45             }
46             if (s[0] == -) {
47                 flag = -1;
48                 n = 0;
49             } else if(s[0] == +) {
50                 flag = +1;
51                 n = 0;
52             } else {
53                 flag = +1;
54                 n = (s[0] - 0);
55             }
56             for (i = 1; i < len; ++i) {
57                 n = n * 10 + (s[i] - 0);
58                 if (n > 10000000) {
59                     suc = false;
60                     break;
61                 }
62             }
63             n = n * flag;
64             if (n == 0) {
65                 suc = false;
66                 break;
67             }
68         } while (0);
69         if (suc) {
70             printf("%lld\n", n);
71         } else {
72             printf("My God\n");
73         }
74     }
75 
76     return 0;
77 }
剑指Offer - 九度1508 - 把字符串转换成整数

剑指Offer - 九度1508 - 把字符串转换成整数

上一篇:关于UITextView的一些问题


下一篇:剑指Offer - 九度1509 - 树中两个结点的最低公共祖先