算法题目 数学方法

Posted by SunQH Blog on February 13, 2021

Leetcode按类型

数学

总结

负数的python数学操作

1
2
3
4
5
6
7
在python这个神奇的语言里负数取模和负数地板除和其他语言是不一样的
需要把取模替换成%(-val)
把地板除替换成int(x / val)

ans += (x % 10) if x>0 else (x%-10)
x = x // 10 if x>0 else int(x/10)

✅7.整数反转

给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
示例 1:

输入: 123
输出: 321
示例 2:

输入: -123
输出: -321
示例 3:

输入: 120
输出: 21
注意:

假设我们的环境只能存储得下 32 位的有符号整数则其数值范围为 [231,  231  1]请根据这个假设如果反转后整数溢出那么就返回 0
1
2
3
num = 123
num_reverse = num//100 + (num%100//10)*10 + (num%100%10)*100
num_reverse
1
2**31

2️⃣

2️⃣ (1.5h)

✅ (30m) 7. 整数反转

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Solution:
    def reverse(self, x: int) -> int:
        string = list(str(x))
        if string[0] == '-':
            string.pop(0)
            ans = 0
    #         print (string)
            for i in range(len(string)):
                ans = int(string[i])*10**i + ans
            ans = -ans
        else:
            ans = 0
    #         print (string)
            for i in range(len(string)):
                ans = int(string[i])*10**i + ans 
        if ans<-2**31 and ans>2**31-1: return 0
        return ans
1
2
3
4
5
6
7
8
9
10
# m数学法
class Solution:
    def reverse(self, x): 
        ans = 0
        while (x != 0): 
            pop = x % 10
            ans = ans * 10 + pop
            x = x//10
        return ans

1
2
3
4
5
6
from typing import List

nums = 123
solution = Solution()
result = solution.reverse(nums)
result

🚩4. 寻找两个正序数组的中位数

给定两个大小为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。

请你找出这两个正序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。

你可以假设 nums1 和 nums2 不会同时为空。

1
2
3
4
5
6
7
8
9
10
11
12
13
示例 1:

nums1 = [1, 3]
nums2 = [2]

则中位数是 2.0

示例 2:

nums1 = [1, 2]
nums2 = [3, 4]

则中位数是 (2 + 3)/2 = 2.5

2️⃣

1
class Solution:    def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float:                                
1
nums1 = [1, 2]nums2 = [3, 4]solution = Solution()result = solution.findMedianSortedArrays(nums1,nums2)result