【问题标题】:Second highest number ArrayList第二大数ArrayList
【发布时间】:2016-01-05 02:32:49
【问题描述】:

所以到目前为止我得到了这个代码:

int secondLargest = list.get(0);
int largest = list.get(0);
for (int i = 0; i < list.size(); i++)
{
    if(list.get(i) > largest)
    {
        secondLargest = largest;
        largest = list.get(i);

        if(list.get(i) > secondLargest && list.get(i) != largest)
        {
            secondLargest = list.get(i);
        }
    }
}

System.out.print("Second biggest number ");
return secondLargest;       

问题是当我使用这段代码时 (名单是:)

list2.add(1);
list2.add(2);
list2.add(10);
list2.add(9);
list2.add(8);
list2.add(7);

对第二大数字的“搜索”在 2 处停止,因为 10 是最大数字。我该如何解决这个问题?

【问题讨论】:

  • 我认为最简单的方法是对数组进行排序并获取第二个元素(当然,取决于顺序,所以我假设它是按降序排序的)。此外,如果您可以使用 Collections 框架,则可以使用SortedSet

标签: java algorithm arraylist


【解决方案1】:

使用Arrays.sort(array); 获取第二个元素。

【讨论】:

  • 对于大型阵列,这是一种昂贵的方式。
  • 排序是O(n.log(n)),循环是O(n),所以最好只循环。
  • 同意,但没有人询问渐近复杂度。 :)
  • @Keith 你不应该仅仅因为 OP 没有指定复杂性就给出最糟糕的解决方案
  • @Keith 好吧,是的,也许在生产代码中你会决定将它用于一个小数组......或者你会在带有一些单元测试的 util 类中编写一个快速选择,你会有一种多用途的方法可用。就复杂性而言,这是最糟糕的解决方案,如果您正在与简单性进行权衡,您的答案至少应该提及它。无论如何!
【解决方案2】:

将第二个 if condition 放在第一个 if 条件之外。

因为second largest 小于largest,所以你永远不会在检查最大值的if 块中找到它。

int secondLargest = (int) list.get(0);
int largest = list.get(0);
for (int i = 1; i < list.size(); i++) {
  if(list.get(i) > largest) {
    secondLargest = largest;
    largest = list.get(i);
  }
  if(list.get(i) > secondLargest && list.get(i) != largest) {
    secondLargest = list.get(i);
  }
}
System.out.print("Second biggest number ");
return secondLargest;

【讨论】:

  • 请注意,如果第二大数字与最大数字相同,则失败,假设任务将测试这种边缘情况(仔细阅读要求)。
  • @mk。你的意思是当列表包含两个最大值时?我不认为 OP 正在尝试这样做。因为这个逻辑不会出现在图片中,否则list.get(i) != largest.
  • -1:当列表按降序排序并且没有两个项目具有相同的值(只有一个最大值)时,此失败 - list.get(0) 是最大的项目在列表中,list.get(1) 是第二大数字,但是这段代码打印“第二大数字”和 list.get(0) 的值,而它应该打印 list.get(1) 的值.
【解决方案3】:

您可以首先使用 Collections.max() 函数在 ArrayList 中找到最大数量,一旦您拥有最大元素,找到该元素的索引并将其从数组中删除。再次使用 Collections.max() 查找数组中的第二大数字。代码如下

ArrayList<Integer> al = new ArrayList<Integer>();
al.add(1);
al.add(2);
al.add(3);
al.add(4);
System.out.println(al);

int j = Collections.max(al);

System.out.println("Max in the array is " + j);
al.remove(al.indexOf(j));
int max2 = Collections.max(al);
System.out.println(max2);

如果需要更多详细信息,请告诉我。

【讨论】:

    【解决方案4】:

    使用两个 for 循环。第一个应该找到最大的数字,并存储它的索引位置。第二个应该找到与先前找到的数字不在同一索引位置的最大数字。 (这将确保您不会错过第二大数字与最大数字相同的情况。)

    如果您认为合适,请使用Arrays.sort(array); 并按照 ɐuıɥɔɐɯ 的建议获取第二个元素。

    【讨论】:

    • 即使这样做你也不需要两个循环。您可以在单循环中实现。为什么要增加复杂性?
    • @YoungHobbit 它实际上降低了复杂性。对于新手(如 OP),理解“找到最大的,然后最大的不是那个”比在循环中间进行检查要容易得多。它仍然是 O(n),如果这就是你所说的复杂性:)
    【解决方案5】:

    在循环的第一个if statement 中,检查与second largest 而不是largest。下面将带你去

        int secondLargest = list.get(0);
        int largest = list.get(0);
        for (int i = 0; i < list.size(); i++)
        {
            if(list.get(i) > secondLargest)
            {
                if(list.get(i) > largest ) {
                    secondLargest = largest;
                    largest = list.get(i);
                } else {
                    secondLargest = list.get(i);
                }
    
            }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-22
      • 2019-01-07
      • 1970-01-01
      • 2017-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多