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