Python描述数据结构之字符串实战篇

前言

  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' 的码值为48。

  运行结果如下:

在这里插入图片描述

5. LeetCode788:旋转数字

  LeetCode第788题:旋转数字
  这个题主要是考虑下面这几种情况:

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

  (2) 数字347这三个数字无论旋转多少度都不是数字;

  (3) 数字2569这四个数字,25互为镜像,69互为镜像。

  总上所述,可以将好数重新定义为:不包含数字347且至少含有数字2569其中一个的数字,叫做好数。

  代码如下:

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到一个点。

猜你喜欢

转载自blog.csdn.net/qq_42730750/article/details/108016855