剑指Offer——字符串

字符串

offer 05 替换空格(简单)

请实现一个函数,把字符串 s 中的每个空格替换成"%20"。
在这里插入图片描述
解题思路
遍历添加: Python 和 Java 等语言中,字符串都被设计成「不可变」的类型,即无法直接修改字符串的某一位字符,需要新建一个字符串实现。

算法流程

  1. 初始化一个 list (Python) / StringBuilder (Java) ,记为 res ;
  2. 遍历列表 s 中的每个字符 c :
    - c 为空格时:向 res 后添加字符串 “%20” ;
    - 当 c 不为空格时:向 res 后添加字符 c ;
  3. 将列表 res 转化为字符串并返回。

Python代码如下:

class Solution:
    def replaceSpace(self, s: str) -> str:
        #初始化res,用来保存结果
        res = []
        #遍历字符串s中的每一个字符
        for c in s:
            #若字符串中的某一个字符为空,在res里添加字符%20,否则在res后添加字符c 
            if c == ' ': res.append("%20") 
            else: res.append(c)
        #将列表 res 转化为字符串并返回
        return ''.join(res)

作者:jyd
来源:力扣(LeetCode)

offer 20 表示数值的字符串(中等)

请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。
在这里插入图片描述
在这里插入图片描述
解题思路
本题使用有限状态自动机。根据字符类型和合法数值的特点,先定义状态,再画出状态转移图,最后编写代码即可。

在这里插入图片描述
在这里插入图片描述
算法流程
在这里插入图片描述
Python代码如下:

class Solution:
    def isNumber(self, s: str) -> bool:
        states = [
            { ' ': 0, 's': 1, 'd': 2, '.': 4 }, # 0. start with 'blank'
            { 'd': 2, '.': 4 } ,                # 1. 'sign' before 'e'
            { 'd': 2, '.': 3, 'e': 5, ' ': 8 }, # 2. 'digit' before 'dot'
            { 'd': 3, 'e': 5, ' ': 8 },         # 3. 'digit' after 'dot'
            { 'd': 3 },                         # 4. 'digit' after 'dot' (‘blank’ before 'dot')
            { 's': 6, 'd': 7 },                 # 5. 'e'
            { 'd': 7 },                         # 6. 'sign' after 'e'
            { 'd': 7, ' ': 8 },                 # 7. 'digit' after 'e'
            { ' ': 8 }                          # 8. end with 'blank'
        ]
        p = 0                           # start with state 0
        for c in s:
            if '0' <= c <= '9': t = 'd' # digit
            elif c in "+-": t = 's'     # sign
            elif c in "eE": t = 'e'     # e or E
            elif c in ". ": t = c       # dot, blank
            else: t = '?'               # unknown
            if t not in states[p]: return False
            p = states[p][t]
        return p in (2, 3, 7, 8)

作者:jyd
来源:力扣(LeetCode)

offer 58 左旋转字符串(简单)

字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。
在这里插入图片描述
解题思路1
字符串切片:获取字符串 s[n:] 切片和 s[:n]切片,使用 “+” 运算符拼接并返回即可。

python代码如下:

class Solution:
    def reverseLeftWords(self, s: str, n: int) -> str:
        #字符串切片
        return s[n:] + s[:n]

解题思路2
列表遍历拼接

算法流程

  1. 新建一个 list,记为 res ;
  2. 先向 res 添加 “第 n + 1 位至末位的字符” ;
  3. 再向 res 添加 “首位至第 n 位的字符” ;
  4. 将 res 转化为字符串并返回。

Python代码如下:

class Solution:
    def reverseLeftWords(self, s: str, n: int) -> str:
        #初始化,用于保存结果
        res = []
        #遍历[n+1,s的最大长度]里的每个字符,并添加到res里
        for i in range(n,len(s)):
            res.append(s[i])
        #遍历首位到n的每一个字符,并添加到res里
        for i in range(n):
            res.append(s[i])
        #返回拼接
        return ''.join(res)

作者:jyd
来源:力扣(LeetCode)

offer 67 把字符串转换成整数(中等)

写一个函数 StrToInt,实现把字符串转换成整数这个功能。不能使用 atoi 或者其他类似的库函数。
在这里插入图片描述
在这里插入图片描述
解题思路
根据题意,有以下四种字符需要考虑:

  1. 首部空格: 删除之即可;

  2. 符号位: 三种情况,即 ‘’+‘’ , ‘’-‘’ , ''无符号" ;新建一个变量保存符号位,返回前判断正负即可。

  3. 非数字字符: 遇到首个非数字的字符时,应立即返回。

  4. 数字字符

    1.字符转数字: “此数字的 ASCII 码” 与 “ 0 的 ASCII 码” 相减即可;
    2.数字拼接: 若从左向右遍历数字,设当前位字符为 c ,当前位数字为 x ,数字结果为 resres ,则数字拼接公式为:

res = 10 × res + x
x = ascii( c ) − ascii( ′0′ )

在这里插入图片描述

数组越界处理

题目要求返回的数值范围应在 [−2^31, 2^31 − 1 ] ,因此需要考虑数字越界问题。而由于题目指出 环境只能存储 32 位大小的有符号整数 ,因此判断数字越界时,要始终保持 resres 在 int 类型的取值范围内。

在每轮数字拼接前,判断 res 在此轮拼接后是否超过 2147483647 ,若超过则加上符号位直接返回。设数字拼接边界 bndry = 2147483647 // 10 = 214748364,则以下两种情况越界:
在这里插入图片描述

Python代码如下:

class Solution:
    def strToInt(self, str: str) -> int:
        str = str.strip()  # 删除首尾空格
        if not str: return 0  #字符串为空则返回0
        res, i, sign = 0, 1, 1  #记录
        #基数范[−2^31,  2^31 − 1 ]
        int_max, int_min, bndry = 2 ** 31 - 1, -2 ** 31, 2 ** 31 // 10
        if str[0] == '-': sign = -1  # 保存负号
        elif str[0] != '+': i = 0  # 若无符号位,则需从 i = 0 开始数字拼接
        for c in str[i:]:
            if not '0' <= c <= '9': break  # 遇到非数字的字符则跳出
            # 数字越界处理
            if res > bndry or res == bndry and c > '7': 
                return int_max if sign == 1 else int_min
            res = 10 * res + ord(c) - ord('0')  #数字拼接
        return sign * res 

作者:jyd
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值