我正在尝试将数组拆分为odd
和even
个数字。请注意,在最终结果中排序数字无关紧要。我正在编译代码,输出包含一些bug。我的代码正确排列了odd
个数字,而even
数字给了我一些麻烦。 COuld smb请帮我解决even
号码的安排?提前谢谢!
基本上,我在数组的左侧安排odd
个数字,并在开头有oddPos = 0
个数字; even
数字位于右侧,定位从数组evenPos = myArray.length - 1
的最末端开始。
public class EvenOddArray {
public static void main(String[] args){
int[] myArray = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int oddPos = 0;
int evenPos = myArray.length - 1;
for(int i = 0; i < myArray.length; i++){
if(myArray[i] % 2 == 0){
myArray[evenPos] = myArray[i];
evenPos--;
}
else{
myArray[oddPos] = myArray[i];
oddPos++;
}
}
for(int i = 0; i < myArray.length; i++){
System.out.print(myArray[i] + " ");
}
}
}
输出:
1 3 5 7 2 4 6 6 4 2
答案 0 :(得分:3)
int current = 0;
int evenPos = myArray.Length - 1;
while (current < evenPos) {
if (myArray[current] % 2 == 0) {
swap(myArray, evenPos, current);
evenPos--;
} else {
current++;
}
}
一个挤压的搞笑版本:
for (int curPos=0, evenPos=myArray.length-1; curPos < evenPos;)
if (myArray[curPos] % 2 == 0)
swap(myArray, evenPos--, curPos);
else
curPos++;
更有趣的版本:
for (int curPos=0, evenPos=myArray.length-1; curPos < evenPos;)
swap(myArray, curPos, myArray[curPos]%2==0 ? evenPos-- : curPos++);
<强>解释强>
当数字为奇数时,您不必交换值。只有你 增加现有的柜台。
你也不能使用for循环计数器作为数组的索引。至 不要错过被交换到柜台索引的数字 处理。这是其他答案没有涉及的错误。
答案 1 :(得分:2)
实际上,在阅读时,您正在编辑相同的myArray
数组。所以会发生什么,
在循环的第6次迭代中,将{6}插入myArray[7]
位置。因此,在第7次迭代期间,当您阅读myArray[7]
时,它是6.不是8.因为,您在上一次迭代中已经过了8次写入。
因此,使用单独的数组来保存结果。希望你明白这一点。
你可以这样做,
int[] myArray = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int[] resultArray = new int[myArray.length];
int oddPos = 0;
int evenPos = myArray.length - 1;
for(int i = 0; i < myArray.length; i++){
if(myArray[i] % 2 == 0){
resultArray[evenPos] = myArray[i];
evenPos--;
}
else{
resultArray[oddPos] = myArray[i];
oddPos++;
}
}
答案 2 :(得分:1)
让我们看看for循环的每次迭代会发生什么。
如您所见,您正在修改阵列&#34; inplace&#34;。您正在修改数组而不使用所有值。例如,看看9,它在被访问之前就被覆盖了。所以,你的算法是错误的。
建议:
答案 3 :(得分:0)
这是我的优化版本,与@ hasan83版本相比,它使用了大约一半的掉期。
int n = myArray.length;
int oddPos = 0;
int evenPos = n - 1;
while (true) {
while (oddPos < n && myArray[oddPos] % 2 == 1) {
oddPos++;
}
while (evenPos >= 0 && myArray[evenPos] % 2 == 0) {
evenPos--;
}
if (oddPos >= evenPos) break;
swap(myArray, oddPos, evenPos);
}