【LeetCode】283. Move Zeroes 解题报告(Java & Python)
作者: 负雪明烛
id: fuxuemingzhu
个人博客: http://fuxuemingzhu.cn/
题目地址:https://leetcode.com/problems/move-zeroes/
Total Accepted: 77443 Total Submissions: 175420 Difficulty: Easy
题目描述
Given an array nums
, write a function to move all 0
's to the end of it while maintaining the relative order of the non-zero elements.
Example:
Input: [0,1,0,3,12]
Output: [1,3,12,0,0]
Note:
- You must do this in-place without making a copy of the array.
- Minimize the total number of operations.
题目大意
把数组中的0换到数组的结尾去,同时需要保证其他数字的位置不能改变。另外需要在原地进行操作。
解题方法
in-place的把0放到数组的最后,其他顺序不变。用两个指针。
方法一:首尾指针
两个指针,一个指向开始,一个指向结尾。开始这个判断是否为零,如果是零,就把其余的数据往前排,零放到末尾,开始和结尾指针向中间移动。开始这个不是零的话,就开始指针后移,结尾不变。直到两个指针重合为止。
算法效率较低,原因在于所有的数据往前移动,需要耗时。
public class Solution {
public void moveZeroes(int[] nums) {
int start=0;
int end=nums.length-1;
while(start!=end){
if(nums[start]==0){
for(int j=start+1;j<=end;j++){
nums[j-1]=nums[j];
}
nums[end]=0;
end--;
}else{
start++;
}
}
}
}
AC:21ms
方法二:头部双指针+双循环
二刷的Python版本,使用两个指针,找到下个不为0的位置,然后和当前的0进行交换。
时间复杂度是O(N^2),空间复杂度是O(1)。
class Solution(object):
def moveZeroes(self, nums):
"""
:type nums: List[int]
:rtype: void Do not return anything, modify nums in-place instead.
"""
N = len(nums)
for i in range(N):
if nums[i] != 0:
continue
j = i + 1
while j < N:
if nums[j] == 0:
j += 1
continue
nums[i], nums[j] = nums[j], nums[i]
j += 1
break
if j == N:
break
方法三:指针指向第一个0的位置
使用两个指针遍历数组,一个指向数值为0的元素,另一个指向数值不为0的元素,在遍历的过程中,不断交换两个指针的值。
这个比我的算法一简单,因为不需要把所有的数据进行搬移,只需要搬移正的数据。
public class Solution {
public void moveZeroes(int[] nums) {
int zero = 0;
while (zero < nums.length && nums[zero] != 0) {
zero++;
}
int non_zero = zero + 1;//非零的数值开始的位置应该在零值的后头,这样交换才有意义
while (non_zero < nums.length && nums[non_zero] == 0) {
non_zero++;
}
while (zero < nums.length && non_zero < nums.length) {
int temp = nums[zero];
nums[zero] = nums[non_zero];
nums[non_zero] = temp;
while (nums[non_zero] == 0) {//寻找下一个非零数值
non_zero++;
if (non_zero >= nums.length) {
return;//找不到说明已经排好序了
}
}
zero++;
}
}
}
AC:1ms
这个算法竟然写了一个小时。。崩溃。主要注意while里边进行判断,不要溢出。
二刷的时候写了个python版本的这个代码,简洁的多了。
class Solution(object):
def moveZeroes(self, nums):
"""
:type nums: List[int]
:rtype: void Do not return anything, modify nums in-place instead.
"""
N = len(nums)
i = 0
for j in range(N):
if nums[j] != 0:
nums[i], nums[j] = nums[j], nums[i]
i += 1
日期
2016/4/30 0:17:23
2018 年 11 月 10 日 —— 这么快就到双十一了??
【LeetCode】283. Move Zeroes 解题报告(Java & Python)的更多相关文章
- LeetCode 283 Move Zeroes 解题报告
题目要求 Given an array nums, write a function to move all 0's to the end of it while maintaining the re ...
- 【LeetCode】474. Ones and Zeroes 解题报告(Python)
[LeetCode]474. Ones and Zeroes 解题报告(Python) 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ ...
- 【LeetCode】120. Triangle 解题报告(Python)
[LeetCode]120. Triangle 解题报告(Python) 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 题目地址htt ...
- LN : leetcode 283 Move Zeroes
lc 283 Move Zeroes 283 Move Zeroes Given an array nums, write a function to move all 0's to the end ...
- 【LeetCode】383. Ransom Note 解题报告(Java & Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 Java解法 Python解法 日期 [LeetCo ...
- 【LeetCode】575. Distribute Candies 解题报告(Java & Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 Java解法 Python解法 日期 题目地址:ht ...
- 【LeetCode】237. Delete Node in a Linked List 解题报告 (Java&Python&C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 设置当前节点的值为下一个 日期 [LeetCode] ...
- 【LeetCode】349. Intersection of Two Arrays 解题报告(Java & Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 方法一:Java解法,HashSet 方法二:Pyt ...
- 【LeetCode】136. Single Number 解题报告(Java & Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 异或 字典 日期 [LeetCode] 题目地址:h ...
随机推荐
- 【GS模型】使用R包sommer进行基因组选择的GBLUP和RRBLUP分析?
目录 简介 GS示例代码 简介 R包sommer内置了C++,运算速度还是比较快的,功能也很丰富,可求解各种复杂模型.语法相比于lme4包也要好懂一些. 建议查看文档:vignette("v ...
- mongodb-to-mongodb
python3用于mongodb数据库之间倒数据,特别是分片和非分片之间. 本项目是一个集合一个集合的倒. 参考了logstash,对于只增不减而且不修改的数据的可以一直同步,阻塞同步,断点同步.改进 ...
- 在C++的map类型中按value排序
1.将map转化为vector类型 2.使用sort函数对vector进行排序,写出compare比较器函数 3.比较器中指明按照第几个元素来排序 1 #include <iostream> ...
- 巩固java第四天
巩固内容: HTML 元素 HTML 文档由 HTML 元素定义. HTML 元素 开始标签 * 元素内容 结束标签 * <p> 这是一个段落 </p> <a href= ...
- Shell 指定行处理head、tail、sed
目录 Shell 指定行处理 head.tail.sed head 前几行 tail sed 删除.替换.新增.选取 案例 删除行 插入行 查看某行 替换某行 部分数据的查找并替换 读写操作 Shel ...
- Fllin(七)【Flink CDC实践】
目录 FlinkCDC 1.简介 2.依赖 3.flink stream api 4.flink sql 5.自定义反序列化器 6.打包测试 FlinkCDC 1.简介 CDC是Change Data ...
- Lombok安装及Spring Boot集成Lombok
文章目录 Lombok有什么用 使用Lombok时需要注意的点 Lombok的安装 spring boot集成Lombok Lombok常用注解 @NonNull @Cleanup @Getter/@ ...
- Linux学习 - 文件系统属性chattr权限
change file attributes on 啊linux file system 1 功能 可以防止误操作 2 chattr命令格式 chattr [+-=] [选项] 文件或目录名 + 增加 ...
- Linux基础命令---uptime
uptime uptime指令用来显示系统运行多长时间.有多少用户登录.系统负载情况. 此命令的适用范围:RedHat.RHEL.Ubuntu.CentOS.Fedora.SUSE.openSUSE. ...
- Linux:sqlplus
[oracle@hb shell_test]$ cat echo_time #!/bin/sh 一.最简单的调用sqlplus sqlplus -S "sys/unimas as sysdb ...