asp.net网站开发工程师(c,三折页设计那个网站做的好,品牌设计的原则有哪些,网站开发公司广告word❓ 剑指 Offer 67. 把字符串转换成整数
难度#xff1a;中等
写一个函数 StrToInt#xff0c;实现把字符串转换成整数这个功能。不能使用 atoi 或者其他类似的库函数。
首先#xff0c;该函数会根据需要丢弃无用的开头空格字符#xff0c;直到寻找到第一个非空格的字符为…❓ 剑指 Offer 67. 把字符串转换成整数
难度中等
写一个函数 StrToInt实现把字符串转换成整数这个功能。不能使用 atoi 或者其他类似的库函数。
首先该函数会根据需要丢弃无用的开头空格字符直到寻找到第一个非空格的字符为止。
当我们寻找到的第一个非空字符为正或者负号时则将该符号与之后面尽可能多的连续数字组合起来作为该整数的正负号假如第一个非空字符是数字则直接将其与之后连续的数字字符组合起来形成整数。
该字符串除了有效的整数部分之后也可能会存在多余的字符这些字符可以被忽略它们对于函数不应该造成影响。
注意假如该字符串中的第一个非空格字符不是一个有效整数字符、字符串为空或字符串仅包含空白字符时则你的函数不需要进行转换。
在任何情况下若函数不能进行有效的转换时请返回 0。
说明
假设我们的环境只能存储 32 位大小的有符号整数那么其数值范围为 [ − 2 31 , 2 31 − 1 ] [−2^{31}, 2^{31} − 1] [−231,231−1]。如果数值超过这个范围请返回 INT_MAX (231 − 1) 或 INT_MIN (−231) 。
示例 1: 输入: “42” 输出: 42 示例 2: 输入: -42 输出: -42 解释: 第一个非空白字符为 ‘-’, 它是一个负号。 我们尽可能将负号与后面所有连续出现的数字组合起来最后得到 -42 。 示例 3: 输入: “4193 with words” 输出: 4193 解释: 转换截止于数字 ‘3’ 因为它的下一个字符不为数字。 示例 4: 输入: “words and 987” 输出: 0 解释: 第一个非空字符是 ‘w’, 但它不是数字或正、负号。 因此无法执行有效的转换。 示例 5: 输入: “-91283472332” 输出: -2147483648 解释: 数字 “-91283472332” 超过 32 位有符号整数范围。 因此返回 INT_MIN (−231) 。 注意本题与 8. 字符串转换整数 (atoi) 相同。
思路
根据题意有以下四种字符需要考虑
首部空格 删除之即可符号位 三种情况即 , - -新建一个变量 flag 保存符号位返回前判断正负即可。非数字字符 遇到首个非数字的字符时应立即跳出循环数字字符 字符转数字 “此数字的 ASCII 码” 与 “ 0 的 ASCII 码” 相减即str[i] - 0数字拼接 若从左向右遍历数字设当前位字符为 str[i] 当前位数字为 tmp 数字结果为 ans 则数字拼接公式为ans ans * 10 tmp 注意题目要求返回的数值范围应在 [ − 2 31 , 2 31 − 1 ] [-2^{31}, 2^{31} - 1] [−231,231−1]因此需要考虑数字越界问题。而由于题目指出 环境只能存储 32 位大小的有符号整数 因此判断数字越界时要始终保持 ans 在 int 类型的取值范围内。 如果为正 需要满足 (INT_MAX - tmp) / 10 ans 则一定不会越过 2 31 − 1 2^{31} - 1 231−1如果为负 需要满足 (INT_MIN tmp) / 10 ans则一定不会越过 − 2 31 -2^{31} −231
代码(C、Java)
C
class Solution {
public:int strToInt(string str) {if(str.empty() || str.size() 0) return 0;int ans 0, flag 0;for(int i 0; i str.size(); i){if(str[i] flag 0) continue; //去除开头空格字符else if((str[i] - || str[i] ) flag 0){ //第一个非空字符正负号flag str[i] - ? -1 : 1;}else if(str[i] 0 || str[i] 9){break;}else{int tmp str[i] - 0;flag flag 0 ? 1 : flag;if(flag 1){if((INT_MAX - tmp) / 10 ans) ans ans * 10 tmp;else return INT_MAX;}else{if(ans 0) ans * -1;if((INT_MIN tmp) / 10 ans) ans ans * 10 - tmp;else return INT_MIN;}}}return ans;}
};Java
class Solution {public int strToInt(String str) {if(str null || str.length() 0) return 0;int ans 0, flag 0;for(int i 0; i str.length(); i){if(str.charAt(i) flag 0) continue; //去除开头空格字符else if((str.charAt(i) - || str.charAt(i) ) flag 0){ //第一个非空字符正负号flag str.charAt(i) - ? -1 : 1;}else if(str.charAt(i) 0 || str.charAt(i) 9){break;}else{int tmp str.charAt(i) - 0;flag flag 0 ? 1 : flag;if(flag 1){if((Integer.MAX_VALUE - tmp) / 10 ans) ans ans * 10 tmp;else return Integer.MAX_VALUE;}else{if(ans 0) ans * -1;if((Integer.MIN_VALUE tmp) / 10 ans) ans ans * 10 - tmp;else return Integer.MIN_VALUE;}}}return ans;}
}运行结果 复杂度分析
时间复杂度 O ( n ) O(n) O(n)其中 n 为字符串的长度。我们只需要依次处理所有的字符处理每个字符需要的时间为 O ( 1 ) O(1) O(1)。空间复杂度 O ( 1 ) O(1) O(1)只需要常数空间存储。
题目来源力扣。 放弃一件事很容易每天能坚持一件事一定很酷一起每日一题吧 关注我LeetCode主页 / CSDN—力扣专栏每日更新 注 如有不足欢迎指正