news 2026/4/18 12:35:49

hot100 283.移动零

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
hot100 283.移动零

一、方法一:把nums当作栈。用一个栈记录非零元素。

1.思路:

(1)以示例1为例,nums = [0,1,0,3,12],判断过程如下表所示。

(2)最后,再在栈的末尾添加两个零,即为答案[1,3,12,0,0]。

(3)为了做到O(1)的空间复杂度,可以直接把nums当作栈,用一个变量StackSize表示栈的大小,初始值为0。

(4)入栈就是把nums[StackSize]置为nums[i],同时把StackSize加1。

(5)最后把nums中的下标从StackSize到n - 1的数都置为0。

2.复杂度分析:

(1)时间复杂度:O(n),其中n是nums的长度。

(2)空间复杂度:O(1)。

附代码:

class Solution { public void moveZeroes(int[] nums) { int stackSize = 0; for(int x : nums){ if(x != 0){ //先赋值再加1 nums[stackSize++] = x; } } //Arrays.fill是前闭后开区间 //从索引stackSize开始(包含),到索引nums.length结束(不包含),将元素置为0 Arrays.fill(nums,stackSize,nums.length,0); } }

二、方法二:双指针 + 交换元素。

1.优势:方法一在最坏的情况下(nums全为0),需要遍历nums两次,而本方法只需要一次遍历。

2.核心思路:

(1)把0视作空位,把所有非0元素移动到数组左边的空位上,并保证非0元素的顺序不变。

(2)举例:如nums = [0,0,1,2],把1放到最左边的空位上,数组就变成了[1,0,0,2]。注意1移动过去后,在原来1的位置又产生了一个新的空位。也就是说,交换了nums[0] = 0和nums[2] = 1这两个数。

(3)为了保证非0元素的顺序不变,需要维护最左边的空位的位置(即下标)。

3.具体思路:

(1)从左到右遍历nums[i]。

(2)同时维护另一个下标i0(初始值为0),并保证下标区间[i0,i - 1]都是空位,且i0指向最左边的空位。

(3)每次遇到nums[i] != 0的情况,就把nums[i]移动到最左边的空位上,也就是交换nums[i]和nums[i0]。交换后把i0和i都加1,从而使【[i0,i - 1]都是空位】这一性质仍然成立。

(4)如果nums[i] = 0,无需交换,只把i加1。

4.举例:示例1的nums = [0,1,0,3,12],计算过程如下所示(下划线表示交换的两个数):

5.由于每次操作后,[i0,i - 1]对应的元素值全为0这一性质始终成立,所以nums遍历结束后(i == n),[i0,n - 1]对应的元素值全为0,且[0,i0 - 1]都是交换过去的非0元素,这样就满足了题目“将所有的0移动到数组的末尾”的要求。

6.复杂度分析:

(1)时间复杂度:O(n),其中n是nums的长度。

(2)空间复杂度:O(1)。

附代码:

class Solution { public void moveZeroes(int[] nums) { int i0 = 0; for(int i = 0;i < nums.length;i++){ //i用来找第一个非0元素,并与i0交换位置 //如果i指向的元素为0,i继续向后找 //如果i指向的元素非0,i指向的元素就会和i0交换,然后i0++,因此i0左边的元素都是非0元素 //i0指向下一个非0元素应该存放的位置(i0左边的元素都是已经整理好的非0元素,i0和i之间的元素都是0) if(nums[i] != 0){ //交换nums[i]和nums[i0] int tmp = nums[i]; nums[i] = nums[i0]; nums[i0] = tmp; i0++; } } } }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 8:38:13

SEO已死?Lovable增长负责人揭秘:你的增长剧本正在失效的真相

SEO已死&#xff1f;Lovable增长负责人揭秘&#xff1a;为什么你的增长剧本正在失效 大家好&#xff0c;我是Franco。 最近在增长圈子里&#xff0c;有一个话题被讨论得热火朝天&#xff1a;传统的SEO&#xff08;搜索引擎优化&#xff09;护城河正在崩塌。 这可不是什么危言耸…

作者头像 李华
网站建设 2026/4/18 7:54:30

LobeChat研究方向建议生成AI

LobeChat&#xff1a;构建可控、可扩展AI对话系统的实践路径 在企业纷纷拥抱大语言模型的今天&#xff0c;一个现实问题摆在面前&#xff1a;如何让强大的LLM真正落地到具体业务中&#xff0c;而不是停留在“能聊几句”的演示阶段&#xff1f;很多团队尝试过直接调用OpenAI API…

作者头像 李华
网站建设 2026/4/18 5:27:28

LobeChat劳动合同条款生成器

LobeChat劳动合同条款生成器 在企业日常运营中&#xff0c;人力资源部门常常面临大量重复性文书工作——尤其是劳动合同的起草。每一份合同都需要确保条款完整、用语规范&#xff0c;并严格符合《劳动合同法》及相关地方政策。传统方式依赖人工撰写或模板套用&#xff0c;不仅效…

作者头像 李华
网站建设 2026/4/18 11:18:40

AI绘画大赛联动:用LobeChat生成创意提示词参赛

AI绘画大赛联动&#xff1a;用LobeChat生成创意提示词参赛 在AI艺术创作的浪潮中&#xff0c;一场无声的变革正在发生。越来越多的设计师、艺术家和开发者发现&#xff0c;真正决定一幅AI生成图像质量的&#xff0c;往往不是模型本身&#xff0c;而是那短短几行“咒语”——提示…

作者头像 李华
网站建设 2026/4/18 5:23:46

LobeChat ISO27001体系建设建议

LobeChat 与 ISO27001&#xff1a;构建可信企业级 AI 聊天系统的实践路径 在当今企业加速智能化转型的背景下&#xff0c;AI 聊天系统已不再是简单的“对话接口”&#xff0c;而是承载知识服务、业务流程甚至核心决策支持的关键平台。随着大语言模型&#xff08;LLM&#xff09…

作者头像 李华
网站建设 2026/4/18 8:52:27

vue基于Springboot框架的流浪猫救助系统 流浪宠物领养系统

目录已开发项目效果实现截图开发技术系统开发工具&#xff1a;核心代码参考示例1.建立用户稀疏矩阵&#xff0c;用于用户相似度计算【相似度矩阵】2.计算目标用户与其他用户的相似度系统测试总结源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&…

作者头像 李华