leetcode-137. 只出现一次的数字 II

题目

给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现了三次。找出那个只出现了一次的元素。

说明:

你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?

示例 1:

输入: [2,2,3,2]
输出: 3

示例 2:

输入: [0,1,0,1,0,1,99]
输出: 99

解题思路

通用版解法可见这里,还可以用数学版解法。

A A A B B B CA A A B B B C C C的差,就是出现了1次的C的2倍,所以用数学可以解

代码

class Solution:
    def singleNumber(self, nums: List[int]) -> int:
        return (sum(set(nums)) * 3 - sum(nums)) // 2

Add a k-base xor solution here:

class Solution:
    def change_base_to_k(self, num: int, k: int) -> str:
        """
        change decimal number to base k

        Args:
            num: int, decimal integer
            k: int
        Returns:
            res: str, left->right: least->most important
        """
        res = ''
        while num > 0:
            res += str(num % k)
            num //= k
        return res

    def xor_base_k(self, num1: str, num2: str, k: int) -> str:
        """
        Xor based on k, add without carry

        Args:
            num1: str, left->right: least -> most important
            num2: str, left->right: least -> most important
            k: int
        Returns:
            res: str, left -> right: least -> most important
        """
        if len(num1) == 0:
            return num2
        if len(num2) == 0:
            return num1
        res = ''
        for i in range(min(len(num1), len(num2))):
            d1, d2 = int(num1[i]), int(num2[i])
            d = (d1 + d2) % k
            res += str(d)
        res += num1[i+1:]
        res += num2[i+1:]
        return res

    def base_k_to_decimal(self, num: str, k: int, sign: int) -> int:
        """
        Args:
            num: string, left -> right: least -> most important
            k: int
            sign: str, '1' - positive, '2' - negative
        """
        res = 0
        for digit in num[::-1]:
            res = res * k + int(digit)
        return res * (1 if sign == '1' else -1)

    def singleNumber(self, nums: List[int]) -> int:
        res = ''
        res_sign = ''
        k = 3
        for each_num in nums:
            if each_num < 0:
                sign = '2'
                each_num *= -1
            else:
                sign = '1'
            res_sign: str = self.xor_base_k(res_sign, sign, k)
            each_num_base_k: str = self.change_base_to_k(each_num, k)
            res = self.xor_base_k(each_num_base_k, res, k)
        return self.base_k_to_decimal(res, k, res_sign)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值