程序员老鬼

同事40岁被裁员,签了保密协议,每个月给88000补贴,连续给12个月,第二年减半,不能去同行公司,担心自己在家呆两年就废了!

刚看到个贴子,说一位同事40岁被裁,签了保密协议,不能去同行,但公司给了第一年每月88000、第二年减半的补贴。他自己却担心在家两年会废掉。

Image

怎么说呢,从我的角度看,与其担心两年会不会废,不如趁这段“被迫休息”的时间补技能、补知识、补身体。人不能闲太久,就像车长期不发动也会生锈,但只要你定期保持行动,状态就不至于掉得太快。

换个角度想,公司舍得掏这么多钱,也说明这位同事过去确实是有价值的,那就更没必要怀疑自己。职业生涯是马拉松,不是谁40岁被裁就完蛋了,关键在于你后面还能不能重新启动。【备注:文末可领最新资料】

面试题:H 指数

H 指数这个名字听着有点学术,其实事儿特别简单:

有个人发了很多论文,每篇论文被引用了多少次都有个数字,比如:

[3, 0, 6, 1, 5]

H 指数的定义是:

找一个最大的整数 h,满足:至少有 h 篇论文,它们的引用次数都 不少于 h。

上面这个例子里,答案是 3:

  • 至少有 3 篇论文,引用次数 ≥ 3(比如 3,5,6)
  • 但是想要 h = 4 就不行了,因为引用 ≥ 4 的论文只有 2 篇(5 和 6)

所以返回 3。

题目一般就是:给你一个 int[] citations,每个元素是第 i 篇论文被引用的次数,问你 H 指数是多少。

最常用的思路:排序 + 从后往前扫

最容易想明白的一种写法,就是先把数组排个序,然后利用“右边论文数量”的特点来算。

步骤可以这么理解:

  1. 把 citations 升序排序,比如:[0, 1, 3, 5, 6]
  2. 对于下标 i 这个位置,右边连同自己一共有 n - i 篇论文,它们的引用都 ≥ citations[i]
  3. 如果此时 citations[i] >= n - i,说明我们 至少 有 n - i 篇论文,每篇引用都 ≥ n - i, 那么这个 n - i 就是一个合法的 H 值
  4. 我们要的又是“最大”的 h,所以从左到右扫到第一个满足条件的位置,n - i 就是答案(因为左边的 n - i 更大)

举上面例子:

  • 数组 [0, 1, 3, 5, 6],长度 n = 5
  • i = 0:citations[0] = 0,右边论文数 = 5,0 >= 5 不成立
  • i = 1:值 = 1,右边论文数 = 4,1 >= 4 不成立
  • i = 2:值 = 3,右边论文数 = 3,3 >= 3 ✅ 成立 说明有 3 篇论文引用 ≥ 3,直接返回 3。

用上面的思路,代码非常短:

import java.util.Arrays;

publicclassSolution{

publicinthIndex(int[] citations){
if (citations == null || citations.length == 0) {
return0;
        }

        Arrays.sort(citations); // 升序排序
int n = citations.length;

for (int i = 0; i < n; i++) {
int papers = n - i; // 从当前这篇开始,右边一共有多少篇论文
if (citations[i] >= papers) {
// 找到第一个满足条件的位置,papers 就是最大的 h
return papers;
            }
        }

// 如果上面的条件一次都没触发,说明所有论文引用数都太小,h 指数就是 0
return0;
    }

publicstaticvoidmain(String[] args){
        Solution s = new Solution();
        System.out.println(s.hIndex(newint[]{3, 0, 6, 1, 5})); // 输出 3
        System.out.println(s.hIndex(newint[]{0, 0, 0}));       // 输出 0
        System.out.println(s.hIndex(newint[]{10, 8, 5, 4, 3}));// 输出 4
    }
}

复杂度也很直接:

  • 排序是 O(n log n)
  • 单次遍历是 O(n)
  • 总体就是 O(n log n),面试和实战几乎都够用了。

如果你想把时间复杂度压到 O(n),其实可以用“计数桶”的方式:

  • 开一个长度为 n + 1 的数组 cnt
  • 所有大于等于 n 的引用次数都算到 cnt[n] 里,其他的根据引用次数计数
  • 然后从后往前累加,看“引用次数 ≥ k 的论文有多少篇”,第一个满足条件的 k 就是答案

这个思路稍微绕一点,但面试官要是说“能不能做到线性”,你就可以顺着这个方向聊下去。

整体来说,先把排序写熟练,再根据需要考虑桶计数版,H 指数这题就拿稳了。

-END-

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

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