题目
难度
力扣难度简单,实际难度简单
分类
双指针
思路
这道题最差的情况也就是新建一个数组然后从头遍历到尾,奇数塞前面,偶数从后面塞入。时间复杂度n,空间复杂度n 时间复杂度为n是没办法优化的,无论如何必须把这n个数全看完,那么就从空间复杂度入手,那就是复杂度为1,使用原数组原地交换,那么也很简单头尾各一个指针往中间遍历,遇到左偶右奇就交换一下,不然就移动就好了。 还有一个优化的点就是判断是奇数还是偶数可以用 & 1 位运算去写,会比%2快一些,没办法这道题太简单了,基本都会写吧只能扣细节。
代码
class Solution {
public int[] exchange(int[] nums) {
if (nums.length == 1 || nums.length == 0) {
return nums;
}
int indexL = 0,indexR = nums.length - 1;
while (indexL < indexR) {
boolean flag1 = (nums[indexL] & 1) == 0;
boolean flag2 = (nums[indexR] & 1) == 1;
if (flag1 && flag2) {
int temp = nums[indexL];
nums[indexL] = nums[indexR];
nums[indexR] = temp;
indexR--;
indexL++;
} else if (!flag1 && !flag2){
indexR--;
indexL++;
} else if (flag1) {
indexR--;
} else if (flag2) {
indexL++;
}
}
return nums;
}
}