剑指 Offer 67. 把字符串转换成整数
思路#
方法:模拟#
本题难点在于怎么判断数字是否超过int的范围,这里有两个方法解决:
(1) 使用long long直接判断#
1 class Solution { 2 public: 3 int strToInt(string str) { 4 if(str.empty()) 5 return 0; 6 7 int firstValidPos = 0; //第一个非空格符的下标 8 while(str[firstValidPos] == ' ') { 9 ++firstValidPos; 10 if(firstValidPos >= str.size()) 11 return 0; 12 } 13 14 int lastValidPos = 0; //最后一个合法的下标 15 long long num = 0; //使用long long直接判断是否越界 16 if(isdigit(str[firstValidPos])) { 17 lastValidPos = firstValidPos+1; 18 while(isdigit(str[lastValidPos])){ 19 ++lastValidPos; 20 } 21 --lastValidPos; 22 23 num = str[firstValidPos] - '0'; 24 for(int i = firstValidPos+1; i <= lastValidPos; ++i) { 25 num = num*10 + (str[i]-'0'); 26 if(num > 2147483647) 27 return 2147483647; 28 } 29 30 } else if(str[firstValidPos] == '+') { 31 firstValidPos += 1; 32 if(firstValidPos == str.size() || !isdigit(str[firstValidPos])) { 33 return 0; 34 } 35 36 lastValidPos = firstValidPos+1; 37 while(isdigit(str[lastValidPos])){ 38 ++lastValidPos; 39 } 40 --lastValidPos; 41 42 num = str[firstValidPos] - '0'; 43 for(int i = firstValidPos+1; i <= lastValidPos; ++i) { 44 num = num*10 + (str[i]-'0'); 45 if(num > 2147483647) 46 return 2147483647; 47 48 } 49 50 51 } else if(str[firstValidPos] == '-') { 52 firstValidPos += 1; 53 if(firstValidPos == str.size() || !isdigit(str[firstValidPos])) { 54 return 0; 55 } 56 57 lastValidPos = firstValidPos+1; 58 while(isdigit(str[lastValidPos])){ 59 ++lastValidPos; 60 } 61 --lastValidPos; 62 63 num = str[firstValidPos] - '0'; 64 for(int i = firstValidPos+1; i <= lastValidPos; ++i) { 65 num = num*10 + (str[i]-'0'); 66 if(num >= 2147483648) 67 return -2147483648; 68 69 } 70 num = -num; 71 } // else return num; 72 73 return num; 74 75 } 76 };
复杂度分析#
时间复杂度:O(n)
空间复杂度:O(1)
(2) 提前判断#
1 class Solution { 2 public: 3 int strToInt(string str) { 4 if(str.empty()) 5 return 0; 6 7 int firstValidPos = 0; //第一个非空格符的下标 8 while(str[firstValidPos] == ' ') { 9 ++firstValidPos; 10 if(firstValidPos >= str.size()) 11 return 0; 12 } 13 14 int lastValidPos = 0; //最后一个合法的下标 15 int num = 0; //使用int,则后面要提前判断是否越界 16 if(isdigit(str[firstValidPos])) { 17 lastValidPos = firstValidPos+1; 18 while(isdigit(str[lastValidPos])){ 19 ++lastValidPos; 20 } 21 --lastValidPos; 22 23 num = str[firstValidPos] - '0'; 24 for(int i = firstValidPos+1; i <= lastValidPos; ++i) { 25 if(num > 214748364 || (num == 214748364 && str[i]-'0' > 7)) 26 return 2147483647; 27 28 num = num*10 + (str[i]-'0'); 29 } 30 31 } else if(str[firstValidPos] == '+') { 32 firstValidPos += 1; 33 if(firstValidPos == str.size() || !isdigit(str[firstValidPos])) { 34 return 0; 35 } 36 37 lastValidPos = firstValidPos+1; 38 while(isdigit(str[lastValidPos])){ 39 ++lastValidPos; 40 } 41 --lastValidPos; 42 43 num = str[firstValidPos] - '0'; 44 for(int i = firstValidPos+1; i <= lastValidPos; ++i) { 45 if(num > 214748364 || (num == 214748364 && str[i]-'0' > 7)) 46 return 2147483647; 47 48 num = num*10 + (str[i]-'0'); 49 } 50 51 52 } else if(str[firstValidPos] == '-') { 53 firstValidPos += 1; 54 if(firstValidPos == str.size() || !isdigit(str[firstValidPos])) { 55 return 0; 56 } 57 58 lastValidPos = firstValidPos+1; 59 while(isdigit(str[lastValidPos])){ 60 ++lastValidPos; 61 } 62 --lastValidPos; 63 64 num = str[firstValidPos] - '0'; 65 for(int i = firstValidPos+1; i <= lastValidPos; ++i) { 66 if(num > 214748364 || (num == 214748364 && str[i]-'0' > 7)) 67 return -2147483648; 68 69 num = num*10 + (str[i]-'0'); 70 } 71 num = -num; 72 } // else return num; 73 74 return num; 75 76 } 77 };
复杂度分析#
时间复杂度:O(n)
空间复杂度:O(1)
参考#
分类:
剑指Offer(第2版)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
2019-11-16 在Linux下使用gcc运行C语言程序
2018-11-16 编写求任意二叉树中一条最长的路径的算法,要求输出此路径上各结点的值及路径的长度。