七. 数论
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