java迭代器排序_java – 在O(1)时间内组合两个已排序的迭代器

我在接受采访时被问到以下问题:

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值