只出现一次的数字(136)
题目
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
示例 1:
输入: [2,2,1]
输出: 1
示例 2:
输入: [4,1,2,1,2]
输出: 4
思路
最主要的是不使用额外空间来实现,这个通过异或操作来完成:
两个相同的书做异或得到结果为0
代码
class Solution:
def singleNumber(self, nums: List[int]) -> int:
a = 0
for v in nums:
a = v^a
return a
验证回文串(125)
题目
给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
说明:本题中,我们将空字符串定义为有效的回文串。
示例 1:
输入: “A man, a plan, a canal: Panama”
输出: true
示例 2:
输入: “race a car”
输出: false
思路
先预处理,得到完全是数字以及大写字母组成的字符串后用s[::1]==s[::-1]
这一判断回文符的标准式子来判断
预处理过程可以使用正则匹配,或者使用python字符自带的判断是否为数字字母的函数c .isalpha() c.isdigit()
。并用s,lower()
或s.upper()
返回大小写
代码
class Solution:
def isPalindrome(self, s):
"""
:type s: str
:rtype: bool
"""
alphanumeric = re.sub("[^A-Za-z0-9]+", "", s).lower()
#正则匹配
print(alphanumeric)
return alphanumeric == alphanumeric[::-1]
class Solution:
def isPalindrome(self, s: 'str') -> 'bool':
s = [c for c in s if c .isalpha() or c.isdigit()]
if len(s) <= 1:
return True
i, j = 0, len(s) - 1
while i < j:
if s[i].lower() != s[j].lower():
return False
i, j = i + 1, j - 1
return True