Python中有关字符串的操作请参考我的这篇博客。
LeetCode中有关字符串的题目。
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)
运行结果如下:
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]
运行结果如下:
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
运行结果如下:
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。
运行结果如下:
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)
运行结果如下:
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))
运行结果如下:
下面几个题就是超简单的那种,就不再做解释了,在Python中就是一行代码。
LeetCode第28题:实现 strStr()。
代码如下:
def strStr(haystack, needle):
return haystack.find(needle)
LeetCode第67题:二进制求和。
def addBinary(a, b):
return bin(int(a, 2) + int(b, 2))[2:]
LeetCode第344题:反转字符串。
def reverseString(s):
s.reverse()
这个题我首先想到的就是切片,这样s = s[::-1],把变量s重新赋值,这样是不行的哦,可以通过id()函数查看一下变量的地址,发现函数传入的变量s与重新赋值后的变量s不是同一个,地址不一样的,又get到一个点。