LeetCode:字符串(三)

本组囊括字符串相关题目,难度均为简单。

58. Length of Last Word

题目描述:简单

解法一:

python中的split能很好地解决这个问题:使用split删除空格后逆着遍历即可得到第一个非空字符的长度:

1 class Solution:
2     def lengthOfLastWord(self, s: str) -> int:
3         new_s = s.split(' ')
4         n = len(new_s)
5         for i in range(n-1,-1,-1):
6             if new_s[i] != '':
7                 return len(new_s[i])
8         return 0

 

解法二:

不使用split的思路:通过倒序遍历字符串来判断,当倒序到第一个空格是从字符串末尾开始向前遍历,其中主要有两种情况:
第一种情况,以字符串"Hello World"为例,从后向前遍历直到遍历到头或者遇到空格为止,即为最后一个单词"World"的长度5
第二种情况,以字符串"Hello World "为例,需要先将末尾的空格过滤掉,再进行第一种情况的操作,即认为最后一个单词为"World",长度为5
所以完整过程为先从后过滤掉空格找到单词尾部,再从尾部向前遍历,找到单词头部,最后两者相减,即为单词的长度。

 1 class Solution:
 2     def lengthOfLastWord(self, s: str) -> int:        
 3         n = len(s)
 4         for i in range(n-1,-1,-1):
 5             if s[i] != ' ':
 6                 for j in range(i,-1,-1):
 7                     if s[j] == ' ':
 8                         return i-j
 9                 return i-j+1
10         return 0
11         # 时间复杂度:O(n),n为结尾空格和结尾单词总体长度
12         # 空间复杂度:O(1)

 

 

67. Add Binary

题目描述:简单

思路一:

使用内置函数转十进制后相加再转字符串:

int(x,base)用法,若 x 为 str,则 base 可略可有。

当base 存在时,视 x 为 base 类型数字,并将其转换为 10 进制数字。

若 x 不符合 base 规则,则报错。如果是带参数base的话,12要以字符串的形式进行输入,12 为 16进制。

1 class Solution:
2     def addBinary(self, a: str, b: str) -> str:
3         # 思路一,使用内置函数转十进制后相加在转字符串
4         # int(x,base)用法,若 x 为 str,则 base 可略可有。
5         # base 存在时,视 x 为 base 类型数字,并将其转换为 10 进制数字。
6         # 若 x 不符合 base 规则,则报错。如果是带参数base的话,12要以字符串的形式进行输入,12 为 16进制
7         c = int(a, 2) + int(b, 2)
8         return '{0:b}'.format(c)

 

思路二:

按比特位逐位运算,设置一个进位,最后如果进位为1,则拼接进位,最后反转即可得到答案。
首先将两个字符串较短的用0补齐,使得两个字符串长度一致,然后从末尾进行遍历计算,得到最终结果:代码暂时留坑。

思路三:

位运算,异或XOR操作:

  • a & b 的结果,左移一位(<< 1)就得到进位数
  • a ^ b ,异或,其实就是不带进位的加法,结果更新给 a
  • 求出得到进位数,更新给 b。
1 class Solution:
2     def addBinary(self, a, b) -> str:
3         x, y = int(a, 2), int(b, 2)
4         while y:
5             x, y = x ^ y, (x & y) << 1
6         return bin(x)[2:] # 输出二进制的数

 

 

125. Valid Palindrome

题目描述:简单

思路一:

使用内置函数的思路,先用isalnum()去掉所有的标点符号,再使用str.lower()把字母都变为小写;
字符串反转后再判断即可得到答案。

1 class Solution:
2     def isPalindrome(self, s: str) -> bool:
3         # 使用内置函数的思路,先用isalnum去掉所有的标点符号,再使用str.lower()把字母都变为小写;
4         # 字符串反转后再判断即可得到答案。
5         new_s = ''.join(e for e in s if e.isalnum())
6         new_s = new_s.lower()
7         reverse_s = new_s[::-1]
8         return new_s == reverse_s
9         # 大小写也要改变,统一为小写

 

posted @ 2020-11-10 10:22  Jesse-jia  阅读(82)  评论(0编辑  收藏  举报