程序员老鬼

公司裁员不给赔偿,不同意,直接和公司硬刚,死耗9个月,35000月薪照拿。。

不得不说,网友的朋友真是“刚”得漂亮!

事情是这样的,有网友发帖说,他朋友所在的公司裁员,但不给赔偿。朋友一听,直接不答应,硬刚到底,死耗了9个月,关键是这9个月里,朋友35000的月薪照拿,丝毫没少!

Image

网友们看了纷纷表示,这位朋友是“职场硬核玩家”!

有人直呼:“这才是教科书级别的维权案例啊!”还有人调侃:“公司可能后悔裁员了,这不,赔偿没省下,还多付了9个月工资。”

我觉得,这位朋友的操作确实给大家提了个醒:在职场上,遇到不公正待遇时,千万别怂,法律是咱们的底气。不过,也得看个人情况和精力,毕竟耗时间耗心力的事儿,不是谁都能扛住。

最后,给这位朋友点个赞,这波操作不仅保住了自己的权益,还给大家上了一课:在规则范围内,合理“刚”,才是职场生存的王道!【备注:文末可领最新资料】。

算法题:最大得分

算法题这个东西吧,就像是程序员的噩梦和甜蜜的负担。你说它烦,它确实让人头秃;你说它香,它又确实是面试中绕不开的坎。

最近刷到一道题:最大得分,一看名字就知道不简单,毕竟谁不想得分最大呢?下面咱就来掰扯掰扯这道题。

题目大意是这样的:给你两个长度相等的数组 nums1 和 nums2,以及一个整数 k。你需要从这两个数组中选出 k 个元素,要求这些元素的索引是相同的,然后计算得分。得分的计算方式是:nums1 中选出的元素之和乘以 nums2 中选出的最小值。目标是让得分最大。

我看完描述的第一反应是,这题有点东西。它不仅要求你考虑和,还得关心最小值,简直是双重折磨。不过,作为一个程序员,咱不能被问题吓倒,撸起袖子就开干。

首先,直觉告诉我,这题得用贪心算法。为什么呢?因为你要最大化得分,而得分的公式里,有一个乘法。乘法的特性是啥?一个数越大,乘出来的结果越大。所以我们要尽量选出 nums2 中大的值,同时保证 nums1 的和也不至于太低。

于是,我就开始构思解决方案。第一步,先把 nums2 的值和它的索引绑定在一起,然后按照从大到小的顺序排序。为啥要排序?因为我们优先考虑那些 nums2 中大的值,毕竟它是得分公式的乘数。

接下来,用一个优先队列(也就是最小堆)来维护 nums1 中的选中元素。这堆的作用是啥?就是用来保证我们选出的 nums1 的和尽量大,但又能随时踢掉最小的那个元素,为更优的组合腾地方。

代码大概长这样:

import java.util.*;

public class MaxScore {
    public long maxScore(int[] nums1, int[] nums2, int k) {
        int n = nums1.length;
        int[][] pairs = new int[n][2];

                // 把 nums2 和 nums1 的值绑定在一起
        for (int i = 0; i < n; i++) {
            pairs[i][0] = nums2[i];
            pairs[i][1] = nums1[i];
        }

                // 按 nums2 从大到小排序
        Arrays.sort(pairs, (a, b) -> b[0] - a[0]);

                // 最小堆,用来维护 nums1 的前 k 个最大值
        PriorityQueue<Integer> minHeap = new PriorityQueue<>();
        long sum = 0; // nums1 的和
        long maxScore = 0; // 最大得分

                for (int i = 0; i < n; i++) {
            // 把当前 nums1 的值加入堆
            minHeap.add(pairs[i][1]);
            sum += pairs[i][1];

                        // 如果堆的大小超过 k,就移除最小值
            if (minHeap.size() > k) {
                sum -= minHeap.poll();
            }

                        // 当堆的大小等于 k 时,计算得分
            if (minHeap.size() == k) {
                maxScore = Math.max(maxScore, sum * pairs[i][0]);
            }
        }

                return maxScore;
    }
}

代码写完,心里一阵舒爽。你看,这不就迎刃而解了吗?整个逻辑清晰明了,先排序,再用堆维护一个滑动窗口,最后计算得分。关键是,这种写法的时间复杂度是 O(n log n),可以说是又快又优雅。

不过说实话,这题虽然思路清晰,但写起来还是有点挑战的,尤其是要处理好堆的操作。每次加一个元素再踢掉最小值,稍微不注意就容易写错。写完代码后,我还特意跑了几组测试数据,确保没有翻车。毕竟,程序员的尊严就在于代码不能出 bug。

最后,给大家提个小建议:刷算法题的时候,别一上来就盯着代码看。先把思路理清楚,再动手写代码,这样效率会高很多。否则,就像是盲人摸象,写着写着就不知道自己在干啥了。

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

Image

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

-END-

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

以上,就是今天的分享了,看完文章记得右下角点赞,也欢迎在评论区写下你的留言。