El tema es el siguiente
Ingrese una matriz de enteros e implemente una función para ajustar el orden de los números en la matriz de modo que todos los números impares estén en la primera mitad de la matriz y todos los números pares estén en la segunda mitad de la matriz.
Ejemplo:
Entrada: nums = [1,2,3,4]
Salida: [1,3,2,4]
Nota: [3,1,2,4] también es una de las respuestas correctas.
Algoritmo y código propios
(La clase de algoritmo se ejecuta y envía correctamente, y el consumo de memoria es alto, principalmente en la creación de una nueva matriz para almacenar datos)
- Cree una nueva matriz
result[]
y dos banderasfirst
ylast
, apuntando al resultado [] en la primera0
posición, la primeranums.length-1
posición. - Recorre los números de matriz de atrás hacia adelante.
- Si nums [i] es un número par, agréguelo a la última posición del resultado [] y mueva la última posición hacia adelante, es decir
last--
; - Si nums [i] es un número impar, agréguelo a la primera posición del resultado [] y mueva la última posición hacia atrás, es decir
first++
;
- Si nums [i] es un número par, agréguelo a la última posición del resultado [] y mueva la última posición hacia adelante, es decir
- Luego devuelve el resultado [].
public class Solution {
public static int[] exchange(int[] nums) {
int[] result = new int[nums.length];
int first = 0;
int last = nums.length-1;
for (int i = nums.length-1; i >= 0; i--){
if (nums[i]%2 == 0){
result[last] = nums[i];
last--;
}else {
result[first] = nums[i];
first++;
}
}
return result;
}
public static void main(String[] args) {
int[] nums = {
1,2,3,4};
int[] result = exchange(nums);
for (int num : result){
System.out.println(num);
}
}
}
Algoritmo y código de referencia
Puntero doble
- Definir puntero de cabeza
left
y puntero de colaright
. - a la izquierda se ha movido a la derecha hasta que el valor al que apunta sea par
- la derecha sigue moviéndose hacia la izquierda hasta que el valor al que apunta es un número impar
- Exchange
nums[left]
ynums[right]
. - Repita las operaciones anteriores hasta que
left==right
.
public class Solution {
public static int[] exchange1(int[] nums) {
int left = 0;
int right = nums.length-1;
int temp;
while (left < right){
if (nums[left]%2 != 0){
//奇数
left++;
continue;
}
if (nums[right]%2 == 0){
//偶数
right--;
continue;
}
temp = nums[left];
nums[left] = nums[right];
nums[right] = temp;
}
return nums;
}
public static void main(String[] args) {
int[] nums = {
1,2,3,4};
int[] result = exchange1(nums);
for (int num : result){
System.out.println(num);
}
}
}