【问题标题】:How to swap the largest number with the last number in an array?如何用数组中的最后一个数字交换最大的数字?
【发布时间】:2016-11-23 20:03:02
【问题描述】:

我正在尝试创建一个程序,要求用户输入一个数字,该数字表示将在数组中生成多少个 1-100 之间的随机数。然后我希望最大的数字与最后一个数字交换,最小的数字与第一个数字交换。到目前为止,这是我的代码:

import java.util.Scanner;
import java.util.Random;

public class smallbig
{
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        Random randomGenerator = new Random();

        int num = scan.nextInt();
        int[] myArray = new int[num];

        for (int i = 0; i < myArray.length; ++i) {
            int randomInt = randomGenerator.nextInt(100);
            myArray[i] = randomInt;
        }
        int smallest = myArray[0];
        int largest = myArray[0];

        for (int i = 1; i < myArray.length; i++) {
            if (myArray[i] > largest) {
                largest = myArray[i];
            }
            if (myArray[i] < smallest) {
                smallest = myArray[i];
            }
        }

        for (int j = 1; j < myArray.length; j++) {
            int first = myArray[0];
            myArray[0] = smallest;
            smallest = first;

            int temp = largest;
            int last = myArray.length;
            myArray[last - 1] = largest;
            temp = myArray[last - 1];

            System.out.print(myArray[j] + " ");
        }
    }
}

我似乎无法正确交换数字。我创建了一个循环,该循环从生成的数字中确定最小和最大数字并存储这些数字。然后我创建了一个循环来执行必要的交换,但我似乎无法让它正常工作。它适用于将最大数字与最后一个数字交换,但大多数时候(并非总是)输出的最后一个数字也存在于数组中的其他位置。这就是我的意思:

input: 10
output: 62 48 34 0 91 14 64 60 91

我知道我可以使用一种交换方法,但我想通过手动交换数字来做到这一点。任何帮助表示赞赏,谢谢。

【问题讨论】:

  • 你只做了一半的交换。您将最小值放在数组的第一个位置,但您没有将第一个值放回您从中取最小值的数组中。您需要跟踪最小值的数组索引,以便完成交换。
  • 你不应该使用循环来交换值。

标签: java arrays algorithm swap jcreator


【解决方案1】:

你有一个简单的错误,当你执行交换时,你的循环应该从 '0' 开始

for (int j = 0; j < myArray.length; j++) {
        int first = myArray[0];
        myArray[0] = smallest;
        smallest = first;

        int temp = largest;
        int last = myArray.length;
        myArray[last - 1] = largest;
        temp = myArray[last - 1];

        System.out.print(myArray[j] + " ");

【讨论】:

  • 不...有一个循环是一个错误,所以修复循环边界是一个完全的红鲱鱼。
  • 如果他循环遍历他的数组的所有元素并找到数组中最大和最小数字的索引,我认为这不是错误
  • 当然。循环交换是错误的。交换只需要发生一次。
【解决方案2】:

而不是循环做

//find and stores poition of small
int smallPos = myArray.indexOf(small);

//stores tge values at 0
int tempSmall = myArray[0];

//swaps the values
myArray[0] = small;
myArray[smallPos] = smallTemp;

只需对最大值重复此操作,然后使用 for 循环打印即可。告诉我它是否有效。

【讨论】:

    【解决方案3】:

    我刚试过这个。希望这会有所帮助。

    public class App {
    static int[] a = new int[100];
    public static void main(String[] args) {
        int i;
        for(i = 0; i<a.length;i++)
            a[i] = (int)(java.lang.Math.random() * 100);
    
        int smallest = 0, largest = 0;
    
        for(i =1; i<a.length; i++){
            if(a[i] < a[smallest])
                smallest = i;
            if(a[i] > a[largest])
                largest = i;
        }
    
        swap(0,smallest);
        swap(a.length-1,largest);
    
        for(i =0; i<a.length;i++)
            System.out.print(a[i] + " ");
    }
    
    public static void swap(int i, int j){
        int temp = a[i];
        a[i] = a[j];
        a[j] = temp;
    }
    }
    

    【讨论】:

      【解决方案4】:

      你的最后一个循环没有做任何循环。它只是一遍又一遍地做同样的事情。它所做的并不正确。它将最小的元素交换到第一个元素中,但它没有将第一个元素移动到任何地方:它已经消失了。

      您需要跟踪最大和最小元素的位置。您的交换逻辑没有考虑到这一点。

      【讨论】:

        【解决方案5】:

        编写这段代码

        import java.util.Scanner;
        import java.util.Random;
        
        public class smallbig
        {
            public static void main(String[] args) {
                Scanner scan = new Scanner(System.in);
                Random randomGenerator = new Random();
        
                int num = scan.nextInt();
                int[] myArray = new int[num];
        
                for (int i = 0; i < myArray.length; ++i) {
                    int randomInt = randomGenerator.nextInt(100);
                    myArray[i] = randomInt;
                }
                int smallest = myArray[0];
                int largest = myArray[0];
                int pos1,pos2;
        
                for (int i = 1; i < myArray.length; i++) {
                    if (myArray[i] > largest) {
                        largest = myArray[i];
                        pos1=i;
                    }
                    if (myArray[i] < smallest) {
                        smallest = myArray[i];
                       pos2=i;
                      }
                }
        
        
        
        myArray[pos1]=myArray[myArray.length-1];
        myArray[myArray.length-1]=largest;
        
        myArray[pos2]=myArray[0];
        myArray[0]=smallest;
        
                for (int j = 1; j < myArray.length; j++) {
        
        
                    System.out.print(myArray[j] + " ");
                }
            }
        }
        

        【讨论】:

          【解决方案6】:

          我建议不要使用扫描仪或随机值进行测试,因为无法重现结果(至少不是以简单的方式)。请注意什么是数组索引以及特定索引处的值是什么。这会很快导致混乱。 ^^

          import java.util.Scanner;
          import java.util.Random;
          
          
          
          public class smallbig
          {
          
              private static int[] myArray;
          
              public static void main(String[] args) {
                  Scanner scan = new Scanner(System.in);
                  Random randomGenerator = new Random();
          
                  //int num = scan.nextInt(); //skip this for testing ^^-d
                  int num = 10;
                  myArray = new int[num];
          
                  for (int i = myArray.length-1; i > 0; i--) {
                      //int randomInt = randomGenerator.nextInt(100);
                      int randomInt = i; //use test condition that can be reproduced!
                      myArray[i] = myArray.length-i;
                  }
                  int smallest = 0;
                  int largest = 0;
          
                  int smallestIndex = 0;
                  int largestIndex = 0;
          
                  for (int i = 0; i < myArray.length; i++) {
                      if (myArray[i] > largest) {
                          largest = myArray[i];
                          largestIndex = i;
                      }
                      if (myArray[i] < smallest) {
                          smallest = myArray[i];
                          smallestIndex = i;
                      }
                  }
          
                  switchIndexOfmyArray(0, smallestIndex);
          
                  switchIndexOfmyArray(myArray.length-1, largestIndex);
          
                  for (int j = 0; j < myArray.length; j++) {
                      System.out.print(myArray[j] + " ");
                  }
          
              }
              public static void switchIndexOfmyArray(int index, int switchWithIndex){
                  int temp = myArray[index];
                  myArray[index] = myArray[switchWithIndex];
                  myArray[switchWithIndex] = temp;
              }
          }
          

          产量

          0 1 8 7 6 5 4 3 2 9 
          

          我承认我在这方面做得很慢,因为我又饿又累 xD

          编码愉快! ^^

          【讨论】:

            【解决方案7】:

            你做得很好,找到了最小的和最大的。问题在于交换。我重构了交换方法。可能会奏效。

            import java.util.Scanner;
            import java.util.Random;
            
            public class smallbig
            {
                public static void main(String[] args) {
                    Scanner scan = new Scanner(System.in);
                    Random randomGenerator = new Random();
            
                    int num = scan.nextInt();
                    int[] myArray = new int[num];
            
                    for (int i = 0; i < myArray.length; ++i) {
                        int randomInt = randomGenerator.nextInt(100);
                        myArray[i] = randomInt;
                    }
            
            
                    for(int k=0; k < myArray.length; k++)
                    {
                        System.out.print(myArray[k] + " ");
                    }
            
                    System.out.println();
            
                    int smallest = myArray[0];
                    int largest = myArray[0];
            
                    int sIndx = 0;
                    int lIndx = 0;
            
                    for (int i = 1; i < myArray.length; i++) {
                        if (myArray[i] > largest) {
                            largest = myArray[i];
                            lIndx = i;
                        }
                        if (myArray[i] < smallest) {
                            smallest = myArray[i];
                            sIndx = i;
                        }
                    }
            
                    System.out.println();
                    System.out.println("Smallest = "+smallest);
                    System.out.println("largest = "+largest);
                    System.out.println("Smallest Index = "+sIndx);
                    System.out.println("largest Index = "+lIndx);
            
                    swapSmallAndLargest(num, myArray, sIndx, lIndx);
            
                    for(int k=0; k < myArray.length; k++)
                    {
                        System.out.print(myArray[k] + " ");
                    }
            
            
                }
            
                private static void swapSmallAndLargest(int num, int[] myArray, int sIndx, int lIndx) {
                    int temp = 0;
            
                    temp = myArray[sIndx];
                    myArray[sIndx] = myArray[0];
                    myArray[0] = temp;
            
                    temp = myArray[lIndx];
                    myArray[lIndx] = myArray[num-1];
                    myArray[num-1] = temp;
                }
            }
            

            【讨论】:

              猜你喜欢
              • 2021-01-08
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2017-03-08
              • 2021-11-11
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多