男朋友和领导大吵了一架,被裁员了,离职前月薪8000,不到一周找了个18000,就在准备收拾去下家上班时,结果HR说不用去了
刚看到个贴子,说一姑娘的男朋友和领导吵了一架被裁员,本来八千的工资,一周就找到一份一万八的工作,结果收拾好准备去上班,HR一句“岗位取消了”,直接凉凉。
很多网友在底下说“风水轮流转”“报应来了”,但我倒觉得,职场哪有那么多因果报应,更多是情绪冲动后的代价。你赢了一时的口舌,却输了长远的机会。
在职场上,情绪管理真的是第一门功课。你可以不喜欢领导,但得懂得留台阶给自己。毕竟这世道,不缺聪明人,缺的是能稳得住的人。一个能把脾气压下去、把活干漂亮的人,永远不会缺下家。
说到底,打工人最怕的不是没机会,而是自己把机会亲手掐了。稳一点,才走得远。【备注:文末可领最新资料】
算法题:有序数组中的单一元素
昨晚十一点多在公司楼下吹风,手机一震,小李发我一道题,说脑袋嗡——“有序数组里的单一元素怎么整?”我当时还在啃串,手一滑…行吧,边聊边说,口水话多你们别介意哈。
就是一个有序数组,除了一个数只出现一次,其他数都成对儿出现(两两相等并相邻)。要把那个“孤家寡人”找出来。嗯…要求最好是 **O(log n)**,空间 **O(1)**。暴力扫一遍也行但不优雅,面试官会皱眉头那种。
有人会说:异或嘛,成对儿相消,剩下的就是答案。对,O(n);但是题目都说“有序”了,对吧,八成是暗示你用二分。异或就像我临时打车,能到,但不体面。
二分的核心小心机
关键在“配对位置的奇偶性”。理想情况下(在目标左边),成对元素的第一个下标是偶数、第二个是奇数;一旦越过那个单独元素,这个“奇偶配对规律”就被翻转了。 所以我们在中点 mid 看一眼它的“搭子”是谁:如果 mid 是偶数,就比较 nums[mid] 和 nums[mid+1];如果 mid 是奇数,就跟 nums[mid-1] 比。
还成对?说明单独的在右边, left = mid + 1或者更严格地移动到右半段。配对断了?那答案在左边(含 mid),right = mid。 循环到最后,left==right,就是那位孤勇者。
我刚说到这,等等我接个电话…好了继续。这个思路不难,但边界要小心:数组长度可能是 1;单独元素也可能在头或尾。
代码(Java)
publicclassSingleElementInSortedArray{
publicintsingleNonDuplicate(int[] nums){
int left = 0, right = nums.length - 1;
while (left < right) {
int mid = left + ((right - left) >> 1);
// 把 mid 调成偶数,统一和右邻居配对比较,更顺手
if ((mid & 1) == 1) mid--;
if (nums[mid] == nums[mid + 1]) {
// 左侧配对正常,答案在右边
left = mid + 2;
} else {
// 配对断了,答案在左边(包含 mid)
right = mid;
}
}
return nums[left];
}
}
为啥这招稳?
你把数组在 mid 附近劈开看:
若左半段仍是“偶数开头的一对对”,说明异常点不在这边,直接跳过一整对( +2)。若不是,说明单一元素在这边,于是收缩右边界到 mid。 每次砍一半,O(log n);只用几个指针,O(1)。我现在困死了但这个复杂度我还是记得清清楚楚。
小坑别踩
mid的配对对象要么是mid^1(位操作小技巧:偶->+1,奇->-1),要么像上面那样先把mid调成偶数再和mid+1比,别两种写法混着用。越界:当 mid是尾巴时别访问到数组外。上面“调成偶数”的写法天然避坑。特判其实不必写,循环会收敛到唯一解。
行了,就这样。我去热个牛奶…啊不对,冰箱空了,算了睡了,明早再陪小李刷下一个。
-END-
我为大家打造了一份RPA教程,完全免费:songshuhezi.com/rpa.html