前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >从0打卡leetcode之day9--字符串转整型

从0打卡leetcode之day9--字符串转整型

作者头像
帅地
发布2018-10-09 11:48:02
6040
发布2018-10-09 11:48:02
举报
文章被收录于专栏:苦逼的码农苦逼的码农

前言

好久没更新了,今天是开学的第一天,这学期选了门算法的课,打算好好刷下《算法导论》这本书,可能接下来会一边分享leetcode的刷题贴,一边分享自己在书上所学的一些算法。欢迎你一起和我学习坚持下去

题目描述

实现 atoi,将字符串转为整数。

在找到第一个非空字符之前,需要移除掉字符串中的空格字符。如果第一个非空字符是正号或负号,选取该符号,并将其与后面尽可能多的连续的数字组合起来,这部分字符即为整数的值。如果第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成整数。

字符串可以在形成整数的字符后面包括多余的字符,这些字符可以被忽略,它们对于函数没有影响。

当字符串中的第一个非空字符序列不是个有效的整数;或字符串为空;或字符串仅包含空白字符时,则不进行转换。

若函数不能执行有效的转换,返回 0。

说明:

假设我们的环境只能存储 32 位有符号整数,其数值范围是 [−231, 231 − 1]。如果数值超过可表示的范围,则返回 INT_MAX (231 − 1) 或 INT_MIN (−231) 。

示例 1:

代码语言:javascript
复制
输入: "42"
输出: 42

示例 2:

代码语言:javascript
复制
输入: "   -42"
输出: -42
解释: 第一个非空白字符为 '-', 它是一个负号。
     我们尽可能将负号与后面所有连续出现的数字组合起来,最后得到 -42 。

示例 3:

输入: “4193 with words” 输出: 4193 解释: 转换截止于数字 ‘3’ ,因为它的下一个字符不为数字。

示例 4:

代码语言:javascript
复制
输入: "words and 987"
输出: 0
解释: 第一个非空字符是 'w', 但它不是数字或正、负号。
     因此无法执行有效的转换。

示例 5:

代码语言:javascript
复制
输入: "-91283472332"
输出: -2147483648
解释: 数字 "-91283472332" 超过 32 位有符号整数范围。 
     因此返回 INT_MIN (−231)

解题

说真,有时候遇到这道题目描述很长的题,真的有点不想去看它,读个题意都花了好久,不过这也间接说明了自己刷的题实在是少。偷偷透露一下,有时候都不知道题目要我们干什么…..

刚开始的时候,以为像”0003333aaa”这样的字符串也返回0,提交的时候,根据系统的判断,前面的0也要像空格一样被忽略去掉。

对于这道题,我的想法很简单也很暴力,就是根据题目给的那些条件与限制,一条一条着去判断,虽然这道题不难,但觉得细节是真的挺多的,提交了好几次错误。

就是按照题目说的:

  1. 先去掉空格
  2. 判断正负数
  3. 用一个long的变量来保存目标整数,主要是为了方便判断该整数有没有越界。

直接上代码吧:

代码语言:javascript
复制
public int myAtoi(String str) {
        if(str == null){
            return 0;
        }
        int i = 0;//用来遍历字符串
        int flag = 1;
        long num = 0;

        //去除空格
        while(i < str.length() && str.charAt(i) == ' '){
            i++;
        }
        if(i < str.length() && str.charAt(i) == '-'){
            i++;
            flag = -1;
        }else if(i < str.length() && str.charAt(i) == '+'){
            i++;
            flag = 1;
        }

        while(i < str.length()){
            if(str.charAt(i) <= '9'&&str.charAt(i)>= '0'){
                num = num * 10 + (str.charAt(i) - 48)*flag;
                i++;
            }else{
                break;
            }
            //本来是放到最后来判断的,但是发现这个值还有可能超出long范围
            if(num > Integer.MAX_VALUE){
                return Integer.MAX_VALUE;
            }else if(num < Integer.MIN_VALUE){
                return Integer.MIN_VALUE;
            }
        }
        return (int)num;
    }

本来我是把num放到最后来判断正负数,有没有超出最大整数,但发现题目给出的整数,连long类型也存不下,所以就只能一遍处理一边判断了。

下面是我把这些代码处理了一下,感觉看起来简洁点,也放出来给大家参考,同时欢迎大家能给出更见简洁的代码。

代码语言:javascript
复制
public int myAtoi2(String str) {
        if(str == null )return 0;
        int len = str.length();//由于多次用到,用一个变量存起来
        int i = 0;//用来遍历字符串
        int flag = 1;//用来判断正负数
        long num = 0;//存放目标数
        char[] arr = str.toCharArray();
        //去除空格
        while(i < len && arr[i] == ' ')i++;
        //判断正负数
        if(i < len && (arr[i] == '-' || arr[i] == '+')){
            flag = arr[i]=='-'? -1 : 1;
            i++;
        }
        while(i < len){
            if(arr[i] <= '9'&&arr[i]>= '0'){
                num = num * 10 + (arr[i] - '0')*flag;
                i++;
            }else{
                break;
            }
            //本来是放到最后来判断的,但是发现这个值还有可能超出long范围
            if(num > Integer.MAX_VALUE){
                return Integer.MAX_VALUE;
            }else if(num < Integer.MIN_VALUE){
                return Integer.MIN_VALUE;
            }
        }
        return (int)num;
    }

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-09-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 帅地玩编程 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 题目描述
  • 解题
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档