【Leetcode】数学系列

【Leetcode-9】

一、题目:回文数

  给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。

  回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。例如,121 是回文,而 123 不是。

二、代码:

def isPalindrome(self, x: int) -> bool:
        """
        可转为字符串再判断,但需额外空间。
        考虑取数字的后一半,与前一半进行对比,若相等则为回文数
        1.负数不可能为回文数,
        2.当数字后一半>=前一半时已经取得后一半数字,后一半可能多一位 
        3.当最后一位为0时,用last//10得到前面为0,会认为相等,但第一位不可能为0,所以最后一位为0直接返回False
        4.只有1个0需要返回True
        """
        if x == 0:
            return True
        if x < 0 or x % 10 == 0:
            return False
        last = 0
        while last < x:
            last = last*10 + x%10
            x //= 10
        if last == x or last // 10 == x:
            return True
        return False

 

【Leetcode-136】

一、题目:只出现一次的数字

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

  说明:

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

二、代码:

def singleNumber(self, nums: List[int]) -> int:
        ans = nums[0]
        for num in nums[1:]:
            ans = ans ^ num
        return ans

 

【Leetcode-326】

一、题目:3的幂

  给定一个整数,写一个函数来判断它是否是 3 的幂次方。如果是,返回 true ;否则,返回 false 。

二、代码:

def isPowerOfThree(self, n: int) -> bool:
        """
        若为3的幂,则一直除3最后商为1,特殊情况是3的0次方为1
        """
        if n == 1:
            return True
        if n % 3 != 0:
            return False
        while n >= 3:
            n = n / 3
        if n == 1:
            return True
        else:
            return False

 

【Leetcode-338】

一、题目:比特位计数

  给定一个非负整数 num。对于 0 ≤ i ≤ num 范围中的每个数字 i ,计算其二进制数中的 1 的数目并将它们作为数组返回。

二、代码:

def countBits(self, num: int) -> List[int]:
        res = []
        for item in range(num+1):
            t = 0
            p = item
            while p:
                p = p & (p-1)
                t += 1
            res.append(t)
        return res

 

【Leetcode-461】

一、题目:汉明距离

  两个整数之间的汉明距离指的是这两个数字对应二进制位不同的位置的数目。

  给出两个整数 x 和 y,计算它们之间的汉明距离。

二、代码:

def hammingDistance(self, x: int, y: int) -> int:
        xor = x ^ y
        n = 0
        while xor:
            xor = xor & (xor-1)
            n += 1
        return n

 

【Leetcode-470】

一、题目:用rand7实现rand10

  已有方法 rand7 可生成 1 到 7 范围内的均匀随机整数,试写一个方法 rand10 生成 1 到 10 范围内的均匀随机整数。

二、代码:

def rand10(self):
        """
        基本原理:
            0:randX可均匀生成1-X
            1.(randY-1)*X + randX可生成rand(X*Y)
            2.拒绝采样后生成的概率依然是相同的
            3.randX是均匀分布时,randX%n+1依然是randn均匀分布,X需要能整除n
        """
        while True:  # 直到生成满足条件的
            x = rand7()
            y = rand7()
            num = (y-1)*7 + rand7() # 1-49 
            if num <= 40:
                return num % 10 + 1
            # num 41-49
            num = num - 40  # rand9
            num = (num-1)*7 + rand7()  # rand63
            if num <= 60:
                return num % 10 + 1
            # num 61-63
            num = num - 60  # rand3
            num = (num-1)*7 + rand7()  # rand21
            if num <= 20:
                return num % 10 + 1

 

posted @ 2021-04-17 22:51  我若成风者  阅读(85)  评论(0编辑  收藏  举报