题目:

请你来实现一个 myAtoi(string s) 函数,使其能将字符串转换成一个 32 位有符号整数(类似 C/C++ 中的 atoi 函数)。

函数 myAtoi(string s) 的算法如下:

1.读入字符串并丢弃无用的前导空格
2.检查下一个字符(假设还未到字符末尾)为正还是负号,读取该字符(如果有)。 确定最终结果是负数还是正数。 如果两者都不存在,则假定结果为正。
3.读入下一个字符,直到到达下一个非数字字符或到达输入的结尾。字符串的其余部分将被忽略。
4.将前面步骤读入的这些数字转换为整数(即,"123" -> 123, "0032" -> 32)。如果没有读入数字,则整数为 0 。必要时更改符号(从步骤 2 开始)。
5.如果整数数超过 32 位有符号整数范围 [−231,  231 − 1] ,需要截断这个整数,使其保持在这个范围内。具体来说,小于 −231 的整数应该被固定为 −231 ,大于 231 − 1 的整数应该被固定为 231 − 1 。
6.返回整数作为最终结果。
注意:

本题中的空白字符只包括空格字符 ' ' 。
除前导空格或数字后的其余字符串外,请勿忽略 任何其他字符。

示例 1:

输入:s = "42"
输出:42
解释:加粗的字符串为已经读入的字符,插入符号是当前读取的字符。
第 1 步:"42"(当前没有读入字符,因为没有前导空格)
^
第 2 步:"42"(当前没有读入字符,因为这里不存在 '-' 或者 '+')
^
第 3 步:"42"(读入 "42")
^
解析得到整数 42 。
由于 "42" 在范围 [-231, 231 - 1] 内,最终结果为 42 。
示例 2:

输入:s = " -42"
输出:-42
解释:
第 1 步:" -42"(读入前导空格,但忽视掉)
^
第 2 步:" -42"(读入 '-' 字符,所以结果应该是负数)
^
第 3 步:" -42"(读入 "42")
^
解析得到整数 -42 。
由于 "-42" 在范围 [-231, 231 - 1] 内,最终结果为 -42 。
示例 3:

输入:s = "4193 with words"
输出:4193
解释:
第 1 步:"4193 with words"(当前没有读入字符,因为没有前导空格)
^
第 2 步:"4193 with words"(当前没有读入字符,因为这里不存在 '-' 或者 '+')
^
第 3 步:"4193 with words"(读入 "4193";由于下一个字符不是一个数字,所以读入停止)
^
解析得到整数 4193 。
由于 "4193" 在范围 [-231, 231 - 1] 内,最终结果为 4193 。

提示:

0 <= s.length <= 200
s 由英文字母(大写和小写)、数字(0-9)、' '、'+'、'-' 和 '.' 组成

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/string-to-integer-atoi
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路:

1.要求1需要忽略掉前导空格,首先就需要先判断是否有前导空格,如果有前导空格就跳过,还需要考虑特殊用例的情况,如果直到字符串的末尾都为空格,则直接返回0;

2.对剩下的字符进行转换:

  • 首先判断第一个符号字符,记录整数的正负性;
  • 然后遍历其余字符,计算整数的值,直到字符串的结尾或者遍历到数字字符为止。在计算整数值时,因为已经记录过整数的正负性,故只用管数值就行,遍历到新的数字字符,当前数值res=遍历过的数字res10+新遍历的数字(例如:432 --> 4,4x10+3, 43x10+2),处理整数的时候需要判断是否超过32位有符号整数界限:
    • 首先令最大值MAX =  Integer.MAX_VALUE / 10
    • 如果当前计算出的整数 res > MAX,更新数字需要×10+新遍历的数字肯定会超出范围,这时如果是正数就返回
      Integer.MAX_VALUE,如果是负数就返回  Integer.MIN_VALUE;
    • 如果当前计算出的整数 res == MAX,就判断新遍历的数字是否会导致更新后的res越界,Integer.MAX_VALUE = 2147483647, Integer.MIN_VALUE=-2147483648,正数情况下,新遍历的字符 > 7则越界,返回Integer.MAX_VALUE,负数情况下,新遍历的字符 > 8(负数越大越小)则越界,返回Integer.MIN_VALUE。
  • 如果正常情况没有越界,计算出最终整数值加上正负性符号返回即可。

代码:

 1 class Solution {
2 public int myAtoi(String s) {
3 int n = s.length();
4 char[] array = s.toCharArray();
5 //条件1:丢弃无用前导空格
6 int index = 0;
7 while(index < n && array[index] == ' '){
8 index++;
9 }
10 //特殊用例 " "
11 if(index == n)
12 return 0;
13 //条件2:判断符号字符的正负
14 int sign = 1;
15 char signchar = array[index];
16 if(signchar == '+'){
17 index++;
18 }else if(signchar == '-'){
19 index++;
20 sign = -1;
21 }
22 //后续条件
23 int res = 0;
24 while(index < n){
25 char currchar = array[index];
26 //如果数字不合法直接退出
27 if(currchar < '0' || currchar > '9')
28 break;
29 //处理越界
30 final int MAX = Integer.MAX_VALUE / 10;
31 int digit = currchar - '0';
32 if(res > MAX){
33 return sign > 0 ? Integer.MAX_VALUE : Integer.MIN_VALUE;
34 }else if(res == MAX){
35 if(sign > 0 && digit > 7){
36 return Integer.MAX_VALUE;
37 }else if(sign < 0 && digit > 8){
38 return Integer.MIN_VALUE;
39 }
40 }
41 res = res * 10 + digit;
42 index++;
43 }
44 return res * sign;
45 }
46 }

力扣8(java)-字符串转整数(atoi)(中等)的更多相关文章

  1. 字符串转换整数 (atoi) C++实现 java实现 leetcode系列(八)

    字符串转换整数 (atoi) java实现 C++实现 请你来实现一个 atoi 函数,使其能将字符串转换成整数. 首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止. 当 ...

  2. 前端与算法 leetcode 8. 字符串转换整数 (atoi)

    目录 # 前端与算法 leetcode 8. 字符串转换整数 (atoi) 题目描述 概要 提示 解析 解法一:正则 解法二:api 解法二:手搓一个api 算法 传入测试用例的运行结果 执行结果 G ...

  3. LeetCode 8. 字符串转换整数 (atoi)(String to Integer (atoi))

    8. 字符串转换整数 (atoi) 8. String to Integer (atoi) 题目描述 LeetCode LeetCode8. String to Integer (atoi)中等 Ja ...

  4. 17、字符串转换整数 (atoi)

    17.字符串转换整数 (atoi) 请你来实现一个 atoi 函数,使其能将字符串转换成整数. 首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止. 当我们寻找到的第一个非 ...

  5. LeetCode8. 字符串转整数 (atoi)

    8. 字符串转整数 (atoi) 描述 实现 atoi,将字符串转为整数. 在找到第一个非空字符之前,需要移除掉字符串中的空格字符.如果第一个非空字符是正号或负号,选取该符号,并将其与后面尽可能多的连 ...

  6. 8. 字符串转换整数 (atoi)

    8. 字符串转换整数 (atoi) 方法一 import re import math class Solution(object): def myAtoi(self, str): "&qu ...

  7. LeetCode Golang 8. 字符串转换整数 (atoi)

    8. 字符串转换整数 (atoi) 首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止. 当我们寻找到的第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字组 ...

  8. PHP算法之字符串转换整数 (atoi)

    请你来实现一个 atoi 函数,使其能将字符串转换成整数. 首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止. 当我们寻找到的第一个非空字符为正或者负号时,则将该符号与之 ...

  9. 【每日一题】【字符串与数字互转】【去除空格】【大数处理】2021年12月12日-8. 字符串转换整数 (atoi)

    请你来实现一个 myAtoi(string s) 函数,使其能将字符串转换成一个 32 位有符号整数(类似 C/C++ 中的 atoi 函数). 函数 myAtoi(string s) 的算法如下: ...

  10. 刷题-力扣-541. 反转字符串 II

    541. 反转字符串 II 题目链接 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/reverse-string-ii 著作权归领扣网络所有. ...

随机推荐

  1. SpringBoot+内置Tomcat配置,参数调优,最大并发量,最大连接数

    最近在研究这块的信息,记录下一些大神的文章: SpringBoot 最大连接数及最大并发数是多少???https://blog.csdn.net/weixin_44421461/article/det ...

  2. Linux Daemon & 单例模式 设计与实现

    PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明   本文作为本人csdn blog的主站的备份.(Bl ...

  3. spring 整体框架介绍

    一.什么是Spring? 二.Spring能够解决什么问题? 三.Spring整体架构

  4. 2023年VR虚拟现实的10个应用行业

    1.医疗保健 现代医疗保健的培训方式离不开VR虚拟现实..由于医疗行业的特殊性,不允许拿大量的病人来练手,但医疗又非常注重实践,一些新手医生就缺乏锻炼的机会,而VR虚拟现实技术很好的解决了这一问题.医 ...

  5. FTP的安装和使用

    实验环境: windows server虚拟机一台 网络适配器:vmnet1 ip:192.168.1.220 一.安装FTP服务 打开服务器管理器 点击添加角色,勾IIS,点击下一步直到对话框消失 ...

  6. 记录--前端换肤方案 - element+less无感换肤(无需页面刷新)

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前端换肤方案 - element+less无感换肤(无需页面刷新) 前言 前不久在改造一个迭代了一年多的项目时,增加了一个换肤功能.通过自 ...

  7. dynatrace监控发现Java代码中new对象耗时100多秒

    排查代码发现两个原因: 1.流,之前用的字节流,通过打日志发现并发场景有效率问题,改为了字符流: 2.用的jaxb转换xml,也是在并发时效率急剧下降,发现在每次转换时都在创建新对象,修改为只有第一次 ...

  8. 《.NET内存管理宝典 》(Pro .NET Memory Management) 阅读指南 - 第1章

    本章勘误: 暂无,等待细心的你告诉我哦. 本章注解: 第7页图1-4下面的第一段:堆栈从一开始就与计算机编程有着内在的联系,这主要是因为子例程的概念 什么是子例程呢? 一般地认为,子例程是某个主程序的 ...

  9. 基于proteus的4026的二分频计数

    基于proteus的4026的二分频计数 1.芯片原理 4026还是一个CMOS芯片,是直接输出段码的计数器.显然,这个芯片的作用就是和七段数码管配合,直接将计数结果显示在数码管上.这里只是用于分频, ...

  10. KingbaseES V8R3 表加密

    前言 透明加密是指将数据库page加密后写入磁盘,当需要读取对应page时进行加密读取.此过程对于用户是透明, 用户无需干预. 该文档进行数据库V8R3版本测试透明加密功能,需要说明,该版本发布时间早 ...