(Datawhale组队学习)Leetcode面试篇-Task1-day2

题目1  排序数组  leetcode912

描述:给定一个整数数组 nums

要求:将该数组升序排列。

当然可以直接调用sorted函数,如下,非常方便。

class Solution:
    def sortArray(self, nums: List[int]) -> List[int]:
        return sorted(nums)

也可以自己手写一下快速排序,锻炼一下自己 ,这题光靠快速排序还不行,测试点中有全是正确升序的满额列表,需要加入随机因素,这样分割起来才快一些

def partition(A, p, r):
    x = A[r]
    i = p-1
    for j in range(p,r):
        if A[j] < x:
            i = i + 1
            A[i],A[j] = A[j],A[i]
    A[i+1],A[r] = A[r],A[i+1]
    return i+1

# 加入随机的元素,要不然在原序列都是正确顺序的情况下,时间复杂度是O(n^2)级别的
def randomized_partition(A, p, r):
    i = random.randint(0, 100000)%(r - p + 1) + p # 随机选择p右边的一个元素作为主元
    A[i],A[r] = A[r],A[i]
    return partition(A, p, r)

def quicksort(A, p, r):
    if p<r:
        q = randomized_partition(A, p, r)
        quicksort(A, p, q-1)
        quicksort(A, q+1, r)
class Solution:     
    def sortArray(self, nums: List[int]) -> List[int]:
        quicksort(nums,0,len(nums)-1)
        return nums

题目2 合并两个有序数组 leetcode88

描述:给定两个有序数组 nums1nums2

要求:将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组。

 

 O(n*(n+m))复杂度

class Solution:
    def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None:
        """
        Do not return anything, modify nums1 in-place instead.
        """
        # 在nums1中进行遍历,找到nums1[i]>x,nums1[i-1]<=x,就可以将x插入i上
        # 如果i位于边界上,则可以直接插入
        left = 0
        right = m-1
        if m == 0:
            for i in range(n):
                nums1[i]=nums2[i]
            return 
        for i in range(n):
            for j in range(n+m):
                if j == left and nums2[i]<=nums1[j]:
                    nums1.insert(j,nums2[i])
                    break
                if nums1[j]>nums2[i] and nums1[j-1]<=nums2[i]:
                    nums1.insert(j,nums2[i])
                    break
                if j == right and nums2[i]>=nums1[j]:
                    nums1.insert(j+1,nums2[i])
                    break
            right+=1
        for i in range(n):
            nums1.pop()
        
                
                

O(n+m)复杂度

class Solution:
    def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None:
        """
        Do not return anything, modify nums1 in-place instead.
        """
        # 在nums1中进行遍历,找到nums1[i]>x,nums1[i-1]<=x,就可以将x插入i上
        # 如果i位于边界上,则可以直接插入
        left = 0
        right = m-1
        point1 = 0
        point2 = 0
        if m == 0:
            for i in range(n):
                nums1[i]=nums2[i]
            return
        while right<n+m-1:
            if point1 == left and nums2[point2]<=nums1[point1]:
                nums1.insert(point1,nums2[point2])
                point2+=1
                right+=1
            elif nums1[point1]>=nums2[point2] and nums1[point1-1]<=nums2[point2]:
                nums1.insert(point1,nums2[point2])
                point2+=1
                right+=1
            elif point1 == right and nums1[point1]<nums2[point2]:
                nums1.insert(point1+1,nums2[point2])
                point2+=1
                right+=1
            point1+=1
            
        for i in range(n):
            nums1.pop()
        
                
                

题目3 多数元素 leetcode169

描述:给定一个大小为n的数组 nums

要求:返回其中相同元素个数最多的元素。

 

class Solution:
    def majorityElement(self, nums: List[int]) -> int:
        # 将列表转化为集合,再设一个字典,将集合元素作为字典的键,再遍历字典
        # 直接数数
        dic = {}
        n = len(nums)
        for x in set(nums):
            dic[x] = 0
        for x in nums:
            dic[x]+=1
        for x in dic.keys():
            if dic[x]>n//2:
                return x

今日加练:易混淆数 leetcode1056

描述:给定一个数字 N,当它满足以下条件的时候返回 true

原数字旋转 180° 以后可以得到新的数字。

如 0, 1, 6, 8, 9 旋转 180° 以后,得到了新的数字 0, 1, 9, 8, 6 。

2, 3, 4, 5, 7 旋转 180° 后,得到的不是数字。

易混淆数 (confusing number) 在旋转180°以后,可以得到和原来不同的数,且新数字的每一位都是有效的。

class Solution:
    def confusingNumber(self, n: int) -> bool:
        # 易混淆数 (confusing number) 在旋转180°以后
        # 可以得到和原来不同的数 -> 全为1或者全为8则不行 9和6的位置中心对称也不行
        # 且新数字的每一位都是有效的 -> 原数中只能含有0,1,5,6,8,9
        num = n
        nums = []
        while num:
            nums.append(num%10)
            num//=10
        for x in nums:
            if x==2 or x==3 or x==4 or x==5 or x==7:
                return False
        # 打个表 把各个数旋转后会变成的数打出来
        dic={0:0,1:1,6:9,8:8,9:6}
        s = 0
        for x in nums:
            s*=10
            s+=dic[x]
        if s==n:
            return False
        return True

  • 10
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值