(FB) Simplify Path, H-Index I & II
public class Solution {
public String simplifyPath(String path) {
String[] ops = path.split("/");
Deque<String> deque = new LinkedList<String>();
for(String str : ops){
if(str.equals(".") || str.equals("")) continue;
if(str.equals("..")) deque.pollFirst();
else deque.offerFirst(str);
}
StringBuilder sb = new StringBuilder();
while(!deque.isEmpty()){
String str = deque.pollLast();
sb.append('/');
sb.append(str);
}
return (sb.length() == 0) ? "/" : sb.toString();
}
}这题有官方答案
从图的方式理解的话,h-index 是图中最大正方形的边长。
h-index 的定义是,至少有 h 篇 paper 的 citation 数都大于等于 h.
对于给定 array, h-index 有且只有一个。
正确的做法是从 N 到 0 递减遍历一遍,才能保证得到的 h-index 是最大的,但是我们需要在扫描过程中知道对于每一个切分点 val 来讲,到底有多少个 >= val 的 paper.
换句话说,这是一种类似 “后缀和” 的计数算法,先记录所有可能的切分点;如果一个 paper 的引用次数大于 N ,则直接记录在 count[n] 上,代表 “我不管到底是什么,反正大于 N 了”,其他位置各自计算。然后从后向前扫,依次记录后缀和即可。
需要注意的细节是,这里要做 left = mid + 1 ,而不是 right = mid - 1,不然在 [0] 的 testcase 上会 TLE.
同时用 mid + 1 和 mid - 1 会在 [1,2] 的情况下 WA. 所以指针的推动和错位是要根据题意制定的;这题我们唯一能确定的只有两个情况:
Last updated