迷茫到突破:我如何战胜 h 指数

120 阅读3分钟

小哆啦开始力扣每日一题的第十天

leetcode.cn/problems/h-…

从偏差到巅峰:小哆啦与 h 指数的较量

有一天,小哆啦发现科学城最顶级的研究员们都有一个共同的荣耀——他们的 h 指数。听说 h 指数越高,学术影响力越大!她满怀信心地对自己说:“我的学术成果也不赖,我的 h 指数一定很高!”

于是,她坐在书桌前,拿起自己的论文数据: [3, 0, 6, 1, 5]

小哆啦心想:“h 指数听起来很简单,至少 h 篇论文被引用了至少 h 次嘛!我聪明得很,肯定一下就能算出来。”
她眯着眼睛,摸了摸下巴,自信满满地敲下了以下代码:

function hIndex(citations: number[]): number {
    if (citations.length === 1) return citations[0];
    citations = citations.sort((a, b) => a - b); // 从小到大排序
    let middle = Math.floor(citations.length / 2);
    return citations[middle]; // 直接取中间的数字!
}

她得意地跑了个测试:

const citations = [3, 0, 6, 1, 5];
console.log(hIndex(citations)); // 输出: ???

屏幕上亮起了 3

她自信的开启了第二个测试:

const citations = [100];
console.log(hIndex(citations)); // 输出: ???

100

这下小哆啦崩溃了,她瘫坐在椅子上,陷入了自我怀疑:“难道我学术之路就此止步?不可能!一定是哪里出了问题!”


正确的旅程:真相的逐步揭晓

就在这时,小哆啦的好友小明走了过来,拍了拍她的肩膀:“别灰心!h 指数可没那么简单,要不我帮你理一理吧?”


第一幕:排序之谜

小明:“你一开始就错了,h 指数不是中位数啊!它讲究的是论文引用的‘高光时刻’,所以要从高到低排序!”

于是小哆啦把代码改成了:

citations = citations.sort((a, b) => b - a); // 从高到低排序

她看了看结果:[6, 5, 3, 1, 0]。
小哆啦恍然大悟:“哦!这样才能先数出那些被引用次数多的论文嘛。”


第二幕:逐步探索 h 的真正含义

小明:“接下来,你得逐一尝试每个论文,看有多少篇论文满足条件——至少被引用 h 次,同时剩下的论文不多于 h 篇。”

小哆啦皱着眉头:“怎么尝试?”

小明笑了笑,写下了这段逻辑:

let h = 0;
for (let i = 0; i < citations.length; i++) {
    if (citations[i] >= i + 1) {
        h = i + 1; // 至少有 h 篇论文被引用了 h 次
    } else {
        break; // 不满足 h 指数条件,停止
    }
}

第三幕:荣耀的诞生

小哆啦跑了完整代码:

function hIndex(citations: number[]): number {
    citations = citations.sort((a, b) => b - a); // 从高到低排序
    let h = 0;
    for (let i = 0; i < citations.length; i++) {
        if (citations[i] >= i + 1) {
            h = i + 1; // 论文满足条件,更新 h
        } else {
            break; // 条件不再满足,停止
        }
    }
    return h; // 返回最大 h
}

测试用例一个个跑起来:

const citations1 = [3, 0, 6, 1, 5];
console.log(hIndex(citations1)); // 输出: 3

const citations2 = [1, 3, 1];
console.log(hIndex(citations2)); // 输出: 1

const citations3 = [100];
console.log(hIndex(citations3)); // 输出: 1

每个结果都对了!小哆啦激动地跳了起来:“终于成功了!”


结局:科学的胜利

小哆啦把这段代码保存好,还在科学城的学术论坛上发表了文章。