[英]How to seperate even and odd numbers in the same array?
如何在保留顺序的数组中分离偶数和奇数?
修改必须到位并且返回是void
,并且只能使用内置方法。
一个例子是:
{4, 5, 8, 16, 45, 12, 67, 13} -> {4, 8, 16, 12, 5, 45, 67, 13}
您可以通过一次迭代轻松解决此问题,记住当前边框的索引并交换元素。
因此,对于您的示例,该过程将是:
{ 4, 5, 8, 16, 45, 12, 67, 13 } // swap 4 with 4
^
{ 4, 5, 8, 16, 45, 12, 67, 13 }
^
{ 4, 8, 5, 16, 45, 12, 67, 13 } // swap 5 with 8
^
{ 4, 8, 16, 5, 45, 12, 67, 13 } // swap 5 with 16
^
{ 4, 8, 16, 12, 45, 5, 67, 13 } // swap 5 with 12
^
其中^
显示当前边界索引,它总是比偶数值早一个,指向您要将下一个偶数值交换到的索引。
这是代码:
int borderIndex = 0;
for (int i = 0; i < values.length; i++) {
int value = values[i];
if (value % 2 == 0) {
// swap
values[i] = values[borderIndex];
values[borderIndex] = value;
borderIndex++;
}
}
现在,这个解决方案已经保留了开箱即用的偶数顺序。 但是,如果您密切注意,您会发现它不会保留奇数值的顺序。 只要在偶数之前有多个奇数值,就会出错,例如
..., 5, 45, 12, ...
因为然后它将5
与12
交换,导致12, 45, 5
而不是12, 5, 45
。
当有多个奇数值时更糟:
..., 5, 7, 9, 11, 12, ...
导致12, 7, 9, 11, 5
。
为了解决这个问题,我们不仅要将5
与偶数12
交换,而且实际上要一直交换回5
。 所以:
swap 12 with 11
swap 12 with 9
swap 12 with 7
swap 12 with 5
基本上从右到左向下移动12
,直到它位于5
的正前方。
我们可以通过一个从12
(在i
处)移动到5
(在borderIndex
处)的简单循环轻松做到这一点:
int borderIndex = 0;
for (int i = 0; i < values.length; i++) {
int value = values[i];
if (value % 2 == 0) {
// swap from i to borderIndex
for (int j = i; j > borderIndex; j--) {
values[j] = values[j - 1];
values[j - 1] = value;
}
borderIndex++;
}
}
你也可以这样做。 在这种情况下,您可以根据它们的固有性质对它们进行排序,而不是它们之间的关系。
Integer [] arr = {4, 5, 8, 16, 45, 12, 67, 13};
Arrays.sort(arr, Comparator.comparing(a->a % 2));
System.out.println(Arrays.toString(arr));
印刷
[4, 8, 16, 12, 5, 45, 67, 13]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.