⭐️ 题目描述
🌟 O链接 https://www.nowcoder.com/practice/1277c681251b4372bdef344468e4f26e?tpId=13&&tqId=11202&rp=6&ru=/activity/oj&qru=/ta/coding-interviews/question-ranking
思路:
首先需要检查第一位是否有符号位,如果有符号位那么转换整数就是从下标为 1
开始,没有符号位就是从下标为 0
开始,当然也需要有一个变量来记录正负号。在转换中若遇到非数字字符则直接 return
,转换的时候还要考虑溢出的情况,需要使用一个精度比 int
高的类型来判断当前的值是否超出 int
的精度,因为 int
类型肯定不会超出 int
的精度,而 int
的最大值和最小值在库里有这样两个宏代表 INT_MAX
INT_MIN
,从高位依次转换 ans = ans * 10 + (str[is_symbol] - '0')
。
ps:
"123"
=> { ans = 0 * 10 + 1 } -> { ans = 1 * 10 + 2 } -> {ans = 12 * 10+ 3} -> { ans = 123 }
代码:
class Solution {
public:int StrToInt(string str) {// 检查第一位是否是符号位int is_symbol = 0; // 是否有符号位int mark = 1; // 默认正数if (str[0] == '+') {is_symbol = 1;} else if (str[0] == '-') {is_symbol = 1;mark = -1;}long long ans = 0;while (is_symbol < str.size()) {if (!isdigit(str[is_symbol])) { // 不是数字字符直接结束return 0;}ans = ans * 10 + (str[is_symbol] - '0');if (ans > INT_MAX || ans < INT_MIN) { // 大于整型最大值或者小于整型最大值直接结束return 0;}is_symbol++;} return (int)ans * mark;}
};