String To Integer(atoi)
来源:互联网 发布:岛希斯洛普 知乎 编辑:程序博客网 时间:2024/05/16 05:24
通过率很低的一道easy题,题目难就难在要过滤各种不合理字符串输入(多个正负号、0的处理、义字符、符号插入等等),还要考虑越界问题。我费尽力气解决了输入问题后,屡次出现越界问题,于是怒看解答终于AC。。。
自己的版本老有个case(-2147483647)过不去,但在自己机器上是正确的,无奈。。。也贴上来作为轨迹:
long long tenPower(int power){ long long result = 1; while (power > 0) { result *= 10; power--; } return result;}char *strFilter(char *s) // "0123" "-0132" "+0123" "01k23" "094-12" " - 0100 0 " " 3 345 "{ char *result = NULL; int sLength = (int)strlen(s); int count = 0; bool isSpace = true; //重新构造一个过滤过的字符串返回 result = (char *)malloc(sLength * sizeof(char)); memset(result, 0, strlen(result)); int index = 0; for (int i = 0; i < sLength; i++) { if (s[i] == '+' | s[i] == '-') { if (count < 1) { count++; isSpace = false; result[index] = s[i]; index++; continue; } else { break; } } else if (s[i] == ' ') { if (isSpace) { continue; } else { break; } } else if (s[i] >= '0' && s[i] <= '9') { isSpace = false; result[index] = s[i]; index++; continue; } else { break; } } return result;}int myAtoi(char *s){ long long result = 0; int power = 0; bool isNagtive = false; char *temps = strFilter(s); if (temps) ; else return 0; if (temps[0] == '-') isNagtive = true; int sLength = (int)strlen(temps); for (int i = sLength - 1; i >= 0; i--) { // "0123" "-0132" "+0123" "01k23" "094-12" " 0100" " 345 " if (temps[i] >= '0' && temps[i] <= '9') { if (temps[i] == '0') { power++; } else { if (result < INT_MIN || result > INT_MAX) { if (isNagtive) result = -result; if (result > INT_MAX) { result = INT_MAX; } else if (result < INT_MIN) { result = INT_MIN; } if (isNagtive) result = -result; break; } result = result + (temps[i] - '0') * tenPower(power); power++; } } } if (isNagtive) result = -result; if (result > INT_MAX) { result = INT_MAX; } else if (result < INT_MIN) { result = INT_MIN; } free(temps); return (int)result;}
作为一道easy题,上面的代码明显超过长度,尤其是power和过滤函数,其实只要几句话就可以到达目的,只是当时自己的思维还是一个个来单独处理,没有连起来的思维,所以需要继续锻炼。
以下是借鉴的版本,power函数其实用反转integer的关键代码就行,过滤的自己考虑复杂了,其实规律很好找:
int myFixedAtoi(char *s){ int result = 0; int i = 0; int sign = 0; int sLength = (int)strlen(s); while (i < sLength && s[i] == ' ') i++; if (s[i] == '+') i++; else if (s[i] == '-') { i++; sign = 1; } for (; i < sLength; i++) { if (s[i] < '0' || s[i] > '9') break; else if (result > INT32_MAX / 10 || (result == INT32_MAX / 10 && (s[i] - '0') > INT32_MAX % 10)) { if (!sign) return INT32_MAX; else return INT32_MIN; } result = result * 10 + (s[i] - '0'); } if (sign) result = -result; return result;}
0 0
- String to Integer (atoi)
- String to Integer (atoi)
- String to Integer (atoi)
- String to Integer (atoi)
- String to Integer (atoi)
- String to Integer (atoi)
- String to Integer (atoi)
- String to Integer (atoi)
- string to integer (atoi)
- String to Integer (atoi)
- String to Integer (atoi)
- String to Integer (atoi)
- String to Integer (atoi)
- String to Integer(atoi)
- String to Integer (atoi)
- String to Integer (atoi)
- String to Integer (atoi)
- String to Integer (atoi)
- 【一切都是对象】
- HibernateDaoSupport详解
- ClassLoader机制
- jenkins插件pipeline的简单使用
- sysfs
- String To Integer(atoi)
- STL中list实现降序排列
- ViewStub惰性装载控件
- 恩,今天是被cin.get()戏弄。
- listview当选中某一个item时设置背景色其他的不变
- VC常用小知识
- NSMutableDictionary对象用set方法初始化的键值真的不可修改吗
- android-设计模式的应用
- sql server行版本控制的隔离级别