LeetCode Math算法题(Easy级别)整理 Part 1

7. Reverse Integer

题目简介:翻转一个数字的数字部分的字符,即负数的“-”位置不变,只翻转数字部分。当翻转后的数字溢出时(超过32有符号整数的范围),返回0。

解题思路:将数字转成字符串,利用字符串的翻转即可,同时注意对翻转后的数字做是否溢出的判断即可。代码如下:

class Solution(object):
    def reverse(self, x):
        """
        :type x: int
        :rtype: int
        """
        xStr = str(x)
        ret = int('-'+xStr[1:][::-1]) if xStr[0] == '-' else int(xStr[::-1])
        if ret < 0:
            if ret < -0x7fffffff:
                return 0
        else:
            if ret > 0x7fffffff:
                return 0
        return ret

9. Palindrome Number

题目简介:判断一个数是否回文。

解题思路:转成字符串后,判断原串和逆串是否相等即可。代码如下:

class Solution(object):
    def isPalindrome(self, x):
        """
        :type x: int
        :rtype: bool
        """
        xStr = str(x)
        return xStr == xStr[::-1]

13. Roman to Integer

题目简介:将罗马数字转成阿拉伯数字。

解题思路:这题没做= =因为要去了解罗马数字的规则= =偷懒了。直接用的这位朋友提供的代码,想了解思路的也可以去该链接处看看。代码如下:

class Solution(object):
    def romanToInt(self, s):
        """
        :type s: str
        :rtype: int
        """
        digits = {"I":1, "V":5, "X":10, "L":50, "C":100, "D":500, "M":1000}
        sum = digits[s[len(s)-1]]
        for i in xrange(len(s)-1, 0, -1):
            cur = digits[s[i]]
            pre = digits[s[i-1]]
            sum += pre if pre >= cur else -pre
        return sum

66. Plus One

题目简介:给定一个列表,每个列表元素为一个数字(0-9),整个列表可看做是一个合规的非负整数,对该列表进行整数加一操作,返回加一后的列表。

解题思路:从后往前一个个判断即可,主要注意相加后是否有进位。代码如下:

class Solution(object):
    def plusOne(self, digits):
        """
        :type digits: List[int]
        :rtype: List[int]
        """
        l = len(digits)
        digits[l-1]+=1
        c = digits[l-1]//10
        digits[l-1]%=10
        for i in xrange(len(digits)-2,-1,-1):
            digits[i]+=c
            c = digits[i]//10
            digits[i]%=10
        if c:
            return [1]+digits
        return digits

67. Add Binary

题目简介:给定两个代表二进制数字的字符串,对其求和。

解题思路:学会使用int()和bin()内置函数即可。代码如下:

class Solution(object):
    def addBinary(self, a, b):
        """
        :type a: str
        :type b: str
        :rtype: str
        """
        aint,bint = int(a,2),int(b,2)
        return bin(aint+bint)[2:]

69. Sqrt(x)

题目简介:不调用库函数,自己实现sqrt函数,只返回根的整数部分。

解题思路:没什么意义= =还是偷懒调库函数好了。代码如下:

import math
class Solution(object):
    def mySqrt(self, x):
        """
        :type x: int
        :rtype: int
        """
        return int(math.sqrt(x))

168. Excel Sheet Column Title

题目简介:给定一个整数,返回他在Excel表中的标题数(A,B,C …)

解题思路:本质上就是将一个十进制数转成26进制数的问题,所以可以类似的用不同进制转换的方法来解题。代码如下:

class Solution(object):
    def convertToTitle(self, n):
        """
        :type n: int
        :rtype: str
        """
        alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
        ret = []
        while n > 0:
            n-=1
            ret.append(alphabet[n%26])
            n = int(n/26)
        return ''.join(ret[::-1])

171. Excel Sheet Column Number

题目简介:与168题相反,该题需要将Excel表中的标题转成对应的序数。

解题思路:26进制转十进制 = =。代码如下:

class Solution(object):
    def titleToNumber(self, s):
        """
        :type s: str
        :rtype: int
        """
        reversedS = s[::-1]
        ans = 0
        for i in range(len(reversedS)):
            ans+=((ord(reversedS[i])-64))*(26**i) #64 == ord('A')-1
        return ans

202. Happy Number

题目简介:判定一个数是否为happy number

解题思路:按照规则,依次计算,并保存每次计算的结果。当计算出的结果之前没有出现过且不为1,则继续计算;若出现过,则返回False;为1则返回True。代码如下:

class Solution(object):
    def isHappy(self, n):
        """
        :type n: int
        :rtype: bool
        """
        if n <= 0:
            return False
        memo = {}
        memo[n] = 1
        while True:
            t = 0
            while n:
                t+=(n%10)**2
                n//=10
            if t == 1:
                return True
            if t in memo:
                return False
            n = t
            memo[n] = 1

231. Power of Two

题目简介:判断一个数是否为2的乘方。

解题思路:不断地除2判断即可。代码如下:

class Solution(object):
    def isPowerOfTwo(self, n):
        """
        :type n: int
        :rtype: bool
        """
        if n <= 0:
            return False
        while not (n % 2):
            n//=2
        if n == 1:
            return True
        return False

258. Add Digits

题目简介:对一个数字,将其各个位上的数字相加,得到一个新数字,重复这一过程,直到得到的数字为个位数。

解题思路:观察可得,这是一个重复的过程。从1开始到9结束,然后又会开始一个1到9的循环,然后再一个。代码如下:

class Solution(object):
    def addDigits(self, num):
        """
        :type num: int
        :rtype: int
        """
        if not num:
            return 0
        ret = num % 9
        if not ret:
            return 9
        return ret

263. Ugly Number

题目简介:判断一个数是不是ugly number

解题思路:根据条件判断即可。代码如下:

class Solution(object):
    def isUgly(self, num):
        """
        :type num: int
        :rtype: bool
        """
        if num < 0:
            return False
        while num:
            if num % 2 == 0:
                num = int(num/2)
            else:
                break
        if num == 1:
            return True
        while num:
            if num % 3 == 0:
                num = int(num/3)
            else:
                break
        if num == 1:
            return True
        while num:
            if num % 5 == 0:
                num = int(num/5)
            else:
                break
        if num == 1:
            return True
        return False

268. Missing Number

题目简介:给定从0,1,2…n中提取而得的n个不同的数,求缺失的是哪个数。

解题思路:利用求0,1,2,…n的总和后减去所给的n个数的和即可知道缺失的数是哪个。代码如下:

class Solution(object):
    def missingNumber(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        n = len(nums)
        return (n+1)*n//2-sum(nums)

326. Power of Three

题目简介:判断一个数是否为3的幂次方。

解题思路:依次除3,看是否一直能整除至1即可。代码如下:

class Solution(object):
    def isPowerOfThree(self, n):
        """
        :type n: int
        :rtype: bool
        """
        while n:
            if n % 3 == 0:
                n//=3
                continue
            break
        if n == 1:
            return True
        return False

另有一种较快的方法为先找出整数范围内最大的3的幂次方,然后判断给定数能否被其整除即可。代码如下:

class Solution(object):
    def isPowerOfThree(self, n):
        """
        :type n: int
        :rtype: bool
        """
        # 3^19 = 1162261467 which is the largest power of 3 in integer range
        if n>0 and 1162261467%n == 0: return True
        else: return False

367. Valid Perfect Square

题目简介:判断一个数是否为标准完全平方数

解题思路:太简单了,直接上代码:

class Solution(object):
    def isPerfectSquare(self, num):
        """
        :type num: int
        :rtype: bool
        """
        return int(num**0.5)==num**0.5

400. Nth Digit

题目简介:有一串无穷的数,1,2,3,4,5,6,7…,求第n个digit是几。

解题思路:分三步走。第一步,判断第n个digit是在几位数的范畴里;第二步,判断其在哪个数内;第三步,找出所需的digit。代码如下:

class Solution(object):
    def findNthDigit(self, n):
        """
        :type n: int
        :rtype: int
        """
        startIndex = [1]
        for i in range(1,10):
            startIndex.append(startIndex[i-1]+i*9*10**(i-1))
        start = 1
        interval = 1
        for i in range(10):
            if startIndex[i] == n:
                return 1
            if startIndex[i] > n:
                interval = i
                break
        num = n - startIndex[i-1]
        delta = num // i
        digit = num % i
        return int(str(10**(i-1)+delta)[digit])

415. Add Strings

题目简介:现有num1和num2两个字符串表示的大数字,对其求和(不可直接用内置函数转换成数字)。

解题思路:逐字符判断即可。代码如下:

class Solution(object):
    def addStrings(self, num1, num2):
        """
        :type num1: str
        :type num2: str
        :rtype: str
        """
        if not num1:
            return num2
        if not num2:
            return num1
        num1Len = len(num1)
        num2Len = len(num2)
        c = n = 0
        num = []
        if num1Len == num2Len:
            for i in range(num1Len-1,-1,-1):
                if c:
                    n = int(num1[i])+int(num2[i])+c
                else:
                    n = int(num1[i])+int(num2[i])
                num.append(str(n%10))
                c = n//10
            if c:
                num.append('1')
            return ''.join(num[::-1])
        elif num1Len < num2Len:
            i = num1Len-1
            j = num2Len-1
            while i >= 0:
                if c:
                    n = int(num1[i])+int(num2[j])+c
                else:
                    n = int(num1[i])+int(num2[j])
                i-=1
                j-=1
                num.append(str(n%10))
                c = n//10
            while j >= 0:
                if c:
                    n = int(num2[j])+c
                else:
                    n = int(num2[j])
                j-=1
                num.append(str(n%10))
                c = n//10
            if c:
                num.append('1')
            return ''.join(num[::-1])
        else:
            i = num1Len-1
            j = num2Len-1
            while j >= 0:
                if c:
                    n = int(num1[i])+int(num2[j])+c
                else:
                    n = int(num1[i])+int(num2[j])
                i-=1
                j-=1
                num.append(str(n%10))
                c = n//10
            while i >= 0:
                if c:
                    n = int(num1[i])+c
                else:
                    n = int(num1[i])
                i-=1
                num.append(str(n%10))
                c = n//10
            if c:
                num.append('1')
            return ''.join(num[::-1])

441. Arranging Coins

题目简介:给定n枚硬币,按照第一层放一枚硬币,第二层放两枚,第三层放三枚的规则,求n枚硬币能放满完整的阶梯数。

解题思路:若n枚硬币刚好能够放满k层阶梯,可得k*(k+1)/2=n,则放满的最后一层肯定小于n的平方根,以此作为限制条件判断即可。代码如下:

import math
class Solution(object):
    def arrangeCoins(self, n):
        """
        :type n: int
        :rtype: int
        """
        limit = int(math.sqrt(2*n))
        total = limit*(limit+1)//2
        if total <= n:
            return limit
        elif total > n:
            return limit-1

507. Perfect Number

题目简介:判断一个数是否为perfect number

解题思路:根据规则判断即可。代码如下:

import math
class Solution(object):
    def checkPerfectNumber(self, num):
        """
        :type num: int
        :rtype: bool
        """
        if num <= 1:
            return False
        digits = [1]
        for i in range(2,int(math.sqrt(num))+1):
            if num % i == 0:
                digits.extend([i,num//i])
        return num == sum(digits)

598. Range Addition II

题目简介:给定一个m*n的全0矩阵,给一系列操作(a,b),一个(a,b)表示对m*n的矩阵中横座标小于a且纵座标小于b的所有元素都加1。求所有操作结束后,m*n矩阵中最大值的个数。

解题思路:求a和b的最小值即可。代码如下:

class Solution(object):
    def maxCount(self, m, n, ops):
        """
        :type m: int
        :type n: int
        :type ops: List[List[int]]
        :rtype: int
        """
        if not ops:
            return m*n
        minX = minY = 40000
        for op in ops:
            if minX > op[0]:
                minX = op[0]
            if minY > op[1]:
                minY = op[1]
        return minX*minY

628. Maximum Product of Three Numbers

题目简介:给定一串数,求其中三个数能得到的最大乘积。

解题思路:易得三个数的最大乘积取得的情况只有两种,一是三个最大的正数相乘,二是一个最大的正数和两个最小的负数相乘。代码如下:

import sys
class Solution(object):
    def maximumProduct(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        min1,min2 = sys.maxint,sys.maxint
        max1,max2,max3 = -sys.maxint,-sys.maxint,-sys.maxint
        for n in nums:
            if n <= min1:
                min2 = min1
                min1 = n
            elif n < min2:
                min2 = n
            if n >= max1:
                max3 = max2
                max2 = max1
                max1 = n
            elif n >= max2:
                max3 = max2
                max2 = n
            elif n > max3:
                max3 = n
        return max1*max(min1*min2, max2*max3)

633. Sum of Square Numbers

题目简介:判断一个数是否为完全平方数。

解题思路:根据公式判断即可。注意限制上限。代码如下:

import math
class Solution(object):
    def judgeSquareSum(self, c):
        """
        :type c: int
        :rtype: bool
        """
        limit = int(math.sqrt(c/2))
        for i in range(limit+1):
            delta = c - i*i
            if math.sqrt(delta) == int(math.sqrt(delta)):
                return True
        return False

645. Set Mismatch

题目简介:集合s中原有1到n工n个不同的数,由于出错,有一个数变成了其他的数。求重复的数以及缺失的数,将其以列表的形式返回。

解题思路:利用字典,一轮遍历即可得结果。代码如下:

class Solution(object):
    def findErrorNums(self, nums):
        """
        :type nums: List[int]
        :rtype: List[int]
        """
        numsArray = [0]*len(nums)
        for n in nums:
            numsArray[n-1]+=1
        return [numsArray.index(2)+1,numsArray.index(0)+1]

解法二:

class Solution(object):
    def findErrorNums(self, nums):
        """
        :type nums: List[int]
        :rtype: List[int]
        """
        delta = sum(set(nums))
        return [sum(nums)-delta,len(nums)*(len(nums)+1)//2-delta]

728. Self Dividing Numbers

题目简介点击打开链接

解题思路:简单题,直接上代码了。

class Solution(object):        
    def numberContainsZero(self, num):
        if '0' in str(num):
            return True
        else:
            return False
    
    def isSelfDivided(self, num):
        Len = len(str(num))
        n = num
        for i in range(Len):
            if (num % (n%10) != 0):
                return False
            n = n/10
        return True

    def selfDividingNumbers(self, left, right):
        """
        :type left: int
        :type right: int
        :rtype: List[int]
        """
        ary = []
        for i in range(left, right+1,1):
            if self.numberContainsZero(i):
                continue
            if self.isSelfDivided(i):
                ary.append(i)
        return ary
点赞