东风谷早苗Kochiya Sanae23 2024-06-18 14:55 采纳率: 50%
浏览 1
已结题

求逆序对的Java程序出了问题

我选用n=6,arr[]={5,4,2,6,3,1}测试下面代码的结果时发现一开始根本没法输出结果,后来变成0,答案则是11,一时没弄明白这串Java代码的问题在哪里
我刚开始以为是static的关系,程序直接输出的是一开始在Nixudui类里的静态初始值0,然后我尝试删除static发现程序不能运行(main里不能引用Nixudui类里的非静态变量)
彻底没辙了

package org.example;
import java.util.Scanner;
class Nixudui{
         static int n;
         static int count=0;
         static int[] arr=new int[110];
         static int[] temp=new int[110];
         static public void counter(int low,int high){
             if(low>=high)
             {
                 return;
             }
             int mid=(low+high)>>1;
             int i=low;int j=mid+1;int t=0;
             while(i<=mid&&j<=high){
                 if(arr[i]>arr[j])
                 {
                     temp[t++]=arr[j++];
                     count=count+mid+1-i;
                 }

                 else
                 {
                     temp[t++]=arr[i++];
                 }

             }
             while(i<=mid)
             {
                 temp[t++]=arr[i++];
             }
             while(j<=high)
             {
                 temp[t++]=arr[j++];
             }
             for(int k=0;k<=n-1;k++)
             {
                 arr[low+k]=temp[k];
             }
         }
}
class Main{
    public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);
        Nixudui.n = scanner.nextInt();
        for(int i = 0; i < Nixudui.n; i=i+1){ // 修改为 i < nixudui.n 避免数组越界
            Nixudui.arr[i] = scanner.nextInt();
        }
        Nixudui.counter(0, Nixudui.n - 1);
        System.out.println(Nixudui.count);
    }
}

  • 写回答

3条回答 默认 最新

  • 关注

    下午好🌅🌅🌅
    本答案参考ChatGPT-3.5

    问题出在循环的索引上,导致数组越界。在 counter 方法中的循环中的索引应该从 low 开始,而不是从 0 开始。同时,还需要在 main 方法中将循环的结束条件修改为 i < Nixudui.n,而不是 i = i + 1

    以下是修改后的代码:

    import java.util.Scanner;
    
    class Nixudui{
        static int n;
        static int count=0;
        static int[] arr=new int[110];
        static int[] temp=new int[110];
    
        static public void counter(int low,int high){
            if(low >= high) {
                return;
            }
            int mid = (low + high) >> 1;
            int i = low;
            int j = mid + 1;
            int t = 0;
            while(i <= mid && j <= high){
                if(arr[i] > arr[j]) {
                    temp[t++] = arr[j++];
                    count = count + mid + 1 - i;
                }
                else{
                    temp[t++] = arr[i++];
                }
            }
            while(i <= mid){
                temp[t++]=arr[i++];
            }
            while(j <= high){
                temp[t++]=arr[j++];
            }
            for(int k = 0; k <= n - 1; k++) {
                arr[low + k] = temp[k];
            }
        }
    }
    
    public class Main{
        public static void main(String[] args){
            Scanner scanner = new Scanner(System.in);
            Nixudui.n = scanner.nextInt();
            for(int i = 0; i < Nixudui.n; i++){ // 修改为 i < Nixudui.n 避免数组越界
                Nixudui.arr[i] = scanner.nextInt();
            }
            Nixudui.counter(0, Nixudui.n - 1);
            System.out.println(Nixudui.count);
        }
    }
    

    使用上述修改后的代码,运行结果应为 11

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 6月26日
  • 已采纳回答 6月18日
  • 创建了问题 6月18日

悬赏问题

  • ¥15 关于#c++#的问题:义父大人求解答
  • ¥15 VESTA绘图原子颜色显示异常
  • ¥15 天翼云搭建多ip l2tp
  • ¥30 matlab求解刃位错方程
  • ¥15 python实现CAD识图
  • ¥15 如何实现在renpy中创建并应用不同大小尺寸对话框?
  • ¥15 table表格有一列是固定列 滑动到最下面时 固定的那一列有几行没显示出来
  • ¥20 单细胞数据注释时报错
  • ¥15 vscode编译ros找不到头文件,cmake.list文件出问题,如何解决?(语言-c++|操作系统-linux)
  • ¥15 通过AT指令控制esp8266发送信息