LeetCode习题总结-算法(19)

第十九天LeetCode刷题-算法

第十九天习题——字符串转换整数的函数

此题仅为个人总结参考,如有错误还请指出

首先先上原题:

来源:力扣(LeetCode)
原题链接:https://leetcode-cn.com/problems/string-to-integer-atoi/

拿到这道题,会发现本题所提出的背景不会较难读懂。即通过给定一个字符串(可能是纯数字/纯字母/数字和字母的组合),通过判定对应的字符串是否为纯数字组成,如果则将其转换成一个对应的数值;如果不是,则返回值0即可。虽背景简单,但是本题所涉及要考虑的特殊情况会偏多,如是否开头第一个非空字符为字符,如果是就需要直接结束判断为0等等。像这样对字符串进行形式转换的问题,我们一般最容易想到的便是遍历的思想去完成这个工作。通过遍历每个字符,判断其是否为纯数字来判定是否需要进行类型转化的行为。当然,在进行判断之间,我们可以利用python中的一些小技巧来对字符串进行一定的预处理操作,如使用了lstrip()方法去除第一个非空字符前所有空字符。所以基于上述思想我们给出基于此题的第一种方法,利用暴力搜索配合强制转换的方法来实现对字符串的转化。

方法1——暴力破解法(基于遍历和强制转换的字符串转化过程)

class Solution:
    def myAtoi(self, str: str) -> int:

		# 特处
		# 去除第一个非空字符前的所有空字符
		str_ = str.lstrip()

		if len(str_) == 0:
			return 0

		# 对数值的正负号进行处理,确定检索的起始位置
		i = 1 if str_[0] == '+' or str_[0] == '-' else 0
		result = 0

		# 遍历开始
		while i <= len(str_):
			try:
				result = int(str_[:i+1])
				i += 1
			
			# 当捕捉到第一个非数值的字母出现时,直接终止循环
			except:
				break
		
		# 判断字符串是否超过边界取值范围
		if result < -(1<<31):
			return -(1<<31)

		if result > (1<<31) - 1:
			return (1<<31) - 1
		
		return result

该方法的复杂度分析:
时间复杂度:O(n) (涉及对整个字符串的遍历操作)
空间复杂度:O(1)

该算法在执行器里面的消耗内存空间和时间开销如下图所示:
在这里插入图片描述

方法2——优化方法(基于正则表达式的字符串匹配过程)

正则表达式又称正则表示式、正则表示法、规则表达式、常规表示法,是计算机科学的一个概念。正则表达式常用来被使用来去对单个字符串进行匹配或者匹配一系列符合某个句法规则的字符串。正则表达式通常被用来测试字符串内的模式替换那些符合某个模式的文本、基于模式匹配从字符串中提取子字符串。而基于本题的背景,我们能发现其能够很好的匹配正则表达式所能够完成的功能,即基于某一特定模式完成对某一规律字符串的查找操作。而在匹配的过程当中,如若需要完成利用正则表达式完成字符串的匹配,我们则需要先行定义好用来匹配字符串的表达式。基于此题的背景,我们可知,在给定的字符串中,我们在匹配到第一个非空字符之前,也许会匹配到很多空格字符的存在,所以此时,我们可用“ []* ”来完成对第一个非空字符前所有空字符的匹配操作。“ * ”代表对应前面的子表达式匹配0次或者多次。而在检测到第一个非空字符后,我们可用表达式“ ([±]?\d+) ”来完成对非空字符串的匹配过程;“ [+ -]?” 能够实现对字符串的正负性质模糊匹配操作。“ \d+ ”则能完成对数字一次或者多次匹配过程。在匹配完成后,我们利用group()方法取其正则匹配结果的第一组结果来进行判断输出即可。基于上述思想,我们给出本题的第二种解法。

多行版本的正则表达式方法

import re

class Solution:
    def myAtoi(self, str: str) -> int:
        # 按模式完成对字符串匹配工作
        matches = re.match('[ ]*([+-]?\d+)', str)  

		# 判断的过程
		if not matches:
		            return 0
		res=int(matches.group(1))
		return min(max(res, -(1<<31)), (1<<31) - 1)

一行版本的正则表达式方法

import re

class Solution:
    def myAtoi(self, s: str) -> int:
        return max(min(int(*re.findall('^[\+\-]?\d+', s.lstrip())), (1<<31) - 1), -(1<<31))

该算法在执行器里面的消耗内存空间和时间开销如下图所示:

在这里插入图片描述

总结

通过对这道题的分析我么可以得知,如果在遇到需要完成对字符串的转化过程,我们一般的思想可以利用逐步遍历的过程完成对字符串的遍历过程。此外,正则表达式也是专门针对需要在指定特定模式下来完成对特殊字符串查找的不二工具之选。当然随着字符串长度的增加,正则表达式相对暴力搜索能够以更加高效的方式完成对字符串的匹配检索操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值