程序员老鬼

中国最难入职的IT公司

今天看到一份榜单,说的是中国最难入职的IT公司,简直就像是程序员心中的"天花板"。说实话,看到这些公司我心里也没底。

Image

首先排在榜单第一位的竟然是拼多多,别看它现在在大家的日常生活中随处可见,但要进入它可真得费一番功夫。

从算法到面试流程,拼多多都设置了"超级难"的关卡。要是你觉得自己只是个“码农”,那估计会很难顺利过关。

紧随其后的是字节跳动,这家公司更不用说了,算法难度堪比天书!面试题目有时候让我怀疑人生,是不是把所有的数学、计算机知识都融入其中了?每一道题都像是逼着你把自己逼到极限,看你能撑多久。

再看快手,面试流程超长,简直就像在跑马拉松。别以为通过一道技术面就能轻松通过,面试官基本都是"铁面无私",每一轮都需要考验你的综合能力。

这些公司无论是技术要求、面试难度,还是对候选人多方面的能力要求,都让我作为一个程序员深深感受到:程序员的"上班"并非易事。你们怎么看?💪【备注:文末可领最新资料】。

算法题:检查「好数组」

最近在刷算法题的时候,看到一道题:检查“好数组”,感觉挺有意思的。

它的大致意思是:给定一个数组,判断这个数组是否是一个“好数组”。好数组的定义是:这个数组如果能通过删除一个元素,变成一个单调递增或者单调递减的数组,就算是好数组。

一开始看到这个题,我就在想,这不就跟我们平时处理一些代码中的“异常”一样吗?很多时候,系统中的某些错误,或者数据中的“脏”值,往往也只是偶尔出现,怎么在不影响整个系统或者数据流的情况下“修复”它呢?这道题就很类似:删掉一个出问题的元素,其他的部分应该是能继续正常工作的。

但问题来了,题目给的数组可不一定只有一个出问题的元素。这里面就有点挑战了,怎么确保我们删掉的那个元素真的是“问题”元素,而不是只是我们随便选的?接下来,我就结合实际来聊聊怎么解这个题。

我们可以考虑一个非常简单的思路:遍历数组,检查每两个相邻元素的关系。如果发现数组在某个位置不满足递增或者递减的要求,我们就尝试删除该位置的元素,再继续验证剩下的数组。

具体实现上,可以用两个指针,一个指针指向前一个元素,另一个指针指向当前元素。如果当前元素比前一个元素小,就说明出现了一个问题,我们要考虑是否删除当前元素或者前一个元素,看看哪种情况能保持数组单调。如果两种都不行,那就说明数组不是好数组。

不过,讲到这里,大家肯定想:嗯,这听起来是可以解决问题,但时间复杂度上能不能优化一下?我们其实可以用一个技巧来减少不必要的重复操作——遍历一遍数组,记录下出现问题的地方,只尝试删除一次,并且一旦删除,剩下的部分应该能自动调整。

让我们用代码来具体实现一下这个思路:

public class Solution {
    public boolean checkPossibility(int[] nums) {
        int count = 0;  // 用于记录发生问题的次数
        for (int i = 1; i < nums.length; i++) {
            if (nums[i] < nums[i - 1]) {
                if (count > 0) return false;  // 已经出现过一次问题,不能再删除第二次
                count++;

                                // 尝试删除当前元素或者前一个元素
                if (i - 2 < 0 || nums[i - 2] <= nums[i]) {
                    // 如果i-2位置越界或者nums[i-2] <= nums[i],就删除nums[i-1]这个元素
                } else {
                    // 否则删除nums[i]这个元素
                    nums[i] = nums[i - 1];
                }
            }
        }
        return true;
    }
}

解释一下上面的代码:

  • 我们用一个count来记录已经删除了多少次元素。如果删除超过一次,就直接返回false。
  • 当发现问题时,判断是否删除当前元素或者前一个元素,保留一个尝试的机会。
  • 通过这种方式,最多只会进行一次删除操作,剩下的数组会自动调整。

说实话,这种算法在大多数情况下效果都不错,因为它最大限度地减少了删除操作的次数,同时确保了时间复杂度保持在O(n)级别。如果一开始就对数组进行排序或者做更复杂的操作,可能会导致时间复杂度变成O(n log n),那样就没那么高效了。

总之,解这种题,往往不需要太复杂的操作。只要找到问题的本质,并且小心地处理,往往都能找到高效的解决方案。

最后,我为大家打造了一份deepseek的入门到精通教程,完全免费:https://www.songshuhezi.com/deepseek

也可以看我写的这篇文章《DeepSeek满血复活,直接起飞!》来进行本地搭建。

-END-

ok,今天先说到这,老规矩,给大家分享一份不错的副业资料,感兴趣的同学找我领取。

图片