算法通关村十二关:字符串基础

字符串

存放数字、字母、特殊字符
字母有可以大写和小写

常见题目类型转换,几种类型之间的相互转换

转换过程中需要处理的几种特殊情况
转之前先判断当前元素能不能转
如果字符串转数字,要考虑当前元素是不是数字,转完之后会不会溢出

转换成小写字母

LeetCode 709. 转换成小写字母
https://leetcode.cn/problems/to-lower-case/

思路分析

每个字母都有对应的ASCII码,根据ASCII码表对字符串进行操作

常见ASCII码表

a-z    97-122
A-Z    65-90

0-9    48-57

先遍历整个字符串,然后对每一位字符进行判断,如果str[i]的值在A-之间,需要在原来的基础上加上32进行小写转换

代码实现

python内置方法ord() 与 chr()
ord() 返回字符对应的ASCII码
chr() 返回ASCII码对应的字符

class Solution:
    def toLowerCase(self, s: str) -> str:
        chars = list(s)
        for i in range(len(chars)):
            if "A" <= chars[i] <= "Z":
                chars[i] = chr(32 + ord(chars[i]))
        return "".join(chars)

字符串转换整数(atoi)

涉及到数字溢出的处理

LeetCode8. 字符串转换整数 (atoi)
https://leetcode.cn/problems/string-to-integer-atoi/

思路分析

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

  • 读入字符串并丢弃无用的前导空格
  • 检查下一个字符(假设还未到字符末尾)为正还是负号,读取该字符(如果有)。 确定最终结果是负数还是正数。 如果两者都不存在,则假定结果为正。
  • 读入下一个字符,直到到达下一个非数字字符或到达输入的结尾。字符串的其余部分将被忽略。
  • 将前面步骤读入的这些数字转换为整数(即,“123” -> 123, “0032” -> 32)。如果没有读入数字,则整数为 0 。必要时更改符号(从步骤 2 开始)。
  • 如果整数数超过 32 位有符号整数范围 [−231, 231 − 1] ,需要截断这个整数,使其保持在这个范围内。具体来说,小于 −231 的整数应该被固定为 −231 ,大于 231 − 1 的整数应该被固定为 231 − 1 。
  • 返回整数作为最终结果。

罗列几个要点

  • 去掉前导空格
  • 判断第一个字符为+和-的情况,设计变量sign,初始化为1,遇到-,sign修正为-1
  • 判断是否为数字,使用ASCII码数值进行判断,‘0’<=char<=‘9’,如果0在最前面,需要去除
  • 遇到第一个不是数字的字符的情况下,转换停止,退出循环
  • 转换以后数字超过 int 类型范围,需要截取。
    不能将结果res变量设计为long类型
    注意:由于输入的字符串转换以后也有可能超过long类型,因此需要在循环内部就判断是否越界,只要越界就退出循环,这样也可以减少不必要的计算
  • 涉及数组下标访问,全程需要考虑数组下标是否越界情况

特别注意:

  • 由于题目中说 环境只能保存32位整数,因此这里在每一轮循环之前先要检查,具体细节详见编码
  • Java、Python和C++字符串的设计都是不可变的,即使用trim()会产生新的变量,因此我们尽量不使用库函数,使用一个变量index去做遍历,这样遍历完成以后就得到转换以后的数值

代码实现

python语法
求幂x的y次方 x**y
去除两端空格 str.strip()
判断是否是数组 isdigit()

class Solution:
    def myAtoi(self, s: str) -> int:
        # 去除字符串两端空格
        s = s.strip()

        # 判断字符串是否为空
        if not s:
            return 0

        # 检查第一个字符
        if s[0] == '-':
            sign = -1
            s = s[1:]
        elif s[0] == '+':
            sign = 1
            s = s[1:]
        elif '0' <= s[0] <= '9':
            sign = 1
        else:
            return 0

        # 将连续的数字字符转换为整数
        num = 0
        for i in s:
            if i.isdigit():
                num = num * 10 + int(i)
            else:
                break

        # 处理正负号和溢出的情况
        num = sign * min(num, 2 ** 31 - 1)

        return num
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值