本组囊括字符串相关题目,难度均为简单。
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 # 大小写也要改变,统一为小写