Python算法练习
leetcode算法题练得差点上火,还是最简单的题型,记录一下长个教训。
给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
说明:本题中,我们将空字符串定义为有效的回文串。
示例 1:
输入: “A man, a plan, a canal: Panama”
输出: true
示例 2:
输入: “race a car”
输出: false
首先想到用双指针,一左一右,但是处理特例真的处理得太烂了,调试了很多次才完成。
class Solution:
def isPalindrome(self, s: str) -> bool:
s = s.lower()
s = ''.join(s.split(' '))
n = len(s)
if s == '' or len(set(s)) == 1:
return True
else:
Left = 0
Right = n - 1
while Left < Right:
if s[Left] not in 'abcdefghijklmnopqrstuvwxyz0123456789':
Left += 1
continue
elif s[Right] not in 'abcdefghijklmnopqrstuvwxyz0123456789':
Right -= 1
continue
if s[Left] == s[Right]:
Left += 1
Right = Right - 1
elif Left==Right:
return True
else:
return False
else:
return True
看下题解大牛的双指针,怎么这么优雅
class Solution:
def isPalindrome(self, s: str) -> bool:
sgood = "".join(ch.lower() for ch in s if ch.isalnum())
n = len(sgood)
left, right = 0, n - 1
while left < right:
if sgood[left] != sgood[right]:
return False
left, right = left + 1, right - 1
return True
还吃了不知道isalnum()方法的亏,奇怪的知识点+1
还有一道外观数列,也是暴力解法
给定一个正整数 n(1 ≤ n ≤ 30),输出外观数列的第 n 项。
注意:整数序列中的每一项将表示为一个字符串。
「外观数列」是一个整数序列,从数字 1 开始,序列中的每一项都是对前一项的描述。前五项如下:
-
1
-
11
-
21
-
1211
-
111221
第一项是数字 1
描述前一项,这个数是 1 即 “一个 1 ”,记作 11
描述前一项,这个数是 11 即 “两个 1 ” ,记作 21
描述前一项,这个数是 21 即 “一个 2 一个 1 ” ,记作 1211
描述前一项,这个数是 1211 即 “一个 1 一个 2 两个 1 ” ,记作 111221
示例 1:
输入: 1
输出: “1”
解释:这是一个基本样例。
示例 2:
输入: 4
输出: “1211”
解释:当 n = 3 时,序列是 “21”,其中我们有 “2” 和 “1” 两组,“2” 可以读作 “12”,也就是出现频次 = 1 而 值 = 2;类似 “1” 可以读作 “11”。所以答案是 “12” 和 “11” 组合在一起,也就是 “1211”。
class Solution:
def countAndSay(self, n: int) -> str:
s,res,lt= '1','',[]
for i in range(n-1):
for c in s:
if c not in lt and lt == []:
lt.append(c)
elif c not in lt and lt != []:
res += str(len(lt))+lt[0]
lt = []
lt.append(c)
else:
lt.append(c)
else:
if len(lt)>0:
res +=str(len(lt))+lt[0]
lt = []
s = res
res = ''
return s