利用哈希表(python字典)统计每个字母的频次,如果是偶数可以全部加入最长回文串,如果是奇数频次减一加入最长回文串,如果有奇数的字母加入,则可以放在回文串中心,最终长度加一。
class Solution(object):
def longestPalindrome(self, s):
"""
:type s: str
:rtype: int
"""
num = {}
for i in s:
num[i] = num.get(i, 0) + 1
length = 0
flag = 0
for k in num:
if num[k]%2==0:
length += num[k]
else:
flag = 1
length += num[k]-1
length += flag
return length
使用位运算,首先将数组中所有值进行异或,得到一个值xor,该值xor也是所求两个只出现一次元素的异或值,取该值最后一位为1的数div,因为两个只出现一次的数在该位上一定是一个为1另一个为0,将div与数组中所有值进行与操作,分为结果为1和结果为0两个数组,div与该位为0的数进行与操作一定为0,div与该位为1的数进行与操作一定非0,所以所求两个数一定分到了不同的数组里,将两个数组各自进行异或操作,得到两个值就是所求的值。
class Solution(object):
def singleNumber(self, nums):
"""
:type nums: List[int]
:rtype: List[int]
"""
xor = 0
for num in nums:
xor ^= num
div = xor&(-xor) # 最后一位为1的数字
xor1 = 0
xor2 = 0
for num in nums:
if div&num==0:
xor1 ^= num
elif div&num!=0:
xor2 ^= num
return [xor1]+[xor2]
分非负数和负数两种情况,先转换为字符串,然后字符串反转,最后转为有符号整数,考虑数值范围。
class Solution(object):
def reverse(self, x):
"""
:type x: int
:rtype: int
"""
if x >= 0:
s = int(str(x)[::-1])
elif x < 0:
s = -int(str(-x)[::-1])
if s > 2**31-1 or s < -2**31:
return 0
else:
return s
使用哈希表统计每个元素的频次,当某个数的频次大于floor(n/2)时返回这个众数。
class Solution(object):
def majorityElement(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
dic = {}
for num in nums:
dic[num] = dic.get(num, 0) + 1
if dic[num] > int(len(nums)/2):
return num