我在接受采访时被问到以下问题:
Combine two iterators over their sorted contents such that the
resulting iterator should iterate over the combination of these 2
iterators in sorted order in O(1) time (these iterators iterate over a
String).
我写了下面的代码,但我确信它在O(1)时间内没有执行.您对匹配面试问题设置的约束有什么建议?
import java.util.Iterator;
import java.util.Set;
import java.util.TreeSet;
public class iteratorCombine {
// assumption1: elements are hardcoded
// assumption2: both iterators have equal number of elements
public static void main(String[] args) {
iteratorCombine testObj = new iteratorCombine();
Set firstSet = new TreeSet();
Set secondSet = new TreeSet();
Set combinedSet;
firstSet = testObj.storeElements1(firstSet);
secondSet = testObj.storeElements2(secondSet);
Iterator it1 = firstSet.iterator();
Iterator it2 = secondSet.iterator();
combinedSet = testObj.combine(it1, it2);
// output
Iterator itComb = combinedSet.iterator();
while(itComb.hasNext()){
System.out.println(itComb.next());
}
}
public Set storeElements1(Set firstSet){
firstSet.add("first3");
firstSet.add("first1");
firstSet.add("first2");
return firstSet;
}
public Set storeElements2(Set secondSet){
secondSet.add("second3");
secondSet.add("second1");
secondSet.add("second2");
return secondSet;
}
public Set combine(Iterator it1, Iteratorit2){
String firstEle, secondEle;
Set combinedSet = new TreeSet();
while (it1.hasNext() && it2.hasNext()) {
firstEle = it1.next();
secondEle = it2.next();
combinedSet.add(firstEle+secondEle);
}
return combinedSet;
}
}
解决方法:
如果你不扩展迭代器并支持peek函数,我相信你不能这样做.这样的迭代器并不那么难.这是一种方法.
static class PeekingIterator implements Iterator {
private final Iterator iterator;
private T temp;
public PeekingIterator(Iterator iterator) {
this.iterator = iterator;
}
public T peek() {
//if there is no peek, advance the iterator and store its value, return the peek otherwise
if(temp==null){
temp = this.iterator.next();
}
return temp;
}
@Override
public T next() {
//if we already have a peek,return it and nullify it, otherwise do normal next()
if(temp!=null){
T t = temp;
temp = null;
return t;
}else{
return this.iterator.next();
}
}
@Override
public boolean hasNext() {
return this.iterator.hasNext() || temp!=null;
}
}
一旦你可以窥视,其余的很简单,你可以使用两个偷看迭代器构建SortedIterator,查看迭代器并推进具有较小元素的迭代器.
static class SortedIterator> implements Iterator{
private final PeekingIterator peekingIterator1;
private final PeekingIterator peekingIterator2;
SortedIterator(Iterator source1, Iterator source2){
peekingIterator1 = new PeekingIterator<>(source1);
peekingIterator2 = new PeekingIterator<>(source2);
}
@Override
public boolean hasNext() {
return peekingIterator1.hasNext() || peekingIterator2.hasNext();
}
@Override
public T next() {
if(!peekingIterator1.hasNext()){
return peekingIterator2.next();
}
if(!peekingIterator2.hasNext()){
return peekingIterator1.next();
}
T peek1 = peekingIterator1.peek();
T peek2 = peekingIterator2.peek();
if(peek1.compareTo(peek2)<0){
return peekingIterator1.next();
}
return peekingIterator2.next();
}
}
分析很明显,SortedIterator.next和SortedIterator.hasNext在常量时间运行.
标签:java,iterator
来源: https://codeday.me/bug/20190829/1760089.html