只谈月薪,程序员40K的人多吗?
最近看到一网友发帖提问:程序员月薪40k的人多吗?诶,说到这个我就来劲了,我也很好奇,这样的薪资在程序员圈里究竟算不算牛逼的?
咱们先来说说大厂的情况。说到大厂,很多人的第一反应就是“钱多事少离家近”。不过,月薪40K在一些头部公司看来,的确不算稀奇。
我之前偶尔翻翻招聘信息,不少大厂开出的校招薪资都在30K以上,甚至有的能达到40K以上,但前提是你得够牛,不仅技术要硬,项目经验、解决问题的能力也得跟得上。
不过,跳出大厂的圈子,情况就复杂多了。在一些小公司,或者说在二三线城市,月薪40K可就没有那么好拿了。
即便是在北上广深这样的一线城市,要么你在小公司里摸爬滚打了7、8年,或者技能特别突出,否则想要拿到40K以上的月薪也不是那么容易的事。
我们可以看到网上经常有人晒出高薪,这其中当然有真有假,但在大厂工作的程序员相对更愿意分享自己的薪资。这就造成了一种错觉——似乎程序员只要稍微努力一点,月入40K就手到擒来了。
专属福利 👉点击领取:最全Python资料合集
可事实上,这样的高薪水平并不是普遍现象。我们可以看到,网上那些晒薪资的,很多都是大厂的员工。而且别忘了,大厂的门槛本身就不低。
所以,如果你问我“程序员月薪40K的人多吗?”我只能说,多的是,但也要看在哪个圈子里。而且,高薪虽好,但更重要的是找到一个能让自己不断进步,同时也能获得相应报酬的平台。
今日算法题,来自LeetCode的第25题:K 个一组翻转链表,很多大厂都考过,下面是我的算法思路及实现,让我们来看看吧。
K 个一组翻转链表
算法题目
引言
算法思路
遍历链表:首先遍历链表以确定其长度,以便我们知道是否有足够的节点可以翻转。
分组翻转:接着,我们将链表分为每组K个节点的小组,并翻转这些小组。如果链表的最后一组不足K个节点,则保持原样不翻转。
连接小组:翻转每个小组后,我们需要正确地连接它们,以确保链表的连续性。
递归或迭代:可以通过递归或迭代的方式实现上述步骤,递归方法的核心在于将问题分解成更小的子问题,而迭代方法则需要使用循环和一些临时变量来完成任务。
代码实现
JavaScript实现
function ListNode(val, next) {this.val = (val===undefined ? 0 : val)this.next = (next===undefined ? null : next)}function reverseKGroup(head, k) {if (!head || k === 1) return head;let dummy = new ListNode(-1);dummy.next = head;let pre = dummy, curr = head;let i = 0;while (curr) {i++;if (i % k === 0) {pre = reverse(pre, curr.next);curr = pre.next;} else {curr = curr.next;}}return dummy.next;}function reverse(pre, next) {let last = pre.next;let curr = last.next;while (curr !== next) {last.next = curr.next;curr.next = pre.next;pre.next = curr;curr = last.next;}return last;}
class ListNode {int val;ListNode next;ListNode(int x) { val = x; }}public class Solution {public ListNode reverseKGroup(ListNode head, int k) {ListNode dummy = new ListNode(0);dummy.next = head;ListNode prev = dummy;ListNode curr = head;int length = 0;while (curr != null) { // 计算链表长度length++;curr = curr.next;}while (length >= k) {curr = prev.next;ListNode next = curr;for (int i = 0; i < k; ++i) {next = next.next;}prev.next = reverse(curr, next);prev = curr;length -= k;}return dummy.next;}private ListNode reverse(ListNode first, ListNode last) {ListNode prev = last;while (first != last) {ListNode temp = first.next;first.next = prev;prev = first;first = temp;}return prev;}}
type ListNode struct {Val intNext *ListNode}func reverseKGroup(head *ListNode, k int) *ListNode {if head == nil || k == 1 {return head}dummy := &ListNode{-1, head}pre := dummycurr := headi := 0for curr != nil {i++if i % k == 0 {pre = reverse(pre, curr.Next)curr = pre.Next} else {curr = curr.Next}}return dummy.Next}func reverse(pre, next *ListNode) *ListNode {last := pre.Nextcurr := last.Nextfor curr != next {last.Next = curr.Nextcurr.Next = pre.Nextpre.Next = currcurr = last.Next}return last}
算法解析
示例和测试
总结
热门推荐