LeetCode每周刷题(2019.7.8-2019.7.14)

409. 最长回文串

LeetCode每周刷题(2019.7.8-2019.7.14)_第1张图片

利用哈希表(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

378. 有序矩阵中第K小的元素

260. 只出现一次的数字 III

LeetCode每周刷题(2019.7.8-2019.7.14)_第2张图片

使用位运算,首先将数组中所有值进行异或,得到一个值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]

7. 整数反转

LeetCode每周刷题(2019.7.8-2019.7.14)_第3张图片

分非负数和负数两种情况,先转换为字符串,然后字符串反转,最后转为有符号整数,考虑数值范围。

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

169. 求众数

LeetCode每周刷题(2019.7.8-2019.7.14)_第4张图片

使用哈希表统计每个元素的频次,当某个数的频次大于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

 

你可能感兴趣的:(算法分析与设计)