【practise】string_atoi

简介: 【practise】string_atoi

今天来分享一道比较平常的练习题,说实话我自己写了半天,自己写的很烂最后还是看的答案…

1.题目概要

题目链接:LINK

2.题目难点

这个题目有两个难点,如下:

  • 拿到了全部都是数字字符的字符串,怎么将这个字符串转变成整数。
    对于这个问题,主要是字符转整形的问题。
  • 如何有效的判定该整数越界?
    对于这个问题,就有点难办了,如果说我们用一个INT_MAX去比较,怎么可能会比的出来,说白了就是int不能表示出比INT_MAX大的整数来。

3.难点解析

对于数字字符串转整数的问题,主要是ASCII码与数字转换的问题。

对于一个是数字字符串,我们可以用下面方法进行转换:

for(int i = 0; i < str.length(); i++)
{
  res = 10 * res + str[i] - '0';
}

对于字符串转整形是否溢出的问题,我现在知道两种方法。

第一种,用long long类型去替代int类型,这样去拿着INT_MAX值去比较就行了,因为longlong完全可以表示比INT_MAX大的数字了。

第二种,就是用一个比INT_MAX小10倍(并不是固定的)的值去标记,如果比这个标记值大了,那么意味着下一次相加大概率会溢出。

4.代码呈现

class Solution {
public:
    int myAtoi(string str) {
        int res = 0, bundry = INT_MAX / 10;
        int length = str.size(), i = 0, signal = 1;
        // 1.空字符串直接返回0
        if(length == 0) return 0;
        // 2.跳过前导空格
        while(str[i] == ' ') i++;
        if(i == length) return 0; // 一个字符串全是前导空格,也返回空
        // 3.尝试读符号
        if(str[i] == '-') signal = -1;
        if(str[i] == '-' || str[i] == '+') i++;
        // 4.开始解析字符串
        for(int j = i; j < length; j++)
        {
            if(!isdigit(str[j])) break;// 读到非数字,直接break
            if(res > bundry || res == bundry && str[j] > '7') return res = signal == 1 ? INT_MAX : INT_MIN; // 处理溢出问题
            
            res = 10 * res + (str[j] - '0');
        }
        // 5.正常返回
        return signal * res;
    }
};

下面是每一步详细的想法:

#define _CRT_SECURE_NO_WARNINGS 1
#include<string>
using namespace std;
class Solution {
public:
    int myAtoi(string str) {
        int res = 0, // 储存结果的变量
            bndry = INT_MAX / 10; // 边界标志,该最大值是2^31-1,边界值是(2^31-1) / 10
        int i = 0,
            sign = 1, // 符号位
            length = str.size(); //字符长度
        if (length == 0) return 0; //特殊情况:空字符串,直接返回0
        while (str[i] == ' ') //跳过空格
            if (++i == length) return 0; //整个字符串都为空格,返回0
        if (str[i] == '-') sign = -1; //读到负号,把符号位置为-1
        if (str[i] == '-' || str[i] == '+') i++; // i读到符号位后向后走一个
        for (int j = i; j < length; j++) {
            if (str[j] < '0' || str[j] > '9') break; //读到非数字字符,直接break
            if (res > bndry || res == bndry && str[j] > '7') // 越界情况
                return sign == 1 ? INT_MAX : INT_MIN;
            res = res * 10 + (str[j] - '0'); // 正常拼接
            // res初始值是0,第一次0*10还等于0再加上数值刚好。
        }
        return sign * res; // 正常返回
    }
};

注:本文部分内容引用自力扣,链接


EOF


相关文章
|
Python
TypeError: int() argument must be a string, a bytes原因
Python开发过程中,使用int()函数来转换或生成int类型的数据时,如果Python抛出并提示TypeError: int() argument must be a string, a bytes-like object or a real number, not 'complex',那么原因在于传递给int()函数的参数类型有误,正如TypeError的提示,int()函数的参数必须是string字符串(数值字符串)、类似字节对象、real number数字等,而不可以是complex复数类型的数据。
353 0
解决Format string is not a string literal (potentially insecure)问题
在用宏实现部分字符串格式化问题时,stringWithFormat方法会出现【Format string is not a string literal (potentially insecure)】警告
449 0
|
算法 C++
C++中stoi(),atoi() ,to_string()使用技巧
这几个函数都是对字符串处理的函数
3078 0
|
Python
__str__ returned non-string (type int)
打开微信扫一扫,关注微信公众号【数据与算法联盟】 转载请注明出处:http://blog.csdn.net/gamer_gyt 博主微博:http://weibo.com/234654758 Github:https://github.com/thinkgamer 前言 这个问题是我在做这个项目【点击查看】时遇到的,主要是因为以前在使用django的models时,在models的str(self) 函数时,默认返回的字段都是CharField类型的,而在这次返回了一个IntegerField类型导致出现了题目中的错误。
2639 0
|
C语言
deprecated conversion from string constant to ‘char*’
deprecated conversion from string constant to ‘char*’ #include using namespace std; int fuc(char *a) { cout
977 0