以下是问题 -
给定一个整数数组作为输入,返回一个包含与输入数组中相同数字的数组,但重新排列,以便所有偶数都在前面,而赔率数在后面。请注意,应该保持偶数和奇数的顺序,即如果在输入中出现偶数n1
之前的偶数n2
,那么在输出数组n1
中应该出现在n2
之前。奇数也是如此。另请注意,在此问题中,您不应创建任何新数组。
到目前为止所做的工作如下,但我无法获得预期的输出。
public class MoveEvenToFront {
static int[] testcase1 = {3, 5, 4, 6, 8, 9, 7, 10};
public static void main(String[] args) {
MoveEvenToFront testInstance = new MoveEvenToFront();
int[] result = testInstance.moveEvenToFront(testcase1);
System.out.print("{");
for (int i = 0; i < result.length; i++) {
if (i > 0) {
System.out.print(",");
}
System.out.print(result[i]);
}
System.out.print("}");
}
public int[] moveEvenToFront(int[] arr) {
int temp = 0;
for (int i = 1; i < arr.length; i++) {
if (arr[i - 1] % 2 != 0) {
temp = arr[i - 1];
arr[i - 1] = arr[i];
arr[i] = temp;
}
}
return arr;
}
}
测试用例{1,2,3,4,5,6,7,8,10,12}
的预期输出为{2,4,6,8,10,12,1,3,5,7}
。
答案 0 :(得分:4)
你的算法错了。您正在检查arr[i-1]
是否不均匀,并使用arr[i]
进行交换。如果arr[i]
也是奇数,那么你没有检查它,即使它是奇数,它也会移动到前面。
你能做的是
更改方法如下所示:
public int[] moveEvenToFront(int[] arr){
int temp=0;
int a=0;
for(int i=0;i<arr.length;i++){
if(arr[i]%2==0){
for (int j=i;j>a;j--){
temp=arr[j-1];
arr[j-1]=arr[j];
arr[j]=temp;
}
a++;
}
}
return arr;
}
答案 1 :(得分:3)
直接尝试:
public static Integer[] NUMBERS = {3,5,4,6,8,9,7,10};
public static void main(String[] args) {
ArrayList<Integer> ints = new ArrayList<>(Arrays.asList(NUMBERS));
int nextIdx = 0;
for (int idx = 0; idx < ints.size(); idx++) {
if (ints.get(idx) % 2 == 0) ints.add(nextIdx++, ints.remove(idx));
}
System.out.println(ints);
}
输出:
[4, 6, 8, 10, 3, 5, 9, 7]
答案 2 :(得分:0)
public void moveEvenToFront(){
int temp=0;
for(int i=0;i<values.length;i++){
for(int j=i;j<values.length;j++){
if(values[j]%2==0){
temp = values[i];
values[i] = values[j];
values[j] = temp;
}
}
}
创建values[]
后,解决此问题的关键是确定偶数个位置并使用values[0]
进行切换。并增加1,这样偶数就不会消失。希望这会有所帮助。