【力扣算法11】之 8. 字符串转换整数 (atoi) python

news2024/11/24 8:50:42

文章目录

  • 问题描述
    • 示例1
    • 示例2
    • 示例3
    • 提示
  • 思路分析
  • 代码分析
  • 完整代码
  • 详细分析
  • 运行效果截图
    • 调用示例
    • 运行结果
  • 完结

问题描述

在这里插入图片描述

请你来实现一个 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)、’ ‘、’+‘、’-’ 和 ‘.’ 组成

思路分析

在这里插入图片描述

  1. 去除无用的前导空格:使用strip()函数去除字符串前后的空格。
  2. 检查符号位:判断第一个字符是否为正号或负号,若是则记录正负号,并将剩下的字符串赋给变量s。
  3. 读取数字字符并转换为整数:遍历字符串s的每个字符,判断是否为数字字符,如果是则将其转换为整数并累加到result中;如果遇到非数字字符,则跳出循环。
  4. 处理溢出情况:根据符号位判断最终结果的正负,并判断是否超出32位有符号整数范围[-2^31, 2^31-1],如果超出则返回范围边界值,否则返回result作为最终结果。

代码分析

在这里插入图片描述

  1. 读入字符串并丢弃无用的前导空格:使用 strip() 函数去除字符串前后的空格,将处理后的结果重新赋值给变量 s。这样可以消除输入字符串头部和尾部的空格。

  2. 检查符号:定义变量 sign 并初始化为 1(正号)。如果字符串 s 非空,并且第一个字符是正号或负号,则根据符号字符决定 sign 的值。如果第一个字符是负号,则将 sign 赋值为 -1,并将剩下的字符串赋给变量 s。这样可以确定最终结果的正负。

  3. 读取数字字符并转换为整数:定义变量 result 并初始化为 0。使用循环遍历变量 s 的每个字符 c,判断字符 c 是否是数字字符。如果是,将其转换为整数并累加到 result 上,通过乘以 10 来实现每次累加位数的增加。如果遇到非数字字符,跳出循环。这样可以逐个读取字符串中的数字字符,并计算出对应的整数值。

  4. 处理溢出情况:将 result 乘以符号位 sign,得到处理后的结果。然后进行溢出判断,如果结果小于下界 -2^31,则返回下界值 -2^31。如果结果大于上界 2^31-1,则返回上界值 2^31-1。否则,返回结果 result 作为最终结果。

完整代码

在这里插入图片描述

class Solution(object):
    def myAtoi(self, s):
        """
        :type s: str
        :rtype: int
        """ 
        # 1. 读入字符串并丢弃无用的前导空格
        s = s.strip()  # 去除字符串首尾的空格
        
        # 2. 检查符号
        sign = 1  # 符号,默认为正号
        if s and (s[0] == '+' or s[0] == '-'):  # 判断第一个字符是否为正号或负号
            if s[0] == '-':  # 如果为负号
                sign = -1  # 将符号设置为负号
            s = s[1:]  # 去除字符串中的符号部分,更新字符串 s
        
        # 3. 读取数字字符并转换为整数
        result = 0  # 用于记录最终结果的变量
        for c in s:  # 遍历字符串中的每个字符
            if not c.isdigit():  # 如果字符不是数字字符
                break  # 跳出循环
            result = result * 10 + int(c)  # 将字符转换为整数,并累加到结果中
        
        # 4. 处理溢出情况
        result = sign * result  # 根据符号位确定最终结果的正负
        if result < -2**31:  # 判断是否小于下界
            return -2**31  # 返回下界值
        elif result > 2**31 - 1:  # 判断是否大于上界
            return 2**31 - 1  # 返回上界值
        else:
            return result  # 返回计算得到的结果作为最终结果

详细分析

  • s = s.strip(): 去除字符串首尾的空格。strip() 方法用于移除字符串中指定字符,默认为空格。

  • sign = 1: 初始化符号变量为正号。符号用于表示最终整数是正数还是负数。

  • if s and (s[0] == '+' or s[0] == '-'):: 判断第一个字符是否为正号或负号。

    • 判断条件中的 s 是一个非空字符串,因此判断 s 是否为真意味着检查字符串是否为空。
    • 如果第一个字符是 -,将符号变量 sign 设置为负号。
    • 无论第一个字符是 + 还是 -,都需要去除字符串中的符号部分,所以将字符串 s 更新为去除了第一个字符的子串。
  • result = 0: 初始化用于记录最终结果的变量。默认情况下,结果为0。

  • for c in s:: 遍历字符串中的每个字符。

    • 对于遍历到的每个字符 c
      • if not c.isdigit():: 如果字符不是数字字符(即不是0-9的数字),则跳出循环。
      • 否则,将字符转换为整数,并将其累加到结果变量 result 中。通过将 result 乘以10,可以将当前字符添加到 result 的个位数位置。
  • result = sign * result: 根据符号变量 sign 确定最终结果的正负。如果 sign 为1,则结果为正数;如果 sign 为-1,则结果为负数。

  • if result < -2**31:: 判断是否小于下界 -2**31(即 -2147483648)。

    • 如果结果小于下界,表示整数溢出,因此返回下界值 -2**31
  • elif result > 2**31 - 1:: 判断是否大于上界 2**31 - 1(即 2147483647)。

    • 如果结果大于上界,表示整数溢出,因此返回上界值 2**31 - 1
  • else:: 如果结果没有溢出,返回计算得到的结果作为最终结果。

这个代码段用于将给定的字符串 s 转换为整数。它处理了输入字符串的空格、符号和非数字字符,以及整数溢出的情况,并返回相应的结果。

运行效果截图

调用示例

solution = Solution()
s = "42"
s1 = "   -42"
s2 = "4193 with words"
print(solution.myAtoi(s))
print(solution.myAtoi(s1))
print(solution.myAtoi(s2))

运行结果

在这里插入图片描述

完结

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/749465.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于scrcpy的Android群控项目重构,集成Appium服务执行自动化测试用例

系列文章目录 基于scrcpy的Android群控项目重构 基于scrcpy的Android群控项目重构 进阶版 基于scrcpy的Android群控项目重构&#xff0c;获取Android屏幕元素信息并编写自动化事件&#xff08;视频&#xff09; 基于scrcpy的Android群控项目重构&#xff0c;获取Android屏幕…

大数据与视频技术的融合趋势将带来怎样的场景应用?

视频技术和AI技术的融合是一种新兴的技术趋势&#xff0c;它将改变视频行业的运作方式。视频技术和AI技术的融合主要包括以下几个方面&#xff1a; 1&#xff09;人脸识别技术 人脸识别技术是AI技术的一个重要应用场景。它可以通过对视频中的人脸进行识别和分析&#xff0c;实…

Spark(23):SparkStreaming之DStream转换

目录 0. 相关文章链接 1. DStream转换概述 2. 无状态转化操作 2.1. Transform 2.2. join 3. 有状态转化操作 3.1. UpdateStateByKey 3.2. WindowOperations 0. 相关文章链接 Spark文章汇总 1. DStream转换概述 DStream 上的操作与 RDD 的类似&#xff0c;分为 Transf…

测试计划(详细版)

目录 简介 测试计划的目的 测试计划的作用 范围 编写条件 注意事项 评审总结 参考模版 测试策略 简介 数据和数据库完整性测试 接口测试 集成测试 功能测试 用户界面测试 性能评测 负载测试 强度测试 容量测试 安全性和访问控制测试 故障转移和恢复测试 …

【linux】“gdb“调试方法与技巧

"gdb"调试方法与技巧 一、什么是gdb&#xff1f;二、gdb的使用进入gdb调试list/l 查看源码l/list行号list/l函数名 run/r运行break(b)设置断点info break查看断点信息finishn/next单条执行s/step进入函数调用p 变量set var修改变量的值continue/cdisable breakpionts…

基于javaweb旅游景点线路预定系统设计与实现

1.引言 随着我国人们生活水平的不断提高&#xff0c;旅游逐渐成为人们工作之余&#xff0c;进行放松压力&#xff0c;调节情绪的首要选择。近几年&#xff0c;我国旅游游客规模不断扩大&#xff0c;使旅游业得到快速发展&#xff0c;但也带来了更激烈竞争。面对更复杂的旅游业…

一分钟让你学会如何判断文件是否结束

文章目录 前言ferror函数feof函数ferror函数与feof函数搭配使用 前言 在所有的文件输入输出函数中&#xff0c;我们介绍了一系列的与文件的顺序读写有关的函数&#xff0c;它们调用成功与失败时的返回值各不相同&#xff0c;为了能更好地记忆这些函数&#xff0c;我们将这些函…

react使用SVGA特效 常用api

下载插件 npm install svgaplayerweb --save react中代码 import React, { useEffect } from react; import SVGA from svgaplayerweb const Svga () > {const bofang () > {var player new SVGA.Player(#demoCanvas);//创建实例var parser new SVGA.Parser(#demo…

【经验贴】项目管理过程中最容易忽略的问题,你踩了几个?

“有没有一句话送给刚入行的项目经理&#xff1f;” 随着毕业季的到来&#xff0c;最近发现越来越多类似的话题&#xff0c;评论区成了众多项目经理自嘲的“据点”&#xff0c;部分新手项目经理看完可能要重新考虑下职业规划了。 “要重点关注客户的需求&#xff0c;而不是项…

Android蓝牙协议栈fluoride(一) - 概述

发展 Android 4.2之前的版本采用Linux官方的蓝牙协议栈BlueZ&#xff0c;Android 4.2开始使用google和Broadcom共同开发的Bluedroid来替代BlueZ&#xff0c;但早期的Bluedroid并不完善&#xff0c;存在较多问题&#xff0c;更新迭代后将其更名为fluoride。接下来的系列文章将逐…

接口测试之深入理解HTTPS

前言 随着网络安全问题越来越被重视&#xff0c;HTTPS协议的使用已经逐渐主流化。目前的主流站点均已使用了HTTPS协议&#xff1b;比如&#xff1a;百度、淘宝、京东等一二线主站都已经迁移到HTTPS服务之上。而作为测试人员来讲&#xff0c;也要需时俱进对HTTPS协议要有一定的…

分布式调用与高并发处理 Dubbo分布式调用

一、Dubbo概念 1.1 什么是分布式系统 单机架构 一个系统业务量很小的时候所有的代码都放在一个项目中就好了&#xff0c;然后这个项目部署在一台服务器上&#xff0c;整个项目所有的服务都由这台服务器提供。 缺点&#xff1a; 服务性能存在瓶颈代码量庞大&#xff0c;系统臃…

未跟踪的文件: (使用 “git add <文件>...“ 以包含要提交的内容)怎么移除这些内容

有时候我们常常修改一些内容 手动就是&#xff1a;rm -rf system/core/healthd/images/.png 怎么丢弃呢&#xff1f; git clean -f . 删除这种文件

微信小程序设置底部导航栏

微信小程序设置底部导航栏 1、前言2、图标准备3、小程序tabbar设置 1、前言 我们先来看下效果图&#xff1a; 注意&#xff1a; 导航栏数量最多5个&#xff0c;最少两个。 2、图标准备 阿里图标库 http://www.iconfont.cn/collections/show/29 我们进入该网站&#xff0c;选…

第九章(1):循环神经网络与pytorch示例(RNN实现股价预测)

第九章&#xff08;1&#xff09;&#xff1a;循环神经网络与pytorch示例&#xff08;RNN实现股价预测&#xff09; 作者&#xff1a;安静到无声 个人主页 作者简介&#xff1a;人工智能和硬件设计博士生、CSDN与阿里云开发者博客专家&#xff0c;多项比赛获奖者&#xff0c;发…

1.4 MVP矩阵

MVP矩阵代表什么 MVP矩阵分别是模型&#xff08;Model&#xff09;、观察&#xff08;View&#xff09;、投影&#xff08;Projection&#xff09;三个矩阵。 我们的顶点坐标起始于局部空间&#xff08;Local Space&#xff09;&#xff0c;在这里他成为局部坐标&#xff08;L…

【PHP面试题35】什么是MVC,为什么要使用它

文章目录 一、前言二、MVC介绍2.1 模型&#xff08;Model&#xff09;2.2 视图&#xff08;View&#xff09;2.3 控制器&#xff08;Controller&#xff09; 三、MVC模式的优点四、总结 一、前言 本文已收录于PHP全栈系列专栏&#xff1a;PHP面试专区。 计划将全覆盖PHP开发领域…

『分割』 平面模型分割

PCL提供的几个常见模型&#xff1a; pcl::SACMODEL_PLANE&#xff1a;平面模型&#xff0c;用于拟合平面结构的点云数据。 pcl::SACMODEL_SPHERE&#xff1a;球体模型&#xff0c;适用于拟合球体结构的点云数据。 pcl::SACMODEL_CYLINDER&#xff1a;圆柱体模型&#xff0c;用…

一个四年Android程序猿的2023上半年总结

一晃就做了四年的Android开发了&#xff0c;时光飞逝啊&#xff5e; 工作的时间飞快&#xff0c;感觉每一天都很充实&#xff0c;但是大多数都是重复的样子。 去年的目标达成&#xff1a; 去年的目标就是学习学习&#xff0c;涨薪涨薪。上家公司的同事氛围很不错&#xff0…

一篇文章了解Redis分布式锁

Redis分布式锁 什么是分布式锁&#xff1f; ​ redis分布式锁是一种基于redis实现的锁机制&#xff0c;它用于在多并发分布式环境下控制并发访问共享资源。在多个应用程序或是进程访问共享资源时&#xff0c;分布式锁可以确保只有一个进程可以访问该资源&#xff0c;不会发生…