题目:
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
示例:
输入: [0,1,0,3,12]
输出: [1,3,12,0,0]
说明:
1.必须在原数组上操作,不能拷贝额外的数组。
2.尽量减少操作次数。
代码:
void moveZeroes(int* nums, int numsSize) {
int j;
for(int i=0;i<numsSize;i++){
if(nums[i]==0)
for(j=i+1;j<numsSize;j++)
if(nums[j]!=0){
nums[i]=nums[i]^nums[j];
nums[j]=nums[i]^nums[j];
nums[i]=nums[i]^nums[j];
break;
}
}
}
思考方法:从第一个元素开始扫描,为零就后移,并于后面的非零元素交换值,补充一点用异或的原因是才会,练下手。这样运算的复杂度为O(n^2),比较复杂。
看下别人的代码就看出区别来了。
void moveZeroes(int* nums, int numsSize) {
int i,len=0;
for(i=0;i<numsSize;i++){
if(nums[i]!=0){
nums[len]=nums[i];
len++;
}
}
for(i=len;i<numsSize;i++)
nums[i]=0;
}
这种方式每次扫描就把非零数字全部集合在一起,剩下的就为0,其实在往更深的地方想也能想到,究其原因,还是思想深度不够,没能看透其本质。
继续阅读与本文标签相同的文章
上一篇 :
分布式技术在无人驾驶汽车中的应用
下一篇 :
每个Python新手都应该知道的一些编程技巧
-
免费的分布式事务来了——阿里巴巴Fescar
2026-05-19栏目: 教程
-
升级iOS 13后真能随意换字体?库克言:想多了,字体管理≠换字体
2026-05-19栏目: 教程
-
Java发送邮件必带超时时间配置
2026-05-19栏目: 教程
-
学术研究显示:移动支付让人花钱更多,是真的吗?
2026-05-19栏目: 教程
-
腾讯营收5.99亿美元登顶9月全球移动发行商收入总榜 同比增30%
2026-05-19栏目: 教程
