某程序员:公司最近招了一批35左右的,这帮人习惯天天卷到八点多,导致现在我们也要八点才下班...

大家好,我是程序员小灰。

如果要用一些词来形容东南亚人群的特征,「内卷」这个词肯定是其中一个,国人在激烈的考公考研、35岁天花板的现象下,对此高度共鸣,“卷王”频出的舆论场,曾衍生出一句经典口号:“宁可累死自己,也要卷死别人”。

程序员群体尤为感同身受,一旦公司或者部门来了一个卷王,会被动的导致整个部门都进入卷的状态,而这种改变很多时候都是无效内卷。

前几天在网上看到一个程序员的吐槽贴,他们公司最近招进了一批35岁左右的新员工,这批新员工习惯天天卷到八点多才下班,慢慢地这种加班文化就开始在团队中蔓延,老员工为了不让领导觉得自己懈怠,也不得不跟着加班,结果导致现在整个公司都要到八点才能下班。

ba8e253bbf3d2290e4683e3a16b82c70.png

可能有些人认为八点下班不算卷,很多公司都是九点甚至十点才下班,但没必要比烂呀,要看到他们公司这种变化的趋势。

不过话又说回来,35 岁的同事们,之前肯定已经习惯了这样的工作方式,同时又更加珍惜现在好不容易找到的工作,只能通过这种方式来维持现状。

有点无解。


继续今天的算法学习,来一个简单的算法题:删除有序数组中的重复项

一、题目描述

给你一个 升序排列 的数组 nums ,请你原地删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致

由于在某些语言中不能改变数组的长度,所以必须将结果放在数组nums的第一部分。更规范地说,如果在删除重复项之后有 k 个元素,那么 nums 的前 k 个元素应该保存最终结果。

将最终结果插入 nums 的前 k 个位置后返回 k

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

判题标准:

系统会用下面的代码来测试你的题解:

int[] nums = [...]; // 输入数组
int[] expectedNums = [...]; // 长度正确的期望答案

int k = removeDuplicates(nums); // 调用

assert k == expectedNums.length;
for (int i = 0; i < k; i++) {
    assert nums[i] == expectedNums[i];
}

如果所有断言都通过,那么您的题解将被 通过

示例 1:

输入:nums = [1,1,2] 输出:2, nums = [1,2,_] 解释:函数应该返回新的长度 2 ,并且原数组 nums 的前两个元素被修改为 1, 2 。不需要考虑数组中超出新长度后面的元素。

示例 2:

输入:nums = [0,0,1,1,1,2,2,3,3,4] 输出:5, nums = [0,1,2,3,4] 解释:函数应该返回新的长度 5 , 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4 。不需要考虑数组中超出新长度后面的元素。

提示:

  • 1 <= nums.length <= 3 * 10^4

  • -10^4 <= nums[i] <= 10^4

  • nums 已按 升序 排列

二、题目解析

在这个问题中,主要涉及到对数组的操作。数组是一种线性表数据结构,具有连续的内存空间,可以通过下标来访问其中的元素。

算法考察点
  1. 数组遍历:遍历数组是这个问题的核心操作,需要通过循环遍历数组元素。

  2. 指针操作:使用指针来记录当前处理的位置,可以减少不必要的移动操作。

  3. 数组元素去重:需要去除数组中的重复元素,可以通过比较相邻元素来实现。

算法思路
  1. 初始化两个指针 ij,其中 i 用于遍历数组,j 用于记录即将被赋值的位置,初始值为 0。

  2. 从数组的第一个元素开始,遍历数组:

  • 如果当前元素与上一个元素不相同,说明出现了新的元素,将其赋值给 nums[j],并将 j 后移一位。

  • 如果当前元素与上一个元素相同,则跳过,继续向后遍历。

遍历完成后,j 的值即为去重后数组的长度。

返回 j 作为结果。

算法的优势
  • 算法通过一次遍历数组即可完成去重操作,时间复杂度较低。

  • 使用两个指针来记录当前处理的位置,避免了对数组进行频繁的移动操作。

算法的适用性
  • 适用于需要对排序数组进行去重的情况,时间复杂度与数组长度成线性关系。

易错点
  1. 在判断当前元素是否与上一个元素相同时,需要注意索引的范围,确保不越界。

  2. 对于初始位置的处理,需要特殊考虑,确保正确处理第一个元素。

类似的算法题
  • LeetCode 第 80 号问题:“删除排序数组中的重复项 II”:允许重复最多两次,需要保留至少两次出现的元素。

通过解决这些类似的问题,可以更好地理解和掌握数组去重操作的方法和技巧。

三、参考代码

class Solution:
    def removeDuplicates(self, nums: List[int]) -> int:
        # 指针 i 进行数组遍历
        n = len(nums)

        # 指针 j 指向即将被赋值的位置
        j = 0

        # 开始对数组进行遍历
        for  i in range(n): 

            # 进行筛选
            if  i == 0 or  nums[i] != nums[i - 1] : 
                # 赋值
                nums[j] = nums[i]

                # j 移动
                j += 1
 

        # 获取结果
        return j

ending

小灰准备在4月25日20:00进行一场直播,与AI代写高手李慢慢连麦,为大家讲一讲关于AI代写的知识,有兴趣的小伙伴欢迎扫码预约:

9d98505b5f6fbef32b56f0c35631957a.jpeg

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值