一个神奇的题目,写起来哪哪都是问题,搞了好长时间,难道我的思路太简单了,而这题不是想的那么简单
思路是双指针指向 头p0 尾p2, for i 遍历 每一个 下标对应值,如果等于 0 的话就交换p0和i下标的内容,如果等于2的话就交换p2和i下标内容
出现的问题 1.循环终止条件要写成 i <= p2 ,一开始for循环 i 终止条件 写的是 i < nums.length ,结果错了,最后的结果是002211,2在中间,发现如果i的下标大于p2的话,i指向的内容一定是2,这个时候p2指向的内容可能是1还是什么的,这就将不正确的数换到尾部了,所以for i 的循环终止条件改成 i <= p2 2.要循环判断p2是否正确,一开始两个判断都是if判断,然后又是p2他可能存在一种前后交换完,他还是2的情况,所以这里需要循环的去交换i以保证不会漏掉2 3.不可以使用位运算交换,数字交换,原本是打算用位运算交换的,但是如果nums[i] == nums[p2]的话,就会变成 0,因为是异或运算吗,所以还是老老实实改回去了 4.**必须先处理p2 在处理 p0,**不然会错,我不理解就算到现在
nums[i] ^= nums[p2];
nums[p2] ^= nums[i];
nums[i] ^= nums[p2];
class Solution {
public void sortColors(int[] nums) {
int p0 = 0;
int p2 = nums.length - 1;
for(int i = 0 ; i <= p2 ; i++){
while(nums[i] == 2 && i <= p2){
int temp = nums[i];
nums[i] = nums[p2];
nums[p2] = temp;
p2--;
}
while(nums[i] == 0){
int temp = nums[i];
nums[i] = nums[p0];
nums[p0] = temp;
p0++;
}
}
}
}
我觉得我没有懂这道题,如果有好的解释麻烦和我说一声谢谢了
|