力扣初级算法刷题记录-字符串转换整数

目录

问题

思路

特殊情况

初始化

逻辑处理

曾遇到的逻辑问题以及修复

代码

补充


问题:

 1.把所给的字符串转换为一个32位的有符号整数

题目要求:

1.空格:读入字符串并丢弃无用的前导空格(" ")
2.符号:检查下一个字符(假设还未到字符末尾)为 '-' 还是 '+'。如果两者都不存在,则假定结果为正。
3.转换:通过跳过前置零来读取该整数,直到遇到非数字字符或到达字符串的结尾。如果没有读取数字,则结果为0。
4.舍入:如果整数数超过 32 位有符号整数范围 [−231,  231 − 1] ,需要截断这个整数,使其保持在这个范围内。具体来说,小于 −231 的整数应该被舍入为 −231 ,大于 231 − 1 的整数应该被舍入为 231 − 1 。
返回整数作为最终结果。

思路:

特殊情况

1. 去掉空格仍是空字符串的情况

初始化

对后续要用到的变量进行设置

逻辑处理:

  1. 处理步骤2(同时对要用到的变量进行初始),字符串具有索引,可以通过索引来访问字符。这道题的前几个步骤只需要看字符串的头部,因此可以直接访问索引来判断正负性。结果的正负性在代码中可以使用变量sign进行控制。

     最后数字的正负性处理可以直接用numsign相乘即可,因此要注意sign的设置,sign应该设置为-1  ,方便最终的计算,如果把sign设置成0 ,num就直接变成0了,因此不行。  

字符串判断头部字符直接用索引,如果题目要求的条件涉及整个字符串再用for循环遍历

 2. 循环结构的设置,满足条件的写在循环里面

应设置为索引小于(严格)字符串长度,一旦不满足就应该退出循环

如果用这种条件:len(s)恒真,循环不会终止,会出现数组越界的情况

  while len(s) and s[i].isdigit():
            #读取字符串的数字,处理前导零
            #这里采用逐位处理
            num=num*10+int(s[i])

 采用访问索引+isdigit()方法可以排除非数字字符

3.从字符串逐位读取数字的方法

num = num * 10 + int(s[i])

这样逐位读取数字的方法可以理解为把得到的数字逐渐扩充的一个过程:

```
这里是一个逐渐膨胀的过程,每一次数位增加一位,当前的数字就需要乘以10以扩充
以"654"为例
num初始化为0
经过遍历访问,我们先得到6,此时num=0*10+6=6
再一次得到5,此时num=6*10+5=65
再一次得到4,此时num=65*10+4=654
```

注意因为这里是从字符串里面得到数字,因此使用int()进行强转成整型数字

5.边界处理:

可以单独设置两个变量Max,Min

6.最后返回的结构,边界条件直接返回Min和Max即可

#返回整数作为结果
        if num<Min:
            return Min
        elif num>Max:
            return Max
        else:
            return num

曾遇到的逻辑问题以及修复:

1.注意没有出现"+" "-"号的情况,sign因为初始化会默认为1,不用写else块

2.  最后不需要return 0。因为如果字符串是空字符串或者字符串中存在先出现非数字字符的情况, 会因为num的初始化直接返回0. 如果在这里添加了return 0则会导致while循环一结束,都会返回0,导致很多num值都返回了0

代码:

class Solution(object):
    def myAtoi(self, s):
        """
        :type s: str
        :rtype: int
        """
        if len(s)==0:
            return 0
        #步骤一,读入前导空格
        s=s.strip()
        if len(s)==0:
            return 0

        #初始化工作
        sign=1  #默认sign为正,用于标记正负性,正数设置为1
        i=0     #设置一个索引, 用于访问字符串
        num=0

        #步骤二,检查正负号
        if s[0]=='+':
           sign=1
           i+=1
        elif s[0]=='-':
           sign=-1
           i+=1
        
        #循环设置符合条件的(即非空,当前位数字)
        while i<len(s) and s[i].isdigit():
            #读取字符串的数字,处理前导零
            #这里采用逐位处理
            num=num*10+int(s[i])
            i+=1      
        #步骤四,舍入,处理边界问题
        num*=sign
        Max=2**31-1
        Min=-2**31
        #返回整数作为结果
        if num<Min:
            return Min
        elif num>Max:
            return Max
        else:
            return num

补充:

1. Python中把字符串转换成整数的方法 int()

char='123'
print(type(char))
num=int(char)
print(num)
print(f"经转换后,num的数据类型是{type(num)}")

输出结果:

转换为浮点型:float()方法

char="2.5"
print(type(char))
num=float(char)
print(num)
print(f"经转换后,num的数据类型是{type(num)}")

输出结果:

2.1 检验整个字符串是否是数字的方法:isdigit()方法

str="Sassybox123"
if str.isdigit():
    num=int(str)
else:
    print("这个字符串含有非数字字符")

输出结果:

2.2 检验字符串中特定位置的单个字符是否是数字的方法,仍可以用访问索引+isdigit()方法

   s[i].isdigit()

s="12345a"
if s[0].isdigit():
    print("是数字字符串")
else:
    print("不满足")

输出结果:

当我使用访问索引+isdigit()方法访问一个非数字位置的字符时:

s="12345a"
if s[5].isdigit():
    print("该字符是数字")
else:
    print("该字符不是数字")

输出结果:

3. strip() 用于移除字符串头尾指定的字符串,注意只能删除开头和结尾,不能删除中间部分。

Python strip()方法 | 菜鸟教程

str="     Sassybox is the sassiest box in the world  "
new_str=str.strip()
print(str)
print(new_str)

输出结果:

4.高次幂的表示,**

Max=2**31

负数高次幂表示

  Min=-2**31

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值