【问题标题】:Printing most frequent elements in a sorted queue by recently added order按最近添加的顺序打印排序队列中最常见的元素
【发布时间】:2020-12-16 23:36:16
【问题描述】:

ListTopVisitedSites(sites, 5) 应该返回以下输出:

www.google.com | 4  
www.aol.com | 3  
www.microsoft.com | 3  
www.amazon.com | 3  
www.facebook.com | 3  

我正在尝试打印前 5 个元素。如果多个元素的数量相同,则应按新近度排序-(最近添加)。另外,我需要打印一个空的字符串类型数组,没有值。

我遗漏了哪一部分,或者编码不正确?所有方法及其参数都应该保持不变,因为我应该将时间复杂度保持为 N2,空间复杂度保持为 1。

import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
class SiteStats {

    private String url;
    private int numVisits;


    public SiteStats(String url, int numVisits) {
        this.url = url;
        this.numVisits = numVisits;
    }


    public int getNumVisits() {
        return this.numVisits;
    }

    public String getUrl() {
        return this.url;
    }

    public void setNumVisits(int updatedNumVisits) {
        this.numVisits = updatedNumVisits;
    }

    public String toString() {
        return this.url + " | " + this.numVisits;
    }

}

public class PartBSolution {

    private static Queue<SiteStats> sites = new LinkedList<SiteStats>();



    public static void listTopVisitedSites(Queue<SiteStats> sites, int n) {

        sortQueue(sites);

        while(sites.isEmpty()== false)
        {
            System.out.println(sites.peek() + " ");
            sites.poll();
        }

    }
    public static void insertMaxToRear(Queue<SiteStats> sites,
                                       int max_index)
    {
        SiteStats max_value = null;
        int s = sites.size();
        for (int i = 0; i < s; i++)
        {
            SiteStats current = sites.peek();
            sites.poll();
            if (i != max_index)
                sites.add(current);
            else
                max_value = current;
        }
        sites.add(max_value);
    }

    public static void sortQueue(Queue<SiteStats> sites)
    {
        for(int i = 1; i <= sites.size(); i++)
        {
            int max_index = maxIndex(sites,sites.size() - i);
            insertMaxToRear(sites, max_index);
        }
    }

    public static int maxIndex(Queue<SiteStats> sites,
                               int sortIndex)
    {
        int max_index = -1;
        int max_value = 0;
        int s = sites.size();
        for (int i = 0; i < s; i++)
        {
            SiteStats current = sites.peek();

            sites.poll();
            if (current.getNumVisits() >= max_value && i <= sortIndex)
            {
                max_index = i;
                max_value = current.getNumVisits();
            }
            sites.add(current);
        }
        return max_index;
    }


    public static void updateCount(String url) {
        boolean flag=false;
        int size2=sites.size();
        for(int i = 0; i < size2 ; i++)
        {
            SiteStats temp=sites.peek();
            sites.poll();
            if(temp.getUrl().equals(url))
            {
                temp.setNumVisits(temp.getNumVisits()+1);
                flag=true;
                sites.add(temp);
                break;
            }
            sites.add(temp);
        }
        if(!flag)
            sites.add(new SiteStats(url,1));

    }

    public static void main(String[] args) {
        String[] visitedSites = { "www.google.com", "www.google.com", "www.facebook.com", "www.aol.com", "www.google.com", "www.youtube.com",
                "www.facebook.com", "www.aol.com", "www.facebook.com", "www.google.com", "www.microsoft.com", "www.9gag.com", "www.netflix.com",
                "www.netflix.com", "www.9gag.com", "www.microsoft.com", "www.amazon.com", "www.amazon.com", "www.uber.com", "www.amazon.com",
                "www.microsoft.com", "www.aol.com" };

        for (String url : visitedSites) {
            updateCount(url);
        }
        listTopVisitedSites(sites, 5);

    }

}


/**
www.google.com | 4
www.aol.com | 3
www.microsoft.com | 3
www.amazon.com | 3
www.facebook.com | 3
*/

【问题讨论】:

  • 究竟是什么不工作?
  • 它正在打印所有元素,而不是我上面提到的仅 5 个。

标签: java sorting data-structures linked-list queue


【解决方案1】:

你传递给listTopVisitedSites(sites, 5);的参数n再也不会被使用,所以你不能指望它只列出5个

【讨论】:

  • 我按照上面的建议修改了它。但是,由于最后 4 个元素的出现次数相同,因此顺序需要是:Google、Aol、Facebook、Amazon 和 Microsoft。
【解决方案2】:

listTopVisitedSites 的参数 n 的逻辑不是你写的。请找到更新的。

   public static void listTopVisitedSites(Queue<SiteStats> sites, int n) {
        sortQueue(sites);
        int iterate = 1;
        while (sites.isEmpty() == false && iterate <= n) {
            System.out.println(sites.peek() + " ");
            sites.poll();
            iterate++;
        }

    }

【讨论】:

  • 是的。这是有效的。但是,输出应按以下顺序返回元素:Google、AOL、Microsoft、Amazon 和 Facebook。这是因为如果有元素共享相同的数量。它们应该按新近度排序 - (最近添加)。所以在这种情况下,微软需要在 Facebook 之前在亚马逊之前上市。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-06
  • 2016-07-17
  • 2021-11-04
相关资源
最近更新 更多