java - 如何将所有偶数按顺序排列,先出现,再出现奇数?
问题描述
我遇到的问题是如何重新排列 int 值数组,以便所有偶数值出现在所有奇数值之前。下面是我的编码:
import java.io.*;
public class EvenAppearBeforeOdd {
// function to rearrange the array in given way.
static void rearrangeEvenAndOdd(int arr[], int n)
{
// variables
int j = -1,temp;
// quick sort method
for (int i = 0; i < n; i++) {
// if array of element
// is odd then swap
if (arr[i] % 2 == 0) {
// increment j by one
j++;
// swap the element
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
// Driver code
public static void main(String args[])
{
int arr[] = { 15, 9, 1, 3, 10, 5, 4, 8 };
System.out.println("\n\nBefore\n");
System.out.println(arr[]);
try {
System.out.println(EvenAppearBeforeOdd.rearrangeEvenAndOdd(arr);
} catch (Exception e) {
System.out.println("Error!!!");
}
int n = arr.length;
rearrangeEvenAndOdd(arr, n);
System.out.println("\n\nAfter\n");
for (int i = 0; i < n; i++)
System.out.print(arr[i] + " ");
}
}
错误输出如下所示:
run:
C:\Users\User\AppData\Local\NetBeans\Cache\8.0.2\executor-snippets\run.xml:48:
Cancelled by user.
BUILD FAILED (total time: 3 seconds)
实际上我想要如下输出:
run:
Before
15 9 1 3 10 5 4 8
After
10 4 8 3 15 5 9 1 BUILD SUCCESSFUL (total time: 0 seconds)
希望有人能帮我检查一下我错了哪一部分的编码?非常感谢。
解决方案
下面给出的是产生与您的示例输入和输出匹配的结果的答案:
public class EvenAppearBeforeOdd {
static void rearrangeEvenAndOdd(int arr[]) {
int j = 0, temp;
for (int i = 0; i < arr.length; i++) {
if (arr[i] % 2 == 0) {
temp = arr[j];
arr[j] = arr[i];
arr[i] = temp;
j++;
}
}
}
static void printArray(int arr[]) {
for(int i=0;i<arr.length;i++)
System.out.print(arr[i]+"\t");
System.out.println();
}
public static void main(String args[]) {
int arr[] = { 15, 9, 1, 3, 10, 5, 4, 8 };
System.out.println("Before:");
printArray(arr);
rearrangeEvenAndOdd(arr);
System.out.println("After:");
printArray(arr);
}
}
您可以将您的答案与它进行比较,并轻松找到错误。如果您仍有任何问题,请随时发表评论。
更新 [2019 年 10 月 6 日 19:00]:
为了解决WJS提出的问题,rearrangeEvenAndOdd
方法可以写成:
static void rearrangeEvenAndOdd(int arr[]) {
int j, temp;
for (int i = 0; i < arr.length; i++) {
if (arr[i] % 2 == 0) {
temp = arr[i];
j=i-1;
while(j>=0 && arr[j]%2==1) {
arr[j+1]=arr[j];
j--;
}
arr[j+1]=temp;
}
}
}
但是,它不会产生与您的样本输入和输出匹配的结果,即输入数组为 { 15, 9, 1, 3, 10, 5, 4, 8 },结果将产生为 {10, 4, 8 , 15, 9, 1, 3, 5} 而不是作为样本输出 {10, 4, 8, 3, 15, 5, 9, 1}。
推荐阅读
- node.js - 使用 mongoose virtuals 获取文档计数时,无法在排除投影错误中包含字段 studentId
- csv - 使用 pyspark 读取 csv 文件时编码错误
- react-native-navigation - 如果 swipeEnabled: true 在反应原生材料顶部选项卡中,则在滑动到选项卡后单击第二次单击
- python - 为基于函数的视图自动生成表单
- powershell - powershell foreach 显示重复的结果
- networking - 中间用以太网代替直接RS485转RS485连接?
- deep-learning - 如何通过很少的镜头学习知道物体是否在图片中?
- spring-webflux - 是否可以将 Flux 传递给 webClient POST 的主体?
- ios - 无法在 IOS 设备上安装 .ipa 文件
- javascript - 将变量从 React 组件导入 Javascript 文件