给出java中的整数数组。
int arr[] = {12, 34, 45, 9, 8, 90, 3};
输出应该是: 12 34 8 90 45 9 3
这里有一个问题。我知道如何隔离偶数和奇数元素,但在其中一个访谈中,我已经要求编写一个代码,这个代码不仅会进行这种隔离,而且还会以这样的方式维护顺序:偶数元素应遵循插入顺序到数组中的其他偶数元素和奇数元素的相同元素。
正常甚至奇数的隔离将导致[12 34 90 8 9 45 3]但我希望最终输出为[12 34 8 90 45 9 3]。
对于正常甚至奇数的隔离,我遵循这种方法:
class TestOutput {
static void segregateEvenOdd(int input[]) {
int left = 0, right = input.length - 1;
while (left < right) {
while (input[left] % 2 == 0 && left < right)
left++;
while (input[right] % 2 == 1 && left < right)
right--;
if (left < right) {
int temp = input[left];
input[left] = input[right];
input[right] = temp;
left++;
right--;
}
}
}
public static void main(String[] args) {
int input[] = { 12, 34, 45, 9, 8, 90, 3 };
segregateEvenOdd(input);
for (int i = 0; i < input.length; i++)
System.out.print(input[i] + " ");
}
}
答案 0 :(得分:1)
/**
* Created by maciej.brzozowski.83@gmail.com on 2017-03-30.
* stackOverflow_43127404
*/
public class ArraySort {
public ArraySort() {
}
public int[] sort(int[] array){
int[] result = new int[array.length];
int resultIndex=0; //
for (int i = 0; i <array.length ; i++) {
if (array[i]%2==0){
result[resultIndex]= array[i];
resultIndex++;
}
}
for (int i = 0; i <array.length ; i++) {
if (array[i]%2==1){
result[resultIndex]= array[i];
resultIndex++;
}
}
return result;
}
}
它应该做你需要的。代码需要两次通过数组才能执行,因此需要O(2n)才能执行。在Spock Framework(groovy)中对此算法进行测试
import org.junit.Assert
import spock.lang.Specification
/**
* Created by maciej.brzozowski.83@gmail.com on 2017-03-30.
* stackOverflow_43127404
*/
class arraySortSpectTest extends Specification {
def "ShouldSortArrayInSpecificOrderPolishFlagSortOddEven"() {
given:
int[] testArray = [12,34,45,9,8,90,3];
int[] expectedArray = [12,34,8,90,45,9,3];
ArraySort polishFlagSort = new ArraySort();
when:
int[] actualResult = polishFlagSort.sort(testArray);
then:
Assert.assertArrayEquals(expectedArray, actualResult);
}
}