【问题标题】:Input array sorted into even and odd numbers输入数组排序为偶数和奇数
【发布时间】:2017-03-27 18:17:55
【问题描述】:

我是 Java 新手,坚持以下任务。我们正在使用数组,并且应该根据我们的输入创建一个长度为的数组。不允许使用除main() 之外的其他方法。

然后输入数组会随机选择 0-999 之间的整数放入数组中,然后我们应该创建一个新的数组,其数字和长度相同,但先以偶数排序,然后再以奇数排序。

例子:

How many variables do you want? 4      

Here are the random variables: 4 7 8 1   
Here are the sorted variables: 4 8 7 1   
Of your chosen variables 2 are even and 2 are odd

到目前为止,我的代码是这样的。

public static void main(String[] args)
{
    int checker;
    int even = 0;
    int odd = 0;

    Scanner s = new Scanner(System.in);

    System.out.print("How many variables between 0-999 you want?: ");

    int n = s.nextInt();

    int arr[] = new int[n];
    int ord[] = new int[n];

    for(int i = 0; i < n; i++)
    {
        arr[i] = (int) (Math.random() * 100) + 1;
    }

    System.out.print("Here are your random numbers: ");

    for(int i : arr)
    {
        System.out.print(i + " ");  
    }

    for(int i = 0; i < n - 1; i++)
    {
        checker = arr[i] % 2;

        if(checker == 0)
        {
            even = even + 1;
        }
        else
        {
            odd = odd + 1;
        }
    }

    System.out.print("Of the chosen numbers" + even + "is even and" + odd + "is odd");
}

【问题讨论】:

  • 我认为你应该具体说出你遇到的问题,并且至少尝试一下排序算法。
  • 您遇到问题了吗?你的问题在哪里?如果你能帮助缩小问题的范围,它会更顺利
  • 顺便说一句,您可以将人民币与 01 按位与来检查变量是否为奇数。
  • @TheBlueCat,你为什么要这么做?恕我直言arr[i] % 2 == 0 阅读起来更清晰(并且同样有效,但这并不重要)。

标签: java arrays sorting


【解决方案1】:

首先,arr[i]=(int)(Math.random()*100)+1; 是错误的。这将为您提供 1-100 范围内的数字,而不是 0-999。你需要这样写:

arr[i]=(int)(Math.random()*1000);

其次,最后一个 for 循环的条件是 i&lt;n-1 而不是 i&lt;n。这也需要解决。

现在,我们只需要对数组进行排序。我们已经在遍历数组来计算偶数和奇数的个数,所以我们不妨同时对数组进行排序。

让我们有两个额外的空数组,一个用于偶数,一个用于奇数,我们将值临时存储在其中:

int[] evens = new int[n];
int[] odds = new int[n];

现在,每次我们找到一个偶数或奇数时,我们都可以将它们插入以下数组之一:

if(checker == 0) {
    evens[even] = arr[i]; //new line of code
    even = even + 1;
} else {
    odds[odd] = arr[i]; //new line of code
    odd = odd + 1;
}

现在,我们要做的就是将这两个数组中的值插入到最终数组ord

for(int i=0; i<even; i++) {
    ord[i] = evens[i];
}

for(int i=0; i<odd; i++) {
    ord[even+i] = odds[i];
}

现在我们有了我们想要的排序数组。

现在您可以按照打印未排序数组的方式打印它:

System.out.print("Here are the sorted variables:");
for(int i : ord) {
    System.out.print(i + " ");
}

【讨论】:

    【解决方案2】:

    我看到有些人打败了我,但无论如何我都会回答并给你一些建议。

    这是您应该在最后一个 for 循环后面添加的代码。

        int iEven=0;     // the even part starts at the beginning
        int iOdd=even;   // the odd part starts where the even one ends
        for(int i=0; i<n; i++){
            if(arr[i] % 2 == 0){
                ord[iEven] = arr[i];
                iEven++; 
            }else{
                ord[iOdd] = arr[i];
                iOdd++;
            }
        }
    
        System.out.print("\nHere are the sorted variables: ");
        for(int i:ord){
            System.out.print(i+" ");    
        }
    

    它的作用是将偶数放在数组的开头,将偶数放在数组的末尾。

    您还应该修复您的 for 循环:'for(int i = 0; i '。 在这种情况下,它将比您想要的少运行一次。 要么放 'i 要么 'i ,或者最好的选择是使用 'i 每当你改变数组时它就会改变,你不必担心每次都改变它。

    现在寻求建议...像这样编写代码:

    检查器 = arr[i] % 2; 如果(检查器 == 0)

    可以这样改进:

    if(arr[i] % 2 == 0)

    而且看起来好多了。

    另一件让您的编程更容易的事情是使用 i++(或 i--)将变量增加 1。它节省了一点输入。或者,如果您想增加更多,请使用 i+=3i-=7

    希望对你有帮助

    【讨论】:

    • 好答案。但是,i 已设置为数组的长度。写arr.length 而不是n 是没有意义的。
    【解决方案3】:

    最好的解决方案是编写自己的比较器: 首先比较一个是偶数,另一个是奇数。如果他们是你已经知道应该先走哪一个,否则自然比较。

    Integer ord[] = new Integer[n];
    Arrays.asList(arr).stream().sorted(new Comparator<Integer>() {
                                           @Override
                                           public int compare(Integer o1, Integer o2) {
                                               if (o1 % 2 == 0 && o2 % 2 == 1) {
                                                   return -1;
                                               } else if (o1 %2 == 1 && o2 % 2 == 0) {
                                                   return 1;
                                               }
                                               return o1.compareTo(o2);
                                           }
                                       }).collect(Collectors.toList()).toArray(ord);
    

    【讨论】:

    • 我认为这太复杂了。原发帖人还说除了main() 之外没有其他方法是允许的,所以我假设你compare() 在这里是不行的。
    【解决方案4】:

    您可以通过修改最终循环来轻松完成此操作。关键是从前面用偶数填充数组,从后面用奇数填充数组。完成后,even 索引会告诉您有多少个偶数。像这样:

    int even = 0;
    int odd = n-1;
    for(int i = 0; i < n; i++)
    {
        checker = arr[i] % 2;
    
        if(checker == 0)
        {
            // even numbers fill from 0, forward
            ord[even] = arr[i];
            ++even;
        }
        else
        {
            // odd numbers fill from n-1, backward
            ord[odd] = arr[i];
            --odd;
        }
    }
    
    System.out.print("Of the chosen numbers" + even + "is even and" + (n-even) + "is odd");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-24
      • 2016-12-29
      • 1970-01-01
      相关资源
      最近更新 更多