leecode刷题(16)-- 字符串转换整数

字符串转换整数

描述:

请你来实现一个 atoi 函数,使其能将字符串转换成整数。

首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。

当我们寻找到的第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字组合起来,作为该整数的正负号;假如第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成整数。

该字符串除了有效的整数部分之后也可能会存在多余的字符,这些字符可以被忽略,它们对于函数不应该造成影响。

注意:假如该字符串中的第一个非空格字符不是一个有效整数字符、字符串为空或字符串仅包含空白字符时,则你的函数不需要进行转换。

在任何情况下,若函数不能进行有效的转换时,请返回 0。

说明:

假设我们的环境只能存储 32 位大小的有符号整数,那么其数值范围为 [−231, 231 − 1]。如果数值超过这个范围,请返回 INT_MAX (2^31 − 1) 或 INT_MIN (−2^31) 。

示例 1:

输入: "42"
输出: 42

示例 2:

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

示例 3:

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

示例 4:

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

示例 5:

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

思路:

这道题其实就是多个条件判断:

  1. 判断字符串开头是否是空格字符;
  2. 判断是否存在除了 -+ 的非数字字符;
  3. 如果有正负的话执行正负判断
  4. 判断数值是否发生溢出。

当我们执行了这些判断后,只需要定义一个初始值 base = 0,定义数组下标 i,从前往后遍历,将遍历到的符合条件的字符依次排序,便能将字符串转换为整数了。

代码如下:

class Solution {
public int myAtoi(String str) {
if(str == null || str.length() == 0) {
return 0;
}
//正负号判断,转换值,索引位数
int sign = 1, base = 0, i = 0;
//剔除开始空白字符
while(i < str.length() && str.charAt(i) == ' '){
i++;
}
//判断正负号
if(i < str.length() && (str.charAt(i) == '-' || str.charAt(i) == '+')){
sign = str.charAt(i++) == '-' ? -1 : 1;
}
//索引有效数字字符
while(i < str.length() && str.charAt(i) >= '0' && str.charAt(i) <= '9'){
if(base > Integer.MAX_VALUE / 10 || (base == Integer.MAX_VALUE / 10 && str.charAt(i) - '0' > 7)){
return (sign == 1) ? Integer.MAX_VALUE : Integer.MIN_VALUE;
}
//计算转换值
base = 10 * base + (str.charAt(i++) - '0');
}
//计算结果值
return base * sign;
}
}

解释:

这里我们需要在每个判断语句中加入 i < str.length() ,不然通不过 Leecode 提交。

然后代码中的单引号不能换成双引号,意义不一样,单引号引的数据是 char 类型,双引号引的数据是 string 类型。

然后可以看到代码中有base = 10 * base + (str.charAt(i++) - '0'); 这样的,其中的 - 代表ascii转换,将字符转换为数字。

最后我们看一下数值溢出这块,其实我在之前的博文中有写:leecode刷题(12)-- 整数反转

假设 base为正数,如果 base = 10 * base + (str.charAt(i++) - '0') 发生溢出,那么一定有 base >= INT_MAX / 10 。

同样的,当 base为负数时,rev <= INT_MIN / 10 会发生溢出。

同时我们需要注意 (str.charAt(i++) - '0') 的数值,题目中整数的数值范围为 [−2^31, 2^31 − 1],2^31-1=2147483647, -2^31=-2147483648,注意最后一位数,即 7 = INT_MAX % 10, 8 = INT_MIN % 10。

这里我们默认判断数值是否超出整数的最大值范围就好了(假设是正整数),如果有,判断正负,正数返回 INT_MAX,负数返回 INT_MIN。

leecode刷题(16)-- 字符串转换整数的更多相关文章

  1. LeetCode随缘刷题之字符串转换整数

    package leetcode.day_01_29; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * 请你 ...

  2. leecode刷题(12)-- 整数反转

    leecode刷题(12)-- 整数反转 整数反转 描述: 给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转. 示例 1: 输入: 123 输出: 321 示例 2: 输入: - ...

  3. leecode第八题(字符串转换整数 (atoi))

    ;//判断返回0是因为错误还是真的是0 class Solution { public: int myAtoi(string str) {//写的很丑 if (str=="") ; ...

  4. leecode刷题(15)-- 验证回文字符串

    leecode刷题(15)-- 验证回文字符串 验证回文字符串 给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写. 说明:本题中,我们将空字符串定义为有效的回文串. 示例 ...

  5. leecode刷题(13) -- 字符串中的第一个唯一字符

    leecode刷题(13) -- 字符串中的第一个唯一字符 字符串中的第一个唯一字符 描述: 给定一个字符串,找到它的第一个不重复的字符,并返回它的索引.如果不存在,则返回 -1. 案例: s = & ...

  6. leecode刷题(11)-- 反转字符串

    leecode刷题(11)-- 反转字符串 反转字符串 描述: 编写一个函数,其作用是将输入的字符串反转过来. 示例 1: 输入: "hello" 输出: "olleh& ...

  7. leecode刷题(18)-- 报数

    leecode刷题(18)-- 报数 报数 描述: 报数序列是一个整数序列,按照其中的整数的顺序进行报数,得到下一个数.其前五项如下: 1. 1 2. 11 3. 21 4. 1211 5. 1112 ...

  8. leecode刷题(31) -- 回文数

    leecode刷题(31) -- 回文数 回文数 判断一个整数是否是回文数.回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数. 示例 1: 输入: 121 输出: true 示例 2: 输 ...

  9. leecode刷题(19)-- 最长公共前缀

    leecode刷题(19)-- 最长公共前缀 最长公共前缀 编写一个函数来查找字符串数组中的最长公共前缀. 如果不存在公共前缀,返回空字符串 "". 示例 1: 输入: [&quo ...

随机推荐

  1. Symfony 建立一个Bundle

    如果说,这个时候你萌生了一个去看一看Symfony源码的想法,个人建议还是算了,看了之后,你就会感到非常迷茫.因为他实在是大于绝大部分你使用过的框架,并且有多达近二十个的插件,使用了一些非常精巧的设计 ...

  2. Linux-CentOS 更新Firefox版本

    1.用你本地的旧版 firefox,访问http://www.firefox.com.cn,下载Linux版本的Firefox. 2.进入存放下载文件(Firefox-latest-x86_64.ta ...

  3. 关于Url传递参数

    Url传递参数时,后台取值会直接取等号后面的内容,包括引号在内. 比如:   http://localhost:8080/user?name='admin' 这是错误的做法,后台获取到的参数是包括引号 ...

  4. 怎样查看lInux系统中的所有运行进程

    可以使用ps命令.它能显示当前运行中进程的相关信息,包括进程的PID.Linux和UNIX都支持ps命令,显示所有运行中进程的相关信息. ps命令能提供一份当前进程的快照.如果想状态可以自动刷新,可以 ...

  5. Redis高可用及分片集群

    一.主从复制 使用异步复制 一个服务器可以有多个从服务器 从服务器也可以有自己的从服务器 复制功能不会阻塞主服务器 可以通过服务功能来上主服务器免于持久化操作,由从服务器去执行持久化操作即可. 以下是 ...

  6. kafka常用运维命令

    列出所有topic:bin/kafka-topics.sh --zookeeper localhost:2181 --list说明:其实就是去检查zk上节点的/brokers/topics子节点,打印 ...

  7. [SoapUI] 通过Groovy脚本获取project所在的路径或者直接用${projectDir}

    import com.eviware.soapui.support.GroovyUtils def groovyUtils = new GroovyUtils( context ) def proje ...

  8. DataStage 一、安装

    安装的详细信息记录于文档中,文档下载地址:http://pan.baidu.com/s/1pJCF9uN 密码: y2ry ;文档内容目录如下: DataStage 一.介绍和安装.......... ...

  9. 一起做RGB-D SLAM (6)

    第六讲 图优化工具g2o的入门 2016.11 更新 把原文的SIFT替换成了ORB,这样你可以在没有nonfree模块下使用本程序了. OpenCV可以使用 apt-get install libo ...

  10. 【转】java.sql.SQLException: statement is closed语句被关闭 druid连接池报错

    我之前在用druid 1.0.28版本也出现过这个问题, 现象就是: 报这个错的时候, 往往会出现在一条毫无错误的sql执行上报错,  sql放到数据库上执行或者单独拎出来执行完全没问题, 但是为什么 ...