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