首页 > 其他分享 > #yyds干货盘点# LeetCode面试题:字符串转换整数 (atoi)

#yyds干货盘点# LeetCode面试题:字符串转换整数 (atoi)

时间:2023-02-08 18:32:32浏览次数:49  
标签:yyds 面试题 end 字符 42 4193 atoi 读入 231

1.简述:

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

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

读入字符串并丢弃无用的前导空格

检查下一个字符(假设还未到字符末尾)为正还是负号,读取该字符(如果有)。 确定最终结果是负数还是正数。 如果两者都不存在,则假定结果为正。

读入下一个字符,直到到达下一个非数字字符或到达输入的结尾。字符串的其余部分将被忽略。

将前面步骤读入的这些数字转换为整数(即,"123" -> 123, "0032" -> 32)。如果没有读入数字,则整数为 0 。必要时更改符号(从步骤 2 开始)。

如果整数数超过 32 位有符号整数范围 [−231,  231 − 1] ,需要截断这个整数,使其保持在这个范围内。具体来说,小于 −231 的整数应该被固定为 −231 ,大于 231 − 1 的整数应该被固定为 231 − 1 。

返回整数作为最终结果。

注意:

本题中的空白字符只包括空格字符 ' ' 。

除前导空格或数字后的其余字符串外,请勿忽略 任何其他字符。

 

示例 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 。

2.代码实现:

class Solution {
public int myAtoi(String str) {
Automaton automaton = new Automaton();
int length = str.length();
for (int i = 0; i < length; ++i) {
automaton.get(str.charAt(i));
}
return (int) (automaton.sign * automaton.ans);
}
}

class Automaton {
public int sign = 1;
public long ans = 0;
private String state = "start";
private Map<String, String[]> table = new HashMap<String, String[]>() {{
put("start", new String[]{"start", "signed", "in_number", "end"});
put("signed", new String[]{"end", "end", "in_number", "end"});
put("in_number", new String[]{"end", "end", "in_number", "end"});
put("end", new String[]{"end", "end", "end", "end"});
}};

public void get(char c) {
state = table.get(state)[get_col(c)];
if ("in_number".equals(state)) {
ans = ans * 10 + c - '0';
ans = sign == 1 ? Math.min(ans, (long) Integer.MAX_VALUE) : Math.min(ans, -(long) Integer.MIN_VALUE);
} else if ("signed".equals(state)) {
sign = c == '+' ? 1 : -1;
}
}

private int get_col(char c) {
if (c == ' ') {
return 0;
}
if (c == '+' || c == '-') {
return 1;
}
if (Character.isDigit(c)) {
return 2;
}
return 3;
}
}

标签:yyds,面试题,end,字符,42,4193,atoi,读入,231
From: https://blog.51cto.com/u_15488507/6044716

相关文章

  • 前端面试题(1) js
    keywords:JS深拷贝深拷贝:针对【引用】类型,传递的是地址,多变量同时指向同一块内存地址(比如某个对象)letobj1={ //1.不需要处理 //基本数据类型可以不做处理,typeof!==......
  • vue春招面试题
       一、MVVM模型●model->data数据●view->dom模型,●viewModel->视图模型,实例。相当于一个桥梁 二、Vue中响应式数据的理解  三、Vue如何检测数组变化......
  • tcp三次握手,四次挥手(面试题)
    tcp三次握手1.第一次握手:客户端给服务器发送一个syn报文;2.第二次握手:服务器收到SYN报文之后,会应答一个SYN+ACK报文;3.第三次握手:客户端收到SYN+ACK报文之后,会回应......
  • java面试题(四)
    1.java面试题(四)1.1cap理论,base理论1.Consistency(一致性):即更新操作成功并返回客户端后,所有节点在同一时间的数据完全一致。对于客户端来说,一致性指的是并发访问......
  • #yyds干货盘点#Bable是怎样工作的
    作为一个有追求的前端,如果你没有听过Babel的大名,那就真的是out了。不过说实话不太了解Babel的话,其实对日常开发的影响也不大,因为很多脚手架已经配置好了,不用自己折腾。但是......
  • #yyds干货盘点#【愚公系列】2023年02月 微信小程序-电商项目-商品详情页面运费说明
    前言vant-weapp的van-cell单元格apiCellGroupProps参数说明类型默认值title分组标题string-insetv1.7.2是否展示为圆角卡片风格booleanfalsebo......
  • 参加的面试题
    一、mysql优化的方法1、选择最合适的字段类型   Mysql是一种关系型数据库,表越小询也就越快。因此,在创建表将表中字段的宽度舍得尽可能小。2、尽量把字段设置为NOTNU......
  • #yyds干货盘点# LeetCode程序员面试金典:括号
    题目:括号。设计一种算法,打印n对括号的所有合法的(例如,开闭一一对应)组合。说明:解集不能包含重复的子集。例如,给出 n=3,生成结果为:[ "((()))", "(()())", "(())()", ......
  • #yyds干货盘点# LeetCode面试题:整数反转
    1.简述:给你一个32位的有符号整数x,返回将x中的数字部分反转后的结果。如果反转后整数超过32位的有符号整数的范围 [−231, 231 −1],就返回0。假设环境不允许......
  • #yyds干货盘点 歌谣学前端之react三个api之一
    前言我是歌谣我有个兄弟巅峰的时候排名c站总榜19叫前端小歌谣曾经我花了三年的时间创作了他现在我要用五年的时间超越他今天又是接近兄弟的一天人生难免坎坷大不了从......