字符串转换整数 (atoi)

2023-11-14

字符串转换整数 (atoi)


请你来实现一个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 。

示例 4:

输入:s = “words and 987”

输出:0

解释:

第 1 步:”words and 987”(当前没有读入字符,因为没有前导空格)

第 2 步:”words and 987”(当前没有读入字符,因为这里不存在 ‘-‘ 或者 ‘+’)

第 3 步:”words and 987”(由于当前字符 ‘w’ 不是一个数字,所以读入停止)

解析得到整数 0 ,因为没有读入任何数字。

由于 0 在范围 [-231, 231 - 1] 内,最终结果为 0 。

示例 5:

输入:s = “-91283472332”

输出:-2147483648

解释:

第 1 步:”-91283472332”(当前没有读入字符,因为没有前导空格)

第 2 步:”-91283472332”(读入 ‘-‘ 字符,所以结果应该是负数)

第 3 步:”-91283472332”(读入 “91283472332”)

解析得到整数 -91283472332 。

由于 -91283472332 小于范围 [-231, 231 - 1] 的下界,最终结果被截断为 -231 = -2147483648 。

提示: * 0 <= s.length <= 200 * s 由英文字母(大写和小写)、数字(0-9)’ ‘’+’’-‘ 和 ’.’ 组成

解题思路


本题考查的逻辑问题比较繁琐,首先需要去除字符串前后的空格,判断是否为空,如果为空就返回往下走,判断符号,最后读取数字。

    • 本题中的空白字符只包括空格字符 ‘ ‘ 。
    • 除前导空格或数字后的其余字符串外,请勿忽略 任何其他字符。
    1. 双循环方式 —
    2. 定义字符串s, 并赋值为s = “42”;
    3. 去除前后空格并定义为str = s.strip();
    4. 定义bool类型sign = True;
    5. 定义r,并赋值为r = 0;
    6. 第一层循环判断符号和为空的情况;
    7. 第二层循环判断是否是整型,r = r*10,然后r = r + i;
    8. 判断是否是整型,在判断值是否大于2**31 - 1,如果大于返回r;
    9. 如果不大于2**31 - 1,判断值r大于2 ** 31,就返回0 - (2**31),否则返回0 - r;

      # s = "42"
      # s = "  -42"
      # s = "4193 with words"
      s = "words and 987"
      str = s.strip()
      sign = True
      r = 0
      
      for i in range(len(str)):
      if str[i] == "-":
          sign = False
          str = str[i+1:]
          break
      if str[i] == "+":
          str = str[i + 1:]
          break
      
      if s[i] != " ":
          s = s[i:]
          break
      
      for i in str:
      if i.isdigit():
          r *= 10
          r += int(i)
      else:
          break
      
      if sign:
      if r > 2**31 - 1:
          return 2 ** 31 - 1
      return r
      else:
      if r > 2 ** 31:
          return 0 - (2**31)
      return 0 - r
      
    10. 通过正则表达式的方式

    11. 定义字符串s, 并赋值为s = “42”;

    12. 去除前后空格并定义为str = s.strip();

    13. 通过正则表达式检查正负号有无以及是否为数字;

    14. 定义字符串news,并赋值为news = re.match(pattern, s);

    15. 如果过滤有正负号不是数字就返回0;

    16. 否则,先定义nums,并赋值为nums = int(news.group());

    17. 如果nums小于(n := -2 ** 31)否则nums大于(n := 2 ** 31 - 1),返回n,否则返回nums;

      s = "42"
      # s = "  -42"
      # s = "4193 with words"
      # s = "words and 987"
      s = s.strip(" ")  # 去除前端空格
      pattern = r'[+|-]?[0-9]+'  # 正则表达,检查正负号有无以及是否为数字
      news = re.match(pattern, s)
      if not news:
      return 0
      else:
      nums = int(news.group())
      if nums < (n := -2 ** 31) or nums > (n := 2 ** 31 - 1):
          return n
      else:
          return nums
      
    18. 双指针方式

    • 定义字符串s, 并赋值为s = “42”;
    • 定义start和end,并赋值为start = -1end = 0;
    • 第一层循环去除空格,和判断是否是整型,返回start = i,否则返回0;
    • 如果start == -1,返回0,将start值赋值为end;
    • 第二层循环判断是否是整型,将end += 1,否则往下走;
    • 定义为为result,并赋值为int(s[start:end + 1]);
    • 如果result大于2 ** 31 - 1返回2 ** 31 - 1,如果result小于-2 ** 31返回-2 ** 31,否则返回result;

      s = "42"
      # s = "  -42"
      # s = "4193 with words"
      # s = "words and 987"
      start = -1
      end = 0
      for i in range(len(s)):
      if s[i] == ' ':
          continue
      elif s[i] == '+' or s[i] == '-':
          if i < len(s) - 1 and s[i + 1].isdigit():
              start = i
              break
          else:
              return 0
      elif s[i].isdigit():
          start = i
          break
      else:
          return 0
      if start == -1:
      return 0
      end = start
      for i in range(start + 1, len(s)):
      if s[i].isdigit():
          end += 1
      else:
          break
      result = int(s[start:end + 1])
      if result > 2 ** 31 - 1:
      return 2 ** 31 - 1
      elif result < -2 ** 31:
      return -2 ** 31
      else:
      return result
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

字符串转换整数 (atoi) 的相关文章

随机推荐

  • doris同步作业配置参数修改和注意事项

    创建同步作业 创建数据同步作业的的详细语法可以连接到 Doris 后 执行 HELP CREATE SYNC JOB 查看语法帮助 这里主要详细介绍 创建作业时的注意事项 job name job name是数据同步作业在当前数据库内的唯一
  • 5-FreeSwitch-freeswitch开启录音和使用

    文章目录 一 开启 usr local freeswitch conf dialplan 后面的default添加配置 二 在freeswitch重新加载 F6 或者 reloadxml 三 使用录音 3 1单腿录音 方法一 API 方法二
  • Android Studio 运行 遇到 Failed to read key from keystore

    分享一下我老师大神的人工智能教程 零基础 通俗易懂 风趣幽默 还带黄段子 希望你也加入到我们人工智能的队伍中来 https blog csdn net jiangjunshow Error Execution failed for task
  • 成交量加权动量交易系统

    策略说明 基于动量系统 通过交易量加权进行判断 系统要素 用VWM上穿零轴判断多头趋势 入场条件 价格高于VWM上穿零轴时价格通道 且在SetupLen的BAR数目内 做多 出场条件 空头势多单出场 import DataAPI impor
  • 左式堆的合并

    二叉堆对于合并操作是困难的 因为需要把一个数组拷贝到另一个数组 左式堆可以高效的地支持合并操作 左式堆与二叉树之间唯一区别是 左式堆不是平衡的 可能非常趋向不平衡 左式堆的结构 typedef struct TreeNode element
  • DirectX12 3D游戏开发实践(龙书)第四章 Direct3D的初始化

    目录 Direct3D的初始化 预备知识 Direct3D概述 组件对象模型 纹理格式 Textures Formats 交换链和页面翻转 深度缓冲 资源与描述符 多重采样技术的原理 利用Direct3D进行多重采样 功能级别 Direct
  • 客观面试题--32.说下springmvc的五个常用注解?

    1 Controller 在SpringMVC 中 控制器Controller 负责处理由DispatcherServlet 分发的请求 它把用户请求的数据经过业务处理层处理之后封装成一个Model 然后再把该Model 返回给对应的Vie
  • Jenkins集成及在服务器上发布异常 解决方案汇总

    一 在jenkins上构建时出现问题 如下图所示 解决方案 1 单击红色圆球 找到控制台输出 根据错误提示 检查上传到SVN的代码是否完整无错 检出SVN所提交的代码在本地运行 看是否能够成功 二 未能找到类型或命名空间名称 是否缺少 us
  • lvgl-文本框学习篇(五)

    lvgl 文本框学习篇 五 学习材料 工具 QT Creator 5 12 3 lvgl 源代码 lvgl 官方标签例程 极客笔记 学习内容 过程 零件和样式 用法 添加文字 占位符 删除字符 移动光标 隐藏光标 光标闪烁时间 单行模式 密
  • 1050 螺旋矩阵

    本题要求将给定的 N 个正整数按非递增的顺序 填入 螺旋矩阵 所谓 螺旋矩阵 是指从左上角第 1 个格子开始 按顺时针螺旋方向填充 要求矩阵的规模为 m 行 n 列 满足条件 m n 等于 N m n 且 m n 取所有可能值中的最小值 输
  • idea设置JVM运行参数

    对JVM运行参数进行修改是JVM性能调优的重要手段 下面介绍在应用程序开发过程中JVM参数设置的几种方式 方式一 java程序运行时指定 Dproperty value 该参数通常用于设置系统级全局变量值 如配置文件路径 保证该属性在程序中
  • linux 虚拟化

    主旨 日常我们都在自己的windows或者mac电脑上 安装vmware软件 来虚拟linux服务器 那么我们是不是也可以通过在linux服务器上安装vmware软件 来虚拟出来其他的服务器呢 开整 优点 可以在一台服务器上虚拟出来几台服务
  • 03 面向对象(多态,接口)

    如果要求程序员必须在某个类中特定的方法中实现一个特定的功能 应该如何实现 使用抽象方法或者使用接口 interface 抽象方法只能单继承 不能多继承 子类必须使用里面的抽象方法 接口可以多继承 实现类必须重写里面的方法 接口的作用 接口是
  • MOS管泄漏电流简要分析

    待机状态下 晶体管的漏电分析 一个理想的MOS晶体管不应该有任何电流流入衬底或者阱中 当晶体管关闭的时候D S之间不应该存在任何的电流 但是 现实中MOS却存在各种不同的漏电流 漏电流一方面严重减小了低功耗设备的电池使用寿命 另一方面在某些
  • 《深度学习》读书笔记:第3章 概率与信息论

    目录 第3章 概率与信息论 3 1 为什么要使用概率 3 2 随机变量 3 3 概率分布 3 3 1 离散型变量和概率质量函数 3 3 2 连续型变量和概率密度函数 3 4 边缘概率 3 5 条件概率 3 6 条件概率的链式法则 3 7 独
  • 九、网络IO原理-创建ServerSocket的过程

    示例 创建ServerSocker过程 创建ServerSocket并注册端口号8090 ServerSocket server new ServerSocket 8090 while true 循环 final Socket socket
  • [Tools: tiny-cuda-nn] Linux安装

    official repo https github com NVlabs tiny cuda nn 该包可以显著提高NeRF训练速度 是Instant NGP Threestudio和NeRFstudio等框架中 必须使用的 1 命令行安
  • iOS开发之Runtime运行时机制

    摘要 Objective C是基于C加入了面向对象特性和消息转发机制的动态语言 除编译器之外 还需用Runtime系统来动态创建类和对象 进行消息发送和转发 作者通过分析Apple开源的Runtime代码来深入理解OC的Runtime机制
  • js实现模仿广告弹出并关闭弹窗

    css部分
  • 字符串转换整数 (atoi)

    字符串转换整数 atoi 请你来实现一个myAtoi string s 函数 使其能将字符串转换成一个 32 位有符号整数 类似 C C 中的 atoi 函数 函数myAtoi string s 的算法如下 读入字符串并丢弃无用的前导空格