【问题标题】:Read the second largest number in an array读取数组中的第二大数
【发布时间】:2021-12-24 18:04:57
【问题描述】:

我在 Visual Studio 中用 C# 编写了一个控制台应用程序 (.NET 5.0),它将数组从高到低排序,然后它必须打印出该数组中的第二大元素。

我已经接近了,但我在过去 2 小时里一直在尝试,但我不明白为什么我总是在最后一个“if”中得到一个越界错误。该程序应该检测重复项,例如,如果输入是“1 1 2 2 5 5 9 9”,它将打印出“5”,因为它是第二大的。

我当前的代码在下面,我无法让它在不崩溃的情况下工作

使用系统;

namespace second_largest
{
    class Program
    {
        static void Main(string[] args)
        {
            double[] input = Array.ConvertAll(Console.ReadLine().Split(" "), Convert.ToDouble);

            for (int repeat = 0; repeat < input.Length; repeat++)
            {
                for (int j = 0; j < input.Length - 1; j++)
                {
                    if(input[j] < input[j+1])
                    {
                        double temp = input[j];
                        input[j] = input[j + 1];
                        input[j + 1] = temp;
                    }
                }
            }

            for (int i = 0; i < input.Length; i++)
            {
                if(input[i] == input[i + 1])
                {

                }
                else
                {
                    Console.WriteLine(input[i]);
                }
                Console.WriteLine(input[i]);
            }
        }
    }
}

【问题讨论】:

  • c-sharpcorner.com/code/3108/… 一个很好的例子
  • if(input[i] == input[i + 1]) 这里i + 1th 索引超出范围,因为您有for (int i = 0; i &lt; input.Length; i++) 循环

标签: c# arrays


【解决方案1】:

有一种更简单的方法可以使用 LINQ 获得第二高

它涉及按数字分组(以消除重复),然后按分组的键降序排序,然后跳过一个并取一个

var secondHighest = nums.GroupBy(n => n)
                        .OrderByDescending(n => n.Key)
                        .Skip(1)
                        .First()
                        .Key;

现场示例:https://dotnetfiddle.net/WlFyWr

【讨论】:

  • 好的,谢谢!我会调查的,它。乍一看很混乱
  • 你得到nums,按其元素分组n,这样你每个元素只有一次(UNIQUE),然后根据键降序排列(键等于它们的值因为您按它们的值对它们进行分组;组 1 的键是 1),然后跳过第一个(最大)元素(它从查询中删除),然后获取第一个(感谢 skip(1) ,第一个元素现在是原始数组的第二大),然后获取该元素的键,因为记住键等于值。
【解决方案2】:

您看到错误是因为您迭代到 i &lt; input.Length,这意味着以下 if 语句中的 i + 1 超出了输入数组的长度范围。你需要做和之前嵌套的 for 循环一样的事情:

for(int i = 0; i &lt; input.Length - 1; i++)

【讨论】:

  • 啊,我找到了一种方法,我添加了一个计数为 2 的计数器,因此它将打印第二个元素。感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-27
  • 2011-02-06
  • 2018-03-21
  • 1970-01-01
  • 1970-01-01
  • 2010-12-21
  • 1970-01-01
相关资源
最近更新 更多