程序员老鬼

试过了,清华毕业一样被裁。。

刚看到个贴子,说清华毕业、在大厂干了十几年的程序员,今年也被裁了,失业4个月还没找到工作,连offer都没。😮‍💨

Image

我觉得这事吧,真不是学历或者履历就能保命的时代了,连“清北本+大厂老兵”都扛不住,这波寒冬真的是程序员全体刮大风。网友有说什么“学历再高也没用”,但我不完全认同,学历只是敲门砖,大环境差的时候,谁都得瑟瑟发抖。做技术的其实最懂,价值是流动的,十年前的大牛,技术没跟上或者方向踩空,都可能一夜回到解放前。

不过话说回来,大环境很冷,但总不能放弃。不断提升自己,熬过这波寒冬,机会说不定就又来了。【备注:文末可领最新资料】

算法题:数字范围按位与

我们组的小李突然在那边嚷嚷,说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

最后给大家分享一份不错的副业资料,点击下方公众号,回复关键字: 副业 领取,也可以链接我领取,微信:hls404