Python技术迷

迪子员工爆料:年底转岗一定要慎重!年底这个时间点转岗,大概率转过去之后要背低绩效,甚至背“年度待改进”,直接降薪降级。

今天咱们聊聊年末转岗的那些坑,尤其是年底这段时间,很多人都在考虑换个部门、转个岗。别着急,听我慢慢道来。

Image

年底转岗,听起来像是一个机会,但实际上风险不小。

作为程序员,换个岗位不仅意味着要面对新的项目和挑战,还可能要背上“低绩效”这顶大帽子。为什么?因为大部分的绩效评估是根据你一整年的表现来决定的,年底转岗,可能你连上半年积累的成绩都没能体现出来,直接就落得个“年度待改进”。这就意味着,老板会认为你不行,甚至可能直接降薪降级。

当然,也不是每个岗位转过去都会遭遇这种情况,如果你是那些能在新岗位迅速适应的“超人”,可能就会遇到不同的待遇。👨‍💻但是大多数情况下,年底这种转岗,无论是因为自己对新工作充满兴趣,还是单纯的想要换个环境,都要慎重考虑。【备注:文末可领最新资料】

算法题:删除并获得点数

今天我想和大家聊聊一道看似简单、但细节上很有趣的算法题:删除并获得点数。简单来说,它要求我们在一个数字列表中删除某些元素,每删除一个元素就能获得点数,而我们目标是最大化最终能获得的点数。

我知道,光是看题目你可能就会想,啊,这种题目在面试中常见得不行,但是,千万不要小看它哦。处理这种题目有很多细节要注意,稍微不小心就会错过最佳的解法。

问题描述

给定一个整数数组 nums,你可以按以下方式操作:

  1. 删除某个元素 nums[i],并获得该元素的点数 nums[i]。
  2. 删除元素后,所有值为 nums[i] - 1 或 nums[i] + 1 的元素也会被删除。

最终,我们希望得到最大化的点数。

我的思路

这道题的核心思路是动态规划(DP)。一开始你可能会觉得很简单:“就删除大一点的元素呗,怎么想也能最大化点数啊”。但是如果你这么做,后面可能就会丢掉更大的一部分点数。

举个简单的例子,如果你删除了某个数字 k,那么所有的 k-1 和 k+1 都得一起删掉。看似直接,实际上有很多选择需要权衡。

让我们先整理一下思路:

  1. 首先,我们需要统计每个数字出现的次数,因为每个数字的点数就是它出现的次数乘以它的值。
  2. 其次,我们需要设计一个 DP 数组,dp[i] 代表删除所有小于等于 i 的数字能获得的最大点数。

动态规划的递推关系

让我们设定一个 dp 数组,假设我们有一个数值从 1 到 max_val(其中 max_val 是数组 nums 中最大值)。dp[i] 表示处理到数字 i 时能获得的最大点数。

  • 如果我们选择删除数字 i,那么我们就获得 i * count[i] 的点数,同时因为数字 i-1 被删除了,我们需要跳过 dp[i-1],所以转移方程是:

    dp[i] = max(dp[i-1], dp[i-2] + i * count[i])
    • dp[i-1] 代表不删除 i,dp[i-2] 代表删除 i,并跳过 i-1 的影响。

代码实现

好吧,说了这么多,接下来让我们写个代码实现看看:

from collections import Counter

def deleteAndEarn(nums):
    if not nums:
        return 0

    count = Counter(nums)
    max_val = max(nums)

        dp = [0] * (max_val + 1)

        # base case
    dp[0] = 0
    dp[1] = count[1] * 1

        for i in range(2, max_val + 1):
        dp[i] = max(dp[i-1], dp[i-2] + count[i] * i)

        return dp[max_val]

代码解析

  • Counter(nums) 用来统计每个数字出现的次数。比如 nums = [3, 4, 2, 3, 3],它会返回 Counter({3: 3, 4: 1, 2: 1}),也就是数字 3 出现了三次,数字 4 和 2 各出现了一次。

  • dp 数组的大小是 max_val + 1,用于存储每个数字 i 删除的最大点数。

  • 基础情况 dp[0] = 0 和 dp[1] = count[1] * 1,因为删除数字 1 时,点数就是 1 乘以 1 的个数。

  • 从 i = 2 开始,对于每个数字 i,我们有两个选择:要么跳过 i,最大点数就是 dp[i-1],要么删除 i,此时最大点数就是 dp[i-2] + count[i] * i。

最终 dp[max_val] 就是我们能获得的最大点数。

为什么动态规划是正确的?

这个解法的关键是通过 dp[i] 保持每一步选择的最优解。每一步都在做两个选择:不删除当前数字,或者删除当前数字并跳过相邻的数字。通过这种方式,能够确保我们做出最优选择。

如果你直接暴力删除,那肯定会出现重复计算的情况,影响效率。所以用动态规划避免了这种问题,确保我们能在合理时间内得到最优解。

小结

这道题的最大难点其实就是理解如何选择每个数字的最优删除方案。通过动态规划来记录每个数字的最优解,我们就能够在时间复杂度 O(n) 的范围内完成整个问题的求解。

对编程、职场感兴趣的同学,大家可以联系我微信:golang404,拉你进入“程序员交流群”。
🔥虎哥私藏精品 热门推荐🔥

虎哥作为一名老码农,整理了全网最全《python高级架构师资料合集》。

资料包含了《IDEA视频教程》、《最全python面试题库》、《最全项目实战源码及视频》及《毕业设计系统源码》,总量高达650GB,全部免费领取。