剑指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)。
 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 }

 

你可能感兴趣的:(字符串)