python字符串的描述_Python描述数据结构之字符串实战篇

文章目录

前言

1. LeetCode13:罗马数字转整数

2. LeetCode125:验证回文串

3. LeetCode14:最长公共前缀

4. LeetCode415:字符串相加

5. LeetCode788:旋转数字

6. LeetCode929:独特的电子邮件地址

7. 其它题

7.1 LeetCode28:实现 strStr()

7.2 LeetCode67:二进制求和

7.3 LeetCode344:反转字符串

前言

Python中有关字符串的操作请参考我的这篇博客。

LeetCode中有关字符串的题目。

1. LeetCode13:罗马数字转整数

LeetCode第13题:罗马数字转整数。

这个题目官方给了7种单个字符和6种特殊情况的双字符,而且是优先处理双字符。我们可以将这13种情况存放到一个字典里,通过遍历给定的罗马字符,先判断当前字符与其下一个字符能否构成6种特殊情况的双字符,如果可以,将这两个字符看做一个整体;如果不能,就按单字符处理。代码如下:

def romanToInt(s):

dict1 = {'I': 1, 'V': 5, 'X': 10, 'L': 50, 'C': 100, 'D': 500, 'M': 1000,

'IV': 4, 'IX': 9, 'XL': 40, 'XC': 90, 'CD': 400, 'CM': 900}

result = []

count = 0

while count < len(s):

if s[count: count+2] in dict1:

result.append(dict1.get(s[count: count+2]))

count += 2

else:

result.append(dict1.get(s[count]))

count += 1

del count

return sum(result)

运行结果如下:

2. LeetCode125:验证回文串

LeetCode第125题:验证回文串。

这个题前面说的是挺明白的,只考虑字母和数字字符,可以忽略字母的大小写,然后后面加了一个说明让我有点不明白了,将空字符串定义为有效的回文串???,空字符不就是长度为0的字符吗,这样定义是为了C语言吗,我记得C语言的字符串默认后面加了一个’\0’。而且我在一个网站中看到,空字符还包括空格、换行(\n)、制表符(\t)等,所以这个点有些迷惑。

所以根据题目和示例,就只看字符和数字。Python里面有个专门来判断字符是否是字母或数字的函数isalnum(),在上篇博客有介绍,将处理后的字符串与其反转后的进行比较,如果一样,就是回文串,返回True,否则就返回False。代码如下:

def isPalindrome(s):

# s1.isspace()

new_s = [s1.lower() for s1 in s if s1.isalnum()]

new_s = ''.join(new_s)

return new_s == new_s[::-1]

运行结果如下:

3. LeetCode14:最长公共前缀

LeetCode第14题:最长公共前缀。

这个题的大致思路就是,先找出数组中最短的那个字符串,然后以这个最短的字符串为基准,逐个字符进行比较,如果第一个字符就不同,那么就说明没有公共前缀,直接结束。

而这些操作,Python中的zip()函数正好可以胜任,先将数组转置,然后zip()函数会以数组里面最短的那个字符串为基准,输出相应位置的字符元组,我们直接分析相应的字符元组即可,如果都相同,则是一个前缀,否则,结束。代码如下:

def longestCommonPrefix(strs):

result = ''

for s_tuple in zip(*strs):

if len(set(s_tuple)) == 1:

result += s_tuple[0]

else:

break

return result

运行结果如下:

4. LeetCode415:字符串相加

LeetCode第415题:字符串相加。

这个题目官方做了一些限制,不能直接将输入的字符串转换为整数形式,否则就直接使用eval()函数或int()函数解决了,哈哈!太简单粗暴的方法不让用,我们就只能从单个字符入手了,我这里是先用zfill()函数(在上篇博客有介绍哦)统一字符串的长度,然后使用ord()函数将字符转换成ASCII值,再逐位相加,注意进位。代码如下:

def addStrings(num1, num2):

max_length = max(len(num1), len(num2))

new_num1 = num1.zfill(max_length)[::-1]

new_num2 = num2.zfill(max_length)[::-1]

sh = 0

result = ''

for i in range(max_length):

sh, yu = divmod(ord(new_num1[i]) + ord(new_num2[i]) - 96 + sh, 10)

result = str(yu) + result

if sh:

result = str(sh) + result

del max_length

del new_num1

del new_num2

del sh

return result

注意结果返回的是个str哦!字符

′0′'0'

′0′的码值为48。

运行结果如下:

5. LeetCode788:旋转数字

LeetCode第788题:旋转数字。

这个题主要是考虑下面这几种情况:

(1) 数字0、1、8这三个数字旋转180°后还是它们自己;

(2) 数字3、4、7这三个数字无论旋转多少度都不是数字;

(3) 数字2、5、6、9这四个数字,2和5互为镜像,6和9互为镜像。

总上所述,可以将好数重新定义为:不包含数字3、4、7且至少含有数字2、5、6、9其中一个的数字,叫做好数。

代码如下:

def rotatedDigits(N):

result = []

for num in range(1, N + 1):

num_str = str(num)

if '3' not in num_str and '4' not in num_str and '7' not in num_str and ('2' in num_str or '5' in num_str or '6' in num_str or '9' in num_str):

result.append(num_str)

del num_str

return len(result)

运行结果如下:

6. LeetCode929:独特的电子邮件地址

LeetCode第929题:独特的电子邮件地址。

这个题目官方说了.与+与不适用于域名,所以我们先将邮件地址拆成用户名称user和域名domain两部分,域名部分不需要做任何处理。这里是将.用空字符替换掉了,然后再判断+是否在user里,如果在,将其及其后面的字符都去掉,最后将其两部分重新拼结成新的邮件地址,去重后计算邮件地址个数。代码如下:

result = []

for email in emails:

user, domain = email.split('@')

user = user.replace('.', '')

if '+' in user:

user = user[:user.find('+')]

result.append(user + '@' + domain)

return len(set(result))

运行结果如下:

7. 其它题

下面几个题就是超简单的那种,就不再做解释了,在Python中就是一行代码。

7.1 LeetCode28:实现 strStr()

LeetCode第28题:实现 strStr()。

代码如下:

def strStr(haystack, needle):

return haystack.find(needle)

7.2 LeetCode67:二进制求和

LeetCode第67题:二进制求和。

def addBinary(a, b):

return bin(int(a, 2) + int(b, 2))[2:]

7.3 LeetCode344:反转字符串

LeetCode第344题:反转字符串。

def reverseString(s):

s.reverse()

这个题我首先想到的就是切片,这样s = s[::-1],把变量s重新赋值,这样是不行的哦,可以通过id()函数查看一下变量的地址,发现函数传入的变量s与重新赋值后的变量s不是同一个,地址不一样的,又get到一个点。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值