Directorio de artículos
Método 1: puntero de extremo a extremo: tiempo O (n), espacio O (1)
Solución: intercambie el número par al principio y el número impar al final, y luego deje que el puntero uno ++ y uno - hasta la izquierda> = derecha
- Puntero de cabeza: siempre que el valor de la izquierda sea impar, siempre será ++
- Puntero de cola: siempre que el valor de right sea un número par, siempre será:
class Solution {
public:
vector<int> exchange(vector<int>& nums)
{
// 1.双指针
int left = 0, right = nums.size() - 1;
while (left < right)
{
if (nums[left] & 1)
{
left++;
continue;
}
if (!(nums[right] & 1))
{
right--;
continue;
}
swap(nums[left++], nums[right--]);
}
return nums;
}
};
Método 2: punteros rápidos y lentos: tiempo O (n), espacio O (1)
Solución: siempre que el puntero rápido toque un número impar, se intercambia el valor del puntero rápido y lento, y el puntero lento ++
- Puntero rápido: si es un número par, entonces ++, si es un número impar, intercambiar y luego ++
- Puntero lento: cada vez que intercambias ++
class Solution {
public:
vector<int> exchange(vector<int>& nums)
{
// 2.快慢指针
int slow = 0, fast = 0;
while (fast < nums.size())
{
if (nums[fast] & 1)
{
swap(nums[slow], nums[fast]);
slow++;
}
fast++;
}
return nums;
}
};
Temas similares
Los dígitos impares son todos impares o los pares son pares:
- El mayor escollo de esta pregunta es: el número impar es impar o el número par es par, solo asegúrese de que se establezca uno.
- Es decir, puede haber demasiados números impares y no hay garantía de que todos los números impares sean impares.
Solución del problema: puntero doble, comience desde el final de los datos, inserte los datos hacia adelante
- Si el final de los datos es impar, inserte la posición i, y i + = 2
- Si el final de los datos es un número par, inserte la posición j, y j + = 2
class Solution {
public:
/**
* 奇数位上都是奇数或者偶数位上都是偶数
* 输入:数组arr,长度大于2
* len:arr的长度
* 将arr调整成奇数位上都是奇数或者偶数位上都是偶数
*/
void oddInOddEvenInEven(vector<int>& arr, int len)
{
int i = 0, j = 1;
while (i < len && j < len)
{
if (arr[len - 1] & 1) // 奇数,放奇数位
{
swap(arr[len - 1], arr[j]);
j += 2;
}
else
{
swap(arr[len - 1], arr[i]);
i += 2;
}
}
}
};