今日是中等题:https://leetcode-cn.com/problems/sort-colors/
题目倒是不难,就是实现一个快排,思路也很清晰,双指针头尾往中间走,new了一个新的数组对象来存放排序后的结果。
但最后提交的时候傻眼了,题目的方法类型是void,也就是说没有返回值,我开始自作聪明把void改成了int[]也并没有什么卵用。
调试的时候发现一切正常,猜测可能题目本身想要的就是我在nums内部做排序,可是这样要做交换了,我不喜欢交换。
所以自作聪明二连,我直接把排序后的数组ans赋值给nums就好了吧?
于是操作了一波:
nums = ans;
再次运行果然又打脸了。
在请教了开发小哥哥之后,终于意识到了,我这是栽在了入门坑里,上述的方法是引用而非赋值,并没有实际改变nums对象,所以返回的依旧是毫发无伤的nums本人没错。
关于Java对象的引用与赋值,可参考这篇:https://www.cnblogs.com/liuurick/p/10713656.html
于是在和开发大大讨论之后,我发现可以改用这样的方式做赋值:
for (int k =0 ;k<len;k++) {
nums[k]=ans[k];
}
虽然最终用了3次for循环,但是还是倔强地没有用答案的交换法,这里贴一下并不优雅的代码吧:
class Solution {
public void sortColors(int[] nums) {
int len = nums.length;
int head = 0;
int tail = len-1;
int[] ans = new int[len];
for (int i=0;i<len;i++) {
if (nums[i]==0) {
ans[head] = 0;
head++;
}
else if (nums[i]==2) {
ans[tail] = 2;
tail--;
}
}
for (int j=head; j<tail+1; j++) {
ans[j] = 1;
}
for (int k =0 ;k<len;k++) {
nums[k]=ans[k];
}
}
}
网友评论