一、题目描述与分析
由题可知,在不创建新数组完成赋值的情况下把0移动到数组末尾,而且其他数组元素值的顺序处于相对顺序。
二、解题代码与算法描述
解决方法1
刚读完题目,看到不创建新数组开始有些头疼,想到了用暴力遍历数组,0的话就和下一个交换位置,一次一次完成数组移动0.于是就有了下面的代码。
class Solution {
public void moveZeroes(int[] nums) {
//方法一
// 执行用时:51 ms, 在所有 Java 提交中击败了6.31% 的用户
for(int i=0;i<nums.length-1;i++){
if(nums[i]!=0){
continue;
}
for(int j=i+1;j<nums.length;j++){
int temp;
if(nums[j]==0){
continue;
}else{
temp=nums[i];
nums[i]=nums[j];
nums[j]=temp;
break;
}
}
}
}
}
提交结果:
过是过了,但击败了6.31%用户,这怎么可以。只击败了6.31%,我写了这么多代码,虽然时间复杂度高些,但也不至于这么低吧。不甘心,必须得重做一遍,啊啊啊,难道我想复杂了?于是想了想还真是。
解决方法2
用双指针i,j,一个i用来遍历数组,j用来记录不是0的元素赋值。遍历完后剩下的j-i个不就都是0嘛,直接赋值就可以。
class Solution {
public void moveZeroes(int[] nums) {
//方法二 击败执行用时:1 ms, 在所有 Java 提交中击败了100.00%的用户
int j=0;
for(int i=0;i<nums.length;i++){
if(nums[i]!=0){
nums[j++]=nums[i];
}
}
for(int k=j;k<nums.length;k++){
nums[k]=0;
}
}
}
提交结果:
今日心得:
这个就比较好理解,是我刚开始想复杂了,关注点都在不创建新数组,后面的为0没考虑到。走了个弯路。这也说明我们在做题的过程中感觉自己越打越乱越复杂的时候不妨重新去看看题,跳出原来的思路去想另外的思路求解。 或许就会豁然开朗。别在一个思路(死路)上纠结太多的时间。算法一般不会需要打太长的代码,所以如果你突然发现你打代码已经比50行多了还没解出来,一般说明这是一个不好的思路,虽然有可能解出来,但效率一定不是最好的。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/114653.html