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

把字符串转换成整数

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

描述
        将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0
输入描述:
        输入一个字符串,包括数字字母符号,可以为空
返回值描述:
        如果是合法的数值表达则返回该数字,否则返回0
示例1
输入:"+2147483647"
返回值:2147483647
请在这里输入引用内容
示例2
输入:"1a33"
返回值:0

方法一:逐个遍历并将字符转数字
        由题意可知输入的字符串转化为整数,而整数的定义只能是数字。而输入的字符串可能包括数字、符号、空格和英文字符。因此当字符串中存在英文字符则不符合题意;而符号位则表示最后的数字是正数还是负数,这里使用一个标志位记录即可;空格字符可以直接跳过;数字字符需要转化为对应的数字,采用ASCII转化即可。

图解:
图片说明

核心代码:(C++)

int StrToInt(string str) {
    int index = 0, flag = 1, len = str.size();   //标志位flag=1为正数;flag=-1为负数
    long long result = 0; 
    while (str[index] == ' ')      //过滤掉字符串前面的空格
        index ++;
    if(str[index] == '-' || str[index] == '+') {    //符号位判断,确定数字的正负
        if(str[index] == '-')      //负数的时候更改标志位
            flag = -1;
        index ++;
    } 

    while(index < len && isdigit(str[index])){      //循环转化字符串的每一位
        result = result * 10 + (str[index] - '0');     //计算的时候刚好是反过来的,比如123,则可以逐步分解为1 => 1*10+2 => (1*10+2)*10+3
        if(result >= INT_MAX && flag == 1)        //超过int的最大范围
            return INT_MAX;
        if(result > INT_MAX && flag == -1)      //小于int的最小范围
            return INT_MIN;
        index++;
    }
    if(index == len)
        return flag * result;
    else     //index<len表明字符串中存在英文字符
        return 0;
}

复杂度分析:
        代码使用了循环,循环次数为数组大小,因此该方法的时间复杂度为O(N)。由于没有采用额外的数组空间,空间复杂度为O(1)

时间复杂度O(n)
空间复杂度O(1)

方法二:采用正则匹配
        使用Python语言编写,采用Python里面的正则表达式解决字符判断和匹配的问题。具体步骤如下
1)首先去掉字符串的空格
2)如果是空字符串则直接返回0,否则进一步处理
3)存在+-标志位,则记录该标志位,并清理标志位
4)如果字符串只有空格和标志位,则直接返回0,否则进一步处理
5)匹配字符串中的英文字符,如果匹配上则不符合题意,直接返回0
6)将数字字符转转化为整型数字,同时根据标志位更新整型数字标志位并返回结果

核心代码:(Python)

def StrToInt(self, s):
    import re
    s = s.strip()    #去掉空格
    if len(s) > 0:
        flag = True
        if s[0] == '-':      #判断标志位
            flag = False
        s = s.strip("+-")     #去掉正负标志位
        if len(s) > 0:
            pattern = re.compile(r'[a-zA-Z]')     #匹配英文字符
            result = re.search(pattern, s)    #该方***扫描整个字符串
            if not result:                   #未匹配上英文字符
                result = int(result)    #将数字字符串转化为数字
                if not flag:          #判断并更新标志位
                    result = -result
                return result
    return 0

复杂度分析:
        代码search函数查找字符串数组,即扫描字符串,相当于遍历数组,因此该方法的时间复杂度为O(N)。由于采用了额外的数组空间,空间复杂度为O(N)

时间复杂度O(n)
空间复杂度O(1)

全部评论

相关推荐

程序员花海:实习和校招简历正确格式应该是教育背景+实习+项目经历+个人评价 其中项目经历注意要体现业务 实习经历里面的业务更是要自圆其说 简历模板尽可能保持干净整洁 不要太花哨的
点赞 评论 收藏
分享
想干测开的tomca...:让我来压力你!!!: 这份简历看着“技术词堆得满”,实则是“虚胖没干货”,槽点一抓一大把: 1. **项目描述是“技术名词报菜名”,没半分自己的实际价值** 不管是IntelliDoc还是人人探店,全是堆Redis、Elasticsearch、RAG这些时髦词,但你到底干了啥?“基于Redis Bitmap管理分片”是你写了核心逻辑还是只调用了API?“QPS提升至1500”是你独立压测优化的,还是团队成果你蹭着写?全程没“我负责XX模块”“解决了XX具体问题”,纯把技术文档里的术语扒下来凑字数,看着像“知道名词但没实际动手”的实习生抄的。 2. **短项目塞满超纲技术点,可信度直接***** IntelliDoc就干了5个月,又是RAG又是大模型流式响应又是RBAC权限,这堆活儿正经团队分工干都得小半年,你一个后端开发5个月能吃透这么多?明显是把能想到的技术全往里面塞,生怕别人知道你实际只做了个文件上传——这种“技术堆砌式造假”,面试官一眼就能看出水分。 3. **技能栏是“模糊词混子集合”,没半点硬核度** “熟悉HashMap底层”“了解JVM内存模型”——“熟悉”是能手写扩容逻辑?“了解”是能排查GC问题?全是模棱两可的词,既没对应项目里的实践,也没体现深度,等于白写;项目里用了Elasticsearch的KNN检索,技能栏里提都没提具体掌握程度,明显是“用过但不懂”的硬凑。 4. **教育背景和自我评价全是“无效信息垃圾”** GPA前10%这么好的牌,只列“Java程序设计”这种基础课,分布式、微服务这些后端核心课提都不提,白瞎了专业优势;自我评价那堆“积极认真、细心负责”,是从招聘网站抄的模板吧?没有任何和项目挂钩的具体事例,比如“解决过XX bug”“优化过XX性能”,纯废话,看完等于没看。 总结:这简历是“技术名词缝合怪+自我感动式凑数”,看着像“背了后端技术栈名词的应届生”,实则没干货、没重点、没可信度——面试官扫30秒就会丢一边,因为连“你能干嘛”都没说清楚。
点赞 评论 收藏
分享
评论
2
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务