试过了,清华毕业一样被裁。。
刚看到个贴子,说清华毕业、在大厂干了十几年的程序员,今年也被裁了,失业4个月还没找到工作,连offer都没。😮💨
我觉得这事吧,真不是学历或者履历就能保命的时代了,连“清北本+大厂老兵”都扛不住,这波寒冬真的是程序员全体刮大风。网友有说什么“学历再高也没用”,但我不完全认同,学历只是敲门砖,大环境差的时候,谁都得瑟瑟发抖。做技术的其实最懂,价值是流动的,十年前的大牛,技术没跟上或者方向踩空,都可能一夜回到解放前。
不过话说回来,大环境很冷,但总不能放弃。不断提升自己,熬过这波寒冬,机会说不定就又来了。【备注:文末可领最新资料】
算法题:数字范围按位与
我们组的小李突然在那边嚷嚷,说leetcode上的“按位与”区间题,他脑袋都要炸了,让我有空给他讲讲。你说这玩意,不就一个按位操作,能难哪去啊?不过说真的,刚碰上的时候,真不是一般人一眼能秒掉的那种。
就很简单哈,给你两个数字left和right,让你算一下,从left到right所有整数做一次&,最后的结果是多少。比如left=5,right=7,那就是5&6&7,结果是4。你别以为就暴力一个for循环过去就行,面试官可不是吃素的。区间一大你就挂了,效率直接爆炸。
昨天在公司楼下抽烟的时候,我就和小李说:“你想想为啥连续几个数做与运算,结果有规律吗?”小李愣着看我。我说,关键在于,只要left和right之间有某一位发生了变化,这一位就一定会被变成0,你们懂我意思不?就比如5到7,二进制是101, 110, 111,个位和十位都从1变到0或者反过来,最终肯定清零了。
你直接for循环,写成这样是最基础的,但效率真的惨不忍睹:
int res = left;
for(int i=left+1;i<=right;i++) {
res &= i;
}
return res;
小李还真照着写了,结果一跑,leetcode直接超时。我跟他说,这个题关键就是得把变化的那几位全清掉,留下高位一致的部分。其实说白了,就是找left和right二进制前面相同的那几位,后面全部置0,剩下的就是结果了。
其实核心就两步,第一步是找高位一样的部分。每次left和right不相等,就都右移一位,计数,直到俩数相等。右移了几次就说明后面那几位都不靠谱,最后再把结果左移回来。这个逻辑其实比暴力高到不知道哪去了。
我顺手写了段代码,小李一看就懂了:
publicintrangeBitwiseAnd(int left, int right){
int shift = 0;
while(left < right) {
left >>= 1;
right >>= 1;
shift++;
}
return left << shift;
}
你们看明白没?就是不停把两个数右移,直到他们相等,说明高位全一样,然后移回去,低位全0。这一看就是面试官最喜欢那种“不是死磕效率,而是理解底层规律”的写法。
你别说,昨天群里还有人问,这玩意平时写业务代码根本没遇到过,我说你业务是遇不到,但你搞底层,比如权限、掩码啥的,或者做一些批量处理数据,还是能碰见的。说白了就是算法题多了,见的多了,脑子才灵活嘛,不然光靠背API,真走不远。
-END-
我为大家打造了一份RPA教程,完全免费:songshuhezi.com/rpa.html