题解 | #把字符串转换成整数#

把字符串转换成整数

http://www.nowcoder.com/practice/1277c681251b4372bdef344468e4f26e

题解一:模拟
解题思路:模拟考虑各种特殊情况:
1、负号“-”与正号“+”只能出现在第一个i=0的位置;
图片说明
2、不能出现除0~9与+、-之外的任何字符;
图片说明
3、不能出现前置零;
图片说明
4、最后结果判断是否越界(INT_MIN<=res<=INT_MAX);
特判所有的特殊情况后,如示例将字符串转换成整数:
图片说明

复杂度分析:
时间复杂度:O(n),遍历字符串
空间复杂度:O(1)

实现如下:

class Solution {
public:
    int StrToInt(string str) {
        int flag = 0;//标记数字正负
        long long res = 0;
        for (int i = 0; i < str.size(); ++i) {
            if (str[i] == '-' || str[i] == '+') {//判断第一个
                if (i != 0) return 0;
                flag = str[i] == '-' ? 1 : 0;
            }
            else if (str[i] >= '0'&&str[i]<='9') {//将字符串转变成int类型
                if (str[i] == '0') {
                    if (res == 0)return 0;//前置零的情况特判;
                    else res = res * 10 + 0;
                }
                else {
                    res = res * 10 + str[i] - '0';
                }
            }
            else {
                return 0;
            }
        }
        //负数
        if(flag){
            //负数
            res=-res;
            if(res<INT_MIN)return 0;//小于int最小值
            return res;
        }
        //正数
        if(res>INT_MAX)return 0;//大于int最大值
        return res;
    }
};

题解二:递归
解题思路:同题解一;
注意事项:注意递归的结束条件;
复杂度分析:
时间复杂度:O(n),遍历整个字符串
空间复杂度:O(n),递归最大深度;

实现如下:

class Solution {
public:
    long long res=0,flag=0; 
    void f(string &str,int i){
        if(i<str.size()){
            if (str[i] == '-' || str[i] == '+') {//判断第一个
                    if (i != 0) {res=0; return ;}
                    flag = str[i] == '-' ? 1 : 0;
            }else if(str[i] >= '0'&&str[i]<='9'){
                if (str[i] == '0') {
                        if (res == 0){res=0; return ;}//前置零的情况特判;
                        else {
                            res = res * 10 + 0;
                        }
                    }
                    else {
                        res = res * 10 + str[i] - '0';//将当前值计算到最终结果上
                    }
            }else{
                res=0; 
                return ;
            }
            f(str,i+1);//递归下一层
        }
    }
    int StrToInt(string str) {
        f(str,0);
        //处理最后的结果
       if(flag){
            //负数
            res=-res;
            if(res<INT_MIN)return 0;//小于int最小值
            return res;
        }
        //正数
        if(res>INT_MAX)return 0;//大于int最大值
        return res;
    }
};
牛客网编程题题解 文章被收录于专栏

本专栏记录在牛客网上AC的每一题,写下题解。 未来2年完成2000编程题的题解。 2021.12.29更新,最进准备毕设,断更了,会尽快做完毕设,继续做这一件事情

全部评论

相关推荐

1 收藏 评论
分享
正在热议
# 牛客帮帮团来啦!有问必答 #
1151203次浏览 17148人参与
# 通信和硬件还有转码的必要吗 #
11194次浏览 101人参与
# 不去互联网可以去金融科技 #
20335次浏览 255人参与
# 和牛牛一起刷题打卡 #
18899次浏览 1635人参与
# 实习与准备秋招该如何平衡 #
203348次浏览 3625人参与
# 大厂无回复,继续等待还是奔赴小厂 #
4970次浏览 30人参与
# OPPO开奖 #
19192次浏览 267人参与
# 通信硬件薪资爆料 #
265877次浏览 2484人参与
# 国企是理工四大天坑的最好选择吗 #
2220次浏览 34人参与
# 互联网公司评价 #
97672次浏览 1280人参与
# 简历无回复,你会继续海投还是优化再投? #
25034次浏览 354人参与
# 0offer是寒冬太冷还是我太菜 #
454821次浏览 5124人参与
# 国企和大厂硬件兄弟怎么选? #
53896次浏览 1012人参与
# 参加过提前批的机械人,你们还参加秋招么 #
14636次浏览 349人参与
# 硬件人的简历怎么写 #
82284次浏览 852人参与
# 面试被问第一学历差时该怎么回答 #
19393次浏览 213人参与
# 你见过最离谱的招聘要求是什么? #
28057次浏览 248人参与
# 学历对求职的影响 #
161224次浏览 1804人参与
# 你收到了团子的OC了吗 #
538675次浏览 6386人参与
# 你已经投递多少份简历了 #
344169次浏览 4963人参与
# 实习生应该准时下班吗 #
96965次浏览 722人参与
# 听劝,我这个简历该怎么改? #
63517次浏览 622人参与
牛客网
牛客企业服务