萱仔求职系列——3.1 力扣面试150题目——数组&字符串第一弹

由于最近求职又涉及到很多面试时候敲代码,我又不得不捡起我的老力扣,只能说刷题这个东西必须越耍越上瘾,我将稳定更新,每天做3-10题

面试经典 150 题 - 学习计划 - 力扣(LeetCode)全球极客挚爱的技术成长平台

-------------------------------------------------------------------------------------------------------

88. 合并两个有序数组

给你两个按 非递减顺序 排列的整数数组 nums1 nums2,另有两个整数 mn ,分别表示 nums1nums2 中的元素数目。

请你 合并 nums2 nums1 中,使合并后的数组同样按 非递减顺序 排列。

注意:最终,合并后数组不应由函数返回,而是存储在数组 nums1 中。为了应对这种情况,nums1 的初始长度为 m + n,其中前 m 个元素表示应合并的元素,后 n 个元素为 0 ,应忽略。nums2 的长度为 n

这个题目吧,非常简单,要把n2合到n1里,不能重新搞一个新的表出来,由于它本身就是两个非递减的整数数组,我直接用3个指针就好啦,重点在于我要从后往前里面填入数据,因为他那个从前往后会盖住后面的数,没有空位。

对比两个蓝色的,然后大的往绿色那填,就这么easy~

class Solution:
    def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None:
        # 初始化指针
        n1 = m - 1  # nums1 的有效部分的最后一个元素
        n2 = n - 1  # nums2 的最后一个元素
        j = m + n - 1  # 合并后数组的最后一个位置
        for i in range(m + n):
            if n2 < 0:#没有可以合并的啦
                break
            elif n1 >= 0 and nums1[n1] > nums2[n2]:
                nums1[j] = nums1[n1]
                n1=n1-1
            else:
                nums1[j] = nums2[n2]
                n2=n2-1
            j=j-1

27. 移除元素

给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素。元素的顺序可能发生改变。然后返回 nums 中与 val 不同的元素的数量。

假设 nums 中不等于 val 的元素数量为 k,要通过此题,您需要执行以下操作:

  • 更改 nums 数组,使 nums 的前 k 个元素包含不等于 val 的元素。nums 的其余元素和 nums 的大小并不重要。
  • 返回 k

这个有一个题解写的很好,简单来说就是把所有不等于val的填到nums里

class Solution:
    def removeElement(self, nums: List[int], val: int) -> int:
        k=0
        for i in range(0,len(nums)):
            if nums[i]!=val:
                nums[k]=nums[i]
                k=k+1
                #print(k)
        return k

26. 删除有序数组中的重复项

这个题我用字典记录出现过的数字,然后遍历即可

class Solution:
    def removeDuplicates(self, nums: List[int]) -> int:
        dic = {}  
        k = 0  # 个数
        
        for i in range(len(nums)):
            if nums[i] not in dic:
                dic[nums[i]] = True  # 记录该元素已经出现过
                nums[k] = nums[i]  # 将非重复元素放在前面
                k += 1  # 计数+1

        return k

80. 删除有序数组中的重复项 II

给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使得出现次数超过两次的元素只出现两次 ,返回删除后数组的新长度。

不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。

class Solution:
    def removeDuplicates(self, nums: List[int]) -> int:
        # 如果数组长度小于等于 2,直接返回长度
        if len(nums) <= 2:
            return len(nums)
        # k 指向要插入的下一个位置
        k = 2
        # 从索引 2 开始遍历数组
        for i in range(2, len(nums)):
            # 只要当前元素与 k-2 位置的元素不相同,说明没有超过两次
            if nums[i] != nums[k - 2]:
                nums[k] = nums[i]
                k += 1
        return k

169. 多数元素

给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。

你可以假设数组是非空的,并且给定的数组总是存在多数元素。

接着用字典解决熬,记住每个词出现的次数,我这个解法虽然很拉,但是个人认为思路简单,无脑解决问题

class Solution:
    def majorityElement(self, nums: List[int]) -> int:
        dic={}
        k=0
        for i in range(0,len(nums)):
            if nums[i] not in dic:
                dic[nums[i]]=1 
            elif nums[i]  in dic:
                dic[nums[i]]=1+dic[nums[i]] #每个数字出现的次数,遇见了就加一个
        for key, value in dic.items():
            if value>(len(nums)//2) :
                print(key,value)
                k=key #输出符合要求的key
        return k 



189. 轮转数组

给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。

真的很无语以下是一个使用了切片的错误代码,求有没有大佬可以帮看一下这个错误的为什么不对,明明print是对的。

class Solution:
    def rotate(self, nums: List[int], k: int) -> None:
        """
        Do not return anything, modify nums in-place instead.
        """
        n=len(nums)
        n1=nums[0:k+1]
        n2=nums[k+1:n]
        nums2=n2
        for i in range(0,len(n1)):
            nums2.append(n1[i])
            print(nums2)
        return nums2

这是结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值