我看到一个挺有意思的话题,一位鹅厂的小组长吐槽
现如今鹅厂的小组长11级总包145W,而字节跳动给个总包196W的leader。问题来了,是不是谈薪的时候要的太少了?
作为程序员,说实话,薪资这东西一方面是面子,另一方面却也能折射出你所在公司的发展趋势。鹅厂的小组长,按理说,145W已经不算低了。
毕竟这个级别的责任也挺重,每天除了带人,还得想着如何攻克技术难题。但问题是字节跳动的offer几乎要把这数值直接甩开,差了足足50W。
网友给出的意见也很现实:“涨幅35%可以了,一般都卡在30%。”也就是说,除非你直接拿到更高等级的职位,否则涨幅可能不会太夸张。
而且字节的期权每年按比例回购,这意味着你光看数字大,实际上到手的现金流可能没有想象中的那么美好。
作为老程序员,我觉得这一切都得从实际情况出发。如果你是个技术大牛,擅长带团队,考虑跳槽到字节也不是没可能。
不过,最重要的是算清楚实际到手的钱,毕竟别光看着“总包”几个字,现金流才是王道。
算法题:根据身高重建队列
今天我们来聊一个经典的算法题:根据身高重建队列。这题可以说是面试中常常遇到的经典问题,不管是大厂还是小公司,都有可能碰到。而且它看似简单,但其实需要一点技巧才能高效地解答。
题目大概是这样的:
给你一个队列,每个人都有两个属性——身高和前面有多少个身高大于等于自己的人。你需要根据这些信息,重建这个队列,使得每个人都站在正确的位置上。
最直接的思路可能是我们想象队列里所有人都排成一行,然后从前往后填充每个人的位置。但在面试中,我们应该注意到,虽然这个问题看似简单,但背后其实有不少陷阱。
比如说,如果你从头到尾一个一个按顺序放人,可能会发现,某些身高高的人,如果插入到队列的错误位置,那么后面的操作就会变得特别麻烦,甚至重建不出来。问题的核心就是,如何在不破坏之前已放入的人的相对顺序的前提下,把人放到合适的位置上。
解决方案:从高到低插入
我觉得,解决这道题的关键是“贪心策略”和“从高到低”插入。别看这两个方法听上去有点笼统,但实际操作起来却相当精妙。
具体做法:
排序:首先,按照每个人的身高进行降序排序。这样,身高高的人就会优先放在前面。这一步看起来有点奇怪,因为不是直接按照我们题目中提到的“前面有多少人”的信息排序,但它确实能够为接下来的插入做铺垫。你可以把这个排序理解为,我们首先要确定谁最重要,谁是“领队”,然后再逐步处理后面的队员。
插入到正确的位置:一旦我们对队列按照身高进行了排序,我们就可以按照每个人的
k
值来插入位置。这个k
表示的是当前这个人前面应该有多少个比他高或等高的人。既然我们先排了身高高的人在前,当前身高低的人就可以根据k
值来直接插入。
在这一过程中,我们的队列始终保持着已经插入的人的相对顺序,所以不会出错。
代码实现:
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
public class RebuildQueue {
public int[][] reconstructQueue(int[][] people) {
// Step 1: Sort the people array
// Sort by descending height, and in case of tie, by ascending k value
Arrays.sort(people, (a, b) -> a[0] == b[0] ? a[1] - b[1] : b[0] - a[0]);
// Step 2: Insert people into the result list based on the k value
List<int[]> result = new LinkedList<>();
for (int[] person : people) {
result.add(person[1], person);
}
// Convert the result list back to an array
return result.toArray(new int[people.length][2]);
}
public static void main(String[] args) {
RebuildQueue solution = new RebuildQueue();
int[][] people = {{7, 0}, {6, 1}, {5, 2}, {4, 4}, {3, 3}, {2, 5}, {1, 6}};
int[][] reconstructedQueue = solution.reconstructQueue(people);
for (int[] person : reconstructedQueue) {
System.out.println(Arrays.toString(person));
}
}
}
代码解释:
排序操作:我们首先根据身高从大到小排序,身高相同的话,按照
k
值从小到大排序。这是为了确保先处理高的人。插入过程:接下来,我们使用
List
来存储结果。由于List
的add(int index, E element)
方法能够按照指定位置插入元素,所以我们利用k
值来把每个人放到合适的位置。最终结果:最终,返回的是按要求重建的队列。
复杂度分析:
时间复杂度:排序的时间复杂度是O(n log n),插入的时间复杂度是O(n),所以整个算法的时间复杂度是O(n log n),其中
n
是队列中的人数。空间复杂度:由于我们使用了一个额外的
List
来存放结果,空间复杂度是O(n)。
小结:
这道题虽然表面上看起来很简单,但实际上考察了我们如何在复杂的排序和插入操作中保证队列的正确性。我觉得,通过这种“从高到低插入”的方法,我们能够巧妙地避免了先前插入的元素的干扰,同时保证了每个人在队列中的正确位置。
如果没有经过这种排序和插入的过程,可能就会掉入直接插入后面人的误区,导致答案错误。所以,这个题目在面试中也是常常考察的一个点,因为它能验证一个程序员是否能够灵活地运用基本的排序技巧以及数据结构。
对了,算法解题的过程中,千万别忘了要时刻考虑到“效率”。如果你的代码在面试中被一眼看出来时间复杂度高,那就尴尬了。
-END-
以上,就是今天的分享了,看完文章记得右下角给何老师点赞,也欢迎在评论区写下你的留言。