LeetCode刷题笔记(七)数论

七. 数论

7. 整数反转

题目:整数反转

    def reverse(self, x: int) -> int:
        if x==0:
            return 0

        result = 0
        flag = 1 # 记录正数负数

        if x < 0: # 先去掉符号
            x = -x
            flag = -1

        while (x>=10):
            t1 = x % 10
            x = (x - t1) / 10
            result = (result + t1)*10


        result = result + x
        result = flag*result

        if result > 2147483648-1: # 几个特殊情况
            return 0
        if result < -2147483648: # 几个特殊情况
            return 0
9. 回文数

题目:回文数

    def isPalindrome(self, x: int) -> bool:
        if x < 0:
            return False
        else:
            if x == int(str(x)[::-1]): # 用了字符串和int型强制类型转换
                return True 
            else:
                return False
69. x 的平方根

题目:x 的平方根

    def mySqrt(self, x: int):
        l, r, ans = 0, x, -1
        while l <= r: # 经典的二分法
            mid = (l + r) // 2
            if mid * mid <= x:
                ans = mid
                l = mid + 1
            else:
                r = mid - 1
        return ans
136. 只出现一次的数字

题目:只出现一次的数字
输入:[2,2,1]
输出:1

    def singleNumber(self, nums: List[int]) -> int:
        res = nums[0]
        for i in range(1, len(nums)):
            res = res^nums[i] # 所有数字异或,相同为0,剩下那个就是
        return res
172. 阶乘后的零

题目:阶乘后的零
思考:看数字中有多少个5,5算1个5,25算2个5,依次类推。

        res = 0
        while n:
            res = res + int(n/5)
            n = n / 5
        return res
202. 快乐数

题目

    def isHappy(self, n: int) -> bool:
        while n:
            n = self.cal(n)
            if n < 10:
                break
        if n == 1 or n == 7: # 等于7时,再按模式计算会变成1
            return True
        else:
            return False

    def cal(self, n: int) -> int:
        res = 0
        while n:
            tmp = n % 10
            res = res + tmp * tmp
            n = ( n - tmp) / 10
        return int(res)
204. 计数质数

题目:统计质数个数
思考:本科C语言课程上学过,筛法求素数。

        is_prime = [True]*(n)
        ans = 0
        for num in range(2,n): 
            if is_prime[num]:
                ans+=1
                # 右边界:因为数字最大是n-1 所以只需要到(n-1)//num 右边是开区间 所以+1
                for k in range(1,(n-1)//num+1):
                    is_prime[num*k]=False
        return ans
231. 2 的幂

题目:给你一个整数 n,请你判断该整数是否是 2 的幂次方。

    def isPowerOfTwo(self, n: int) -> bool:
        if n <= 0:
            return False
        if n == 1:
            return True

        if int(n) & 1 == 0:
            return self.isPowerOfTwo(n / 2) # 递归,如果n是2的幂,那么n/2还是2的幂
        else:
            return False
258. 各位相加

题目:给定一个非负整数 num,反复将各个位上的数字相加,直到结果为一位数。
输入:38
输出:各位相加的过程为:3 + 8 = 11, 1 + 1 = 2。 由于 2 是一位数,所以返回 2。
思考:这题就是9加1进位,和mod 9有关。

    def addDigits(self, num: int) -> int:
        if num == 0: 
            return 0 
        return (num - 1) % 9 + 1
263. 丑数

题目:丑数 就是只包含质因数 2、3 和/或 5 的正整数。

    def isUgly(self, n: int) -> bool:
        if n == 0:
            return False
        while True: # 把所有2因子去除
            if n % 2 == 0:
                n = n/2
            else:
                break
        while True: # 把所有3因子去除
            if n % 3 == 0:
                n = n/3
            else:
                break
        while True: # 把所有5因子去除
            if n % 5 == 0:
                n = n/5
            else:
                break
        if n == 1:
            return True
        else:
            return False
268. 丢失的数字

题目:丢失的数字
思考:1-n连续但是不是顺序排列的数字,求和一减就完成。

    def missingNumber(self, nums: List[int]) -> int:
        res = 0
        for i in range(len(nums)+1):
            res = res + i # 此处求和公式可以用n(n+1)/2
        for i, x in enumerate(nums):
            res = res - x
        return res
292. Nim 游戏

题目:Nim 游戏
思考:4的倍数

    def canWinNim(self, n: int) -> bool:
        if n % 4 == 0:
            return False
        else:
            return True

你可能感兴趣的:(LeetCode刷题笔记(七)数论)