【问题标题】:Logical error in a code snippet to arrange an array of numbers用于排列数字数组的代码片段中的逻辑错误
【发布时间】:2021-03-28 06:21:50
【问题描述】:

这是用java编写的代码,将数字数组按升序排列,然后显示最大和最小数字。没有语法错误,但我认为这是一个逻辑错误,因为运行代码后,给出的输出如下:

The numbers are:
3
1
4
5
2
the min number is:3
the max number is:2
15
public class Main
{

    public static void main(String args[]) 
    {
        int list[]={2,5,4,1,3};

        int len = list.length;
        int sum=0; 
        int tmp; 
       
       for(int i=0; i<len-1; i++)
       {
           for(int j=0; j<len-i-1; j++)
           {
               if(list[j]>list[j+1]);
               {
                   tmp= list[j];
                   list[j]=list[j+1];
                   list[j+1]=tmp;
               }
           }
       }
       System.out.println("The numbers are:");
       for(int i=0; i<len;i++)
       {
       System.out.println(list[i]);
       }
       System.out.println("the min number is:"+ list[0]);
       System.out.println("the max number is:"+ list[4]);
    
    for (int i=0; i<len; i++)
    sum = sum + list[i];
    System.out.println(sum);
    }
}

【问题讨论】:

  • 我推荐看看How to debug small programs。这是作为程序员必须掌握的技能。调试您的代码不是我们的工作。
  • 除了 if 分号之外,考虑一下用于排序的循环不变量:假设 list[0..i-1] 已排序,更新 list 以便 list[0..i] 已排序。内循环会这样做吗?
  • 不应该作为错字关闭吗?

标签: java arrays sorting


【解决方案1】:

在声明 if(list[j]&gt;list[j+1]); 之后删除 ; 您已经通过输入; 终止了if 语句。删除它以使其工作。

这是一个有效的代码,但不正确:

if(list[j]>list[j+1]); //<-- if clause with one empty statement.
{                      //<-- here new code block started not related to the if
    tmp= list[j];
    list[j]=list[j+1];
    list[j+1]=tmp;
}

改成:

if(list[j]>list[j+1]) //<-- if clause with 3 statements
{                     
    tmp= list[j];
    list[j]=list[j+1];
    list[j+1]=tmp;
}


提示:您可以使用现有 API 打印数组:

System.out.println(Arrays.toString(list));

输出:

[1, 2, 3, 4, 5]

【讨论】:

    【解决方案2】:

    更正循环,需要在迭代数组时更新最小值和最大值

    public static void main(String[] args) throws Exception {
    
            int arr[]={2,5,4,1,3};
    
            int len = arr.length;
            int sum=0; 
            int tmp; 
            
            for (int i = 0; i < arr.length; i++) {     
                for (int j = i+1; j < arr.length; j++) {     
                   if(arr[i] > arr[j]) {    
                       tmp = arr[i];    
                       arr[i] = arr[j];    
                       arr[j] = tmp;  
                       
                   }     
                }           
               
                //System.out.println("The numbers are:");
                System.out.println(arr[i]);
            }    
            
            
            System.out.println("the min number is:"+ arr[0]);
            System.out.println("the max number is:"+ arr[4]);
    
            for (int i=0; i<len; i++)
                sum = sum + arr[i];
            System.out.println(sum);
    
    
    
        }
    
    

    【讨论】:

    • 我不确定您为什么添加额外的条件来跟踪当前的最小值和最大值。在打印时,已知最小值为arr[0],已知最大值为arr[len-1]。据我所知,您只是在使用额外的 CPU 周期和内存而没有明显的好处。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多