每个人。请在Java中尝试。
static String recentCommonAncestor(String[] commitHashes, String[][] ancestors, String strID, String strID1)
{
HashSet<String> setOfAncestorsLower = new HashSet<String>();
HashSet<String> setOfAncestorsUpper = new HashSet<String>();
String[] arrPair= {strID, strID1};
Arrays.sort(arrPair);
Comparator<String> comp = new Comparator<String>(){
@Override
public int compare(String s1, String s2) {
return s2.compareTo(s1);
}};
int indexUpper = Arrays.binarySearch(commitHashes, arrPair[0], comp);
int indexLower = Arrays.binarySearch(commitHashes, arrPair[1], comp);
setOfAncestorsLower.addAll(Arrays.asList(ancestors[indexLower]));
setOfAncestorsUpper.addAll(Arrays.asList(ancestors[indexUpper]));
HashSet<String>[] sets = new HashSet[] {setOfAncestorsLower, setOfAncestorsUpper};
for (int i = indexLower + 1; i < commitHashes.length; i++)
{
for (int j = 0; j < 2; j++)
{
if (sets[j].contains(commitHashes[i]))
{
if (i > indexUpper)
if(sets[1 - j].contains(commitHashes[i]))
return commitHashes[i];
sets[j].addAll(Arrays.asList(ancestors[i]));
}
}
}
return null;
}
这个想法很简单。我们假设 commitHashes 按降级顺序排列。我们找到字符串的最低和最高索引(哈希 - 不意味着)。很明显(考虑后代顺序)共同祖先只能在上索引之后(哈希中的较低值)。然后我们开始枚举提交的哈希并构建后代父链的链。为此,我们有两个哈希集由提交的最低和最高哈希的父母初始化。setOfAncestorsLower,setOfAncestorsUpper。如果下一个哈希提交属于任何链(哈希集),那么如果当前索引高于最低哈希的索引,那么如果它包含在另一个集合(链)中,我们返回当前哈希作为结果。如果不是,我们将其父项 (ancestors[i]) 添加到 hashset,它跟踪集合的祖先集合,当前元素包含在其中。