【问题标题】:Method to find second highest number in an array in java在java中查找数组中第二大数字的方法
【发布时间】:2022-12-31 12:14:38
【问题描述】:

每次当我想要得到 3 时得到 0 的输出查看我的代码我不确定我哪里出错了我可以不使用我知道的方法但只是尝试练习 java

public class App {
    
    public static int second(int a[],int n) {
        int[] arr = new int [n];
        int temp;
        for(int i=0;i<n;i++) {
            for(int j=i+1;j<n;j++) {
                if(arr[i] > arr[j]) {
                    temp = arr[i];
                    arr[i] = arr[j];
                    arr[j] = temp;
                }
            }
        }
        return arr[n-2];
    }

    public static void main(String[] args) {
        int[] arr = {1,3,2,5,3};
        int n = 5;
        int result = second(arr,n);
        System.out.println(result);
    }
}

【问题讨论】:

  • 您正在对 arr 进行排序,但其中没有任何值。要么排序并使用a,要么将a的值复制到arr
  • 此外,您的算法不适用于像{1,2,5,3,5} 这样的数组,因为有重复的 5。
  • 注意:任何涉及排序的方法都至少是 O(n log n);你的是 O(n^2)。但是你可以在线性时间内找到数组中第二大的数字。

标签: java arrays sorting


【解决方案1】:

您可以更改数组参数名称 arr 并删除声明或将值从 a 复制到 arr。

public static int second(int arr[],int n) {
    int temp;
    for(int i=0;i<n;i++) {
        for(int j=i+1;j<n;j++) {
            if(arr[i] > arr[j]) {
                temp = arr[i];
                arr[i] = arr[j];
                arr[j] = temp;
            }
        }
    }
    return arr[n-2];
}

你得到零的原因是因为原始 int 不能为空。因此,当您创建长度为 5 的数组时,它开始时用零填充。

【讨论】:

  • 是的,为此欢呼真的有帮助不知道现在它必须在范围内
【解决方案2】:

通过使用流来做到这一点:

public static int second(int a[]) {
    return Arrays.stream(a)
            .sorted()
            .skip(a.length - 2)
            .findFirst()
            .getAsInt();
}

我删除了第二个参数。在选择现在的第一个元素之前,它会对您的数组进行排序并跳过您想要的元素之前的所有元素。

【讨论】:

    【解决方案3】:
    public static int second(int[] arr) {
        int highest = arr[0];
        int second = 0;
        for (int i = 1; i < arr.length; i++) {
            int j = arr[i];
            if (j >= highest) {
                highest = j;
            } else if (j > second) {
                second = j;
            }
        }
        return second;
    }
    
    public static void main(String[] args) {
        int[] arr = {1, 3, 2, 5, 3};
        int result = second(arr);
        System.out.println(result);
    }
    

    【讨论】:

    • 试试这个int[] arr = {10,19,5};
    【解决方案4】:

    这是一种不需要排序的方法。

    int[] arr = { 10, 2, 3, 19, 2, 3, 5 };
    System.out.println(second(arr));
    

    印刷

    10
    
    • largest设置为数组中的第一个值
    • secondLargest设置为尽可能小的
    • 现在遍历数组。
    • 如果当前值大于最大值:
      • 将secondLargest替换为Largest
      • 用当前值替换最大值
    • 否则检查当前值是否大于 secondLargest,如果为真则赋值。
    public static int second(int arr[]) {
        int largest = arr[0];
        int secondLargest = Integer.MIN_VALUE;
        for (int i = 1; i < arr.length; i++) {
            if (arr[i] > largest) {
                secondLargest = largest;
                largest = arr[i];
            } else if (arr[i] > secondLargest) {
                secondLargest = arr[i];
            }
        }
        return secondLargest;
    }
    

    【讨论】:

      【解决方案5】:
      public static int second(int arr[],int n) {
          int temp;
          if(arr.length < 2) {
              return -1;
          }
          else {
          for(int i=0;i<n;i++) {
              for(int j=i+1;j<n;j++) {
                  if(arr[i] > arr[j]) {
                      temp = arr[i];
                      arr[i] = arr[j];
                      arr[j] = temp;
                  }
              }
          }
          return arr[n-2];
      }
      

      【讨论】:

        【解决方案6】:
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            int a[] = {23,14,56,77,66,67};
            int high = 0;
            int sec = 0;
            for(int i = 0 ; i <a.length; i++){
                if(high < a[i]){
                    sec = high;
                    high = a[i];
                }
                else if(sec < a[i]){
                    sec = a[i];
                }
                
            }
            System.out.println("the first highest number is " + high);
            System.out.println("the second highest number is " + sec);
        }
        

        }

        【讨论】:

          【解决方案7】:
          public static int sec(){
              int arr[] = {12,3,67,4,5,65};
              int high = 0;
              int low = 0;
              for(int i = 0 ; i < arr.length ; i ++){
                  
                  if(high < arr[i]){
                      low = high;
                      high = arr[i];
                  }
                  else if(low < arr[i]){
                      low = arr[i];           
                      }
              }
              return low;
          }
          public static void main(String[] args) {
              // TODO Auto-generated method stub
          
              sch obj = new sch();
              int a = obj.sec();
              
              System.out.println(a);
          }
          

          }

          【讨论】:

          • 我建议不要只是粘贴代码,解释它如何以及为什么回答问题。
          • 解释为什么这个答案比其他旧答案更好
          【解决方案8】:

          包com; 公共类 FindSecondHighestNumberInArray {

          public static void main(String[] args) {
              int []arrayOfIngeger = {-23,-989,-878,-2,-5,-3,-4,-123,-345,-98,-675,-98};
              int highestNumber = arrayOfIngeger[0];
              int secHighestNumber = 0;
              for(int i = 1; i < arrayOfIngeger.length; i++  ) {
                  if(highestNumber < arrayOfIngeger[i]) {             
                      secHighestNumber = highestNumber; 
                      highestNumber = arrayOfIngeger[i];  
                  }else if(secHighestNumber < arrayOfIngeger[i] && arrayOfIngeger[i] != highestNumber) {
                      secHighestNumber = arrayOfIngeger[i];
                  }
              }
              System.out.println("second Highest Number in Array   :  "+secHighestNumber);
          }
          

          }

          【讨论】:

          • 你好@Raghubir Singh,描述你的算法如何工作以及为什么工作是一个很好的做法。
          • 该算法的时间复杂度为 O(n)。这个程序只迭代一个 for 循环。
          猜你喜欢
          • 2011-02-06
          • 1970-01-01
          • 2012-11-01
          • 2014-02-12
          • 2018-04-07
          • 2020-05-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多