小哆啦开始力扣每日一题的第十天
https://leetcode.cn/problems/h-index/description/
从偏差到巅峰:小哆啦与 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)); // 输出: 3const citations2 = [1, 3, 1];
console.log(hIndex(citations2)); // 输出: 1const citations3 = [100];
console.log(hIndex(citations3)); // 输出: 1
每个结果都对了!小哆啦激动地跳了起来:“终于成功了!”
结局:科学的胜利
小哆啦把这段代码保存好,还在科学城的学术论坛上发表了文章。