程序员老鬼

我嘞个去,在BOSS上调戏HR,疯了。。

刚看到个贴子,有网友在BOSS直聘上跟HR“斗嘴”,简直像是程序员失业后的一种另类自嘲,网友都笑称找工作的已经疯掉了😂。

Image

现在行情冷得像服务器宕机,面试机会难得,每聊一次都像打副本,HR的那些“有消息通知你”就像永远过不了的单元测试。

网友们的吐槽挺逗的,但说实话,调侃归调侃,背后反映的是就业压力。

怎么说呢,调戏HR看着解气,但真没啥意义。程序员还是得提升自己的“核心价值”,比起嘴炮,能写出bug-free的代码、搞定高并发、玩转新技术,才是真的杀手锏。毕竟,能让你涨薪和稳定的,不是怼HR的段子,而是真本事和靠谱项目。【备注:文末可领最新资料】

算法题:回旋镖的数量

题目特别简单,但是写起来你要仔细琢磨:回旋镖的数量,英文叫Number of Boomerangs。就是,给你一堆点,然后问你能组成多少组“回旋镖”——其实说白了,就是找三元组(i, j, k),要求i到j的距离和i到k的距离相等,顺序不一样也算不同。唉,第一眼还以为和啥三角形计数有关系,结果完全不是一码事。

其实这种题我觉得挺考你细心程度的,尤其是代码怎么写高效一点。那天正好群里有兄弟也在讨论,老李还问我Java版本怎么写。我就一边啃着冷掉的炸鸡,一边和他聊了聊,顺便把自己的思路也梳理一下,分享给你们。

距离计数的核心思路

其实这个题最核心的点就是:你只需要关心“以某个点为中心,有多少对点和它的距离一样”,剩下的直接排列组合一下就行。比如说,A点到B、C的距离都一样,那A-B-C、A-C-B这两种顺序都算,对吧?

所以我的思路就是,外层遍历所有点,内层统计所有其它点到它的距离,最后一轮一结算,每种距离有n个点的话,排列就n*(n-1)这么多。因为选完j再选k,顺序算两遍。

Java实现怎么写?

这个得用哈希表存距离和个数,反正Java里HashMap用着顺手,直接上代码哈——这段我那天凌晨写完之后,第二天早上都不想看,结果组里小王问我思路咋来的,我才懒洋洋又讲一遍:

publicintnumberOfBoomerangs(int[][] points){
int res = 0;
for (int i = 0; i < points.length; i++) {
        Map<Integer, Integer> map = new HashMap<>();
for (int j = 0; j < points.length; j++) {
if (i == j) continue;
int dx = points[i][0] - points[j][0];
int dy = points[i][1] - points[j][1];
int dist = dx * dx + dy * dy;
            map.put(dist, map.getOrDefault(dist, 0) + 1);
        }
for (int count : map.values()) {
            res += count * (count - 1);
        }
    }
return res;
}

你们仔细看看,里面那个dist我直接平方和了,懒得开方,反正距离相等本来就不看实际距离大小对吧。有次老李还非要开方,我说你别想太复杂。

对了,现实中你要是比如说,有一堆wifi路由器,问有多少对设备和某一个AP的距离一样,其实也是类似这个思路。或者那种打卡签到,位置聚集分析啥的,套路都差不多。我上次在公司茶水间跟小周瞎聊,就顺便说了这个事,他还以为是啥机器学习,结果就是个排列组合的活。

其实吧,这题真要说优化没啥特别的地方,主要是别傻傻每次都用新HashMap,要记得及时clear回收,有时候面试官就爱看你有没有注意这些小细节。还有一种写法是用数组做缓存,点坐标范围不大时候也能上,虽然一般都懒得搞这么极致。

反正写完后建议自己拿几个样例数据测一测,别写错,像我那天夜里写到最后都眼花,res += count * (count - 1)写成了res += count * count,第二天一看,结果翻倍,全错了,直接被自己蠢笑死。

-END-

我为大家打造了一份RPA教程,完全免费:https://www.songshuhezi.com/rpa.html

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