[面试] 算法(一) —— Str2Int
来源:互联网 发布:Java编程思想豆瓣 编辑:程序博客网 时间:2024/04/29 11:11
“123” ⇒ 123
不允许使用 atoi 等其他类似的库函数;
一种 naive 版:
int str2int(const char* str){ if (str == NULL) return 0; int num = 0; while (*str != '0') num = num * 10 + *str++ - '0'; return num;}
其实代码的核心逻辑在(num = num*10 + *str - ‘0’;):
这段代码的核心问题在未考虑空指针 NULL,空字符串”“、正负号、溢出、非法输入(0-9以外的其他输入)等方方面面的测试用例;
这里的一个问题在于,我们将空指针 NULL、空字符串”“,溢出、非法输入,统统返回为 0,可是如果遇到真正的”0”,怎么办?
设置一个全局的状态变量(g_status),初始化为 Invalid,直到能够遍历到字符串的结尾('\0'
)为 Valid。所以,最终的判断逻辑是,如果结果为 0,且 g_status 为 Valid,则为真正的 0,如果结果为0,但 g_status 为 Invalid,则为非法输入。
enum Status { Valid, Invalid};int g_status = Valid;int Str2Int(const char* str){ g_status = Invalid; long long num = 0; bool minus = false; if (str != NULL && *str != '\0') { if (*str == '+') { ++str; } else if (*str == '-') { minus = true; ++str; } if (*str != '\0') num = Str2IntHelper(str, minus); } return (int)num;}long long Str2IntHelper(const char* digit, bool minus){ long long num = 0; int flag = minus ? -1:1; while (*digit != '\0') { if (*digit >= '0' && *digit <= '9') { num = num*10+flag*(*digit - '0'); if ( (!minus && num > 0x7fffffff) || (minus && num) < (signed int)0x80000000) return 0; ++str; } else return 0; } if (*str == '\0') // 遍历到字符串的末尾 g_status = Valid; return num;}
客户端调用(测试):
int num = Str2Int("+123");if (num == 0 && g_status == Invalid) 非法输入else 输出即可
0 0
- [面试] 算法(一) —— Str2Int
- 【算法】—— str2int(正序和逆序)
- C Tricks(十)—— str2int vs int2str
- 面试算法(一)—朴素贝叶斯
- 查找算法总结——面试(一)
- str2int
- 面试算法总结(一)
- 面试算法题(一)
- 面试算法题小结(一)
- 常见面试算法总结(一)
- 校招算法面试(一)
- 面试算法收集(网易)一
- 面试算法一
- 面试算法练习(一)
- 算法面试(一)
- [面试] 算法(六)—— 链表
- [面试] 算法(八)—— 树
- 面试兵法——备战(一)
- Android JNI实现UDP,TCP,HTTP通信《1.配置》
- hibernate多对多映射拆成2个一对多映射(注解)
- 前端开发入门之道
- 第4周项目3-随机数函数应用于游戏(猜数字)
- Nginx配置网站适配PC和手机
- [面试] 算法(一) —— Str2Int
- vb排序
- 数据交换
- 使用CoIDE调试STM32单片机
- Outlook新建数据文件拷贝文件夹和规则的宏
- labveiw按键的机械动作
- Java经典设计模式(1):五大创建型模式(附实例和详解)
- 机器学习整理
- Linux下安装RabbitMQ