200道大数据面试常考Leetcode算法题--数组篇01(python带代码解析)

往期内容在这里:

往期01-05

往期06-10

往期11-15

往期16-20

大家好,继续为大家推荐200道大数据面试常考Leetcode算法题,这期为--数组篇,附带解析,都是从Leetcode官网总结大神们的解法(在这里感谢大神的帮助,我只是个搬运工!)每篇更新5篇,一共更新数组篇20篇,艾瑞巴迪和我一起刷起来!!

200道大数据面试常考Leetcode算法题(数组篇)26- 删除有序数组中的重复项

Leetcod原题为:

 题解为:

class Solution:
    def removeDuplicates(self, nums):
        # 容错判断
        if len(nums) <= 1:
            return len(nums)
        # 慢指针
        slow = 0
        # 快指针快速循环
        for i in range(1, len(nums)): 
            # 找出不相同的数
            if nums[slow] != nums[i]:
                # 然后慢指针右移一位
                slow += 1
                # 再把当前值值赋给慢指针
                nums[slow] = nums[i]
        # 输出数组
        print(nums)
        # 慢指针记录的是非重复元素的索引,最后返回非重复元素个数为 slow + 1
        # 因为slow从0开始
        return slow + 1

200道大数据面试常考Leetcode算法题(数组篇)27- 移除元素

Leetcode原题为:

 题解为:

class Solution:
    def removeElement(self, nums: List[int], val: int) -> int:
        # 容错判断
        if(len(nums) < 1):
            return nums
        # 慢指针从0开始
        slow = 0
        # 快指针快速循环
        for i in range(len(nums)):
            # 找出不同于目标值的时候
            if nums[i] != val:
                # 数组慢指针重新赋值为当前值
                nums[slow] = nums[i]
                # 然后慢指针右移
                slow +=1
        print(nums)
        # 返回慢指针
        return slow

200道大数据面试常考Leetcode算法题(数组篇)31- 下一个排列

Leetcode原题为:

 题解为:

class Solution:
    def nextPermutation(self, nums: List[int]) -> None:
        """
        Do not return anything, modify nums in-place instead.
        """
        n = len(nums)
        if n == 1:         #nums长度为1直接返回nums
            return nums                                     
        temp = list(set(nums))
        if len(temp) == 1:      #nums去重后长度为1,说明所有元素重复,直接返回nums
            return nums
        key = 0                 #主要作用为判断指标
        for i in range(n-2,-1,-1):   #开始遍历
            for j in range(i+1,n):
                if nums[j] > nums [i]:  #找到一个i位置的元素小于i位置后的元素,key除了初始化以外不可能是0,所以拿key做标志
                    if key == 0:    #key为0说明key只经历初始化,找到大于的数直接记录下标
                        key = j
                    else:
                        if nums[key] > nums[j]:   #这时key不止经历过初始化,还经历过赋值,那就要比较一下哪个更小,我们需要更小的哪个大于i位置元素的元素
                            key = j
            if key != 0:        #当结束一个第二循环时就要检查key是否被改变过,改变过说明找到了那个元素。
                nums[i], nums[key] = nums[key], nums[i]     #这时元素进行交换
                key1 = i+1         #记录下排序开始的位置,只有将i位置后的所有元素进行排序才能保证找出来的序列刚好大于又不大过
                break   #找到了就跳出循环
        if key == 0:    #我们结束了循环又发现key还是0,说明原来序列是降序的,直接进行排序后返回就行
            nums = nums.sort()
            return nums
        else:
            at_nums = nums[key1:n]    #key被该过,那就对i后面所有的元素进行排序后返回即可
            at_nums.sort()
            return nums                                           

200道大数据面试常考Leetcode算法题(数组篇)33- 搜索旋转排序数组

Leetcode原题为:

题解为: 

class Solution:
    def search(self, nums, target):
        # 左右指针
        left, right = 0, len(nums) - 1
        while left <= right:
        # 1. 首先计算中间点mid   
            mid = left + (right - left) // 2    
            # 如果该点恰好等于 target,返回
            if nums[mid] == target:
                return mid    
            # 3. 中点必将数组分为有序和无序,先判断前后哪部分有序
            if nums[left] <= nums[mid]:  # 注意这个等号不能少! 测试用例[3, 1] 1 时。 nums[left] 和 nums[mid] 是有机会取相等的
                # 4. 前面有序,判断target在哪边
                if nums[left] <= target  and target < nums[mid]: 
                    # target在有序这边
                    right = mid - 1
                else:
                    # 在无序这边
                    left = mid + 1
            else:
                # 5. 后面有序
                if nums[mid] < target and target <= nums[right]:
                    # target在有序这边
                    left = mid + 1
                else:
                    # 在无序这边
                    right = mid - 1

        # 6. 循环计数,未找到target,那么返回 -1
        return -1

200道大数据面试常考Leetcode算法题(数组篇)34-在排序数组中查找元素的第一个和最后一个位置

Leetcode原题为:

题解为 :

class Solution:
        def searchRange(self, nums: List[int], target: int) -> List[int]:
            # 左右端点
            l, r = 0, len(nums)-1
            # 从左往右循环
            while l <= r:
                # 找到中间值的索引
                mid = (l+r)//2
                # 假如中间值就算目标值
                if nums[mid] == target:
                    # 找到中间值左边开始索引跟右边开始索引
                    if nums[l] == target and nums[r] == target:
                        return [l,r]
                     # 没找到 左边右移一位
                    if nums[l] != target:               
                        l += 1
                     # 没找到 右边左移一位
                    if nums[r] != target:               
                        r -= 1
                # 假如目标值大于中间值,则l,r 都在mid右边
                elif nums[mid] < target:  
                # 则重新定义左边从中间值开始变大              
                    l = mid + 1
                # 假如目标值小于中间值,则l,r 都在mid左边
                else: 
                # 则重新定义右边值从中间值开始变小
                    r = mid - 1
            # 没有即返回-1,-1
            return [-1,-1]

好啦,这期的分享到这里结束啦!我们下期(数组篇02)再见!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一条小海龟

谢谢你的打赏,微臣会好好努力达

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值