当前位置:网站首页>LeetCode 283. 移动零(简单、数组)
LeetCode 283. 移动零(简单、数组)
2022-08-02 06:49:00 【碳烤小肥羊。。。】
活动地址:CSDN21天学习挑战赛
题目描述:给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
请注意 ,必须在不复制数组的情况下原地对数组进行操作。
示例 1:
输入: nums = [0,1,0,3,12]
输出: [1,3,12,0,0]
示例 2:
输入: nums = [0]
输出: [0]
题目解析:
方法一:双指针法(自己当初想的方法)
1、遍历数组;
2、如果num[i] != 0 继续进行遍历,如果num[i]==0进行如下操作;
3、先设置两个指针,left_pointer和left_move。left_pointer指向当前数组元素为0的下标即为i,left_move指向其后一位元素下标;
4、从当前left_move开始判断当前元素是否为0,如果为零,left_move继续向后移动直到扎到第一个不为0的元素为止;
5、交换num[left_pointer ] 与 nums[left_move]的值 ,继续上述操作,直到循环结束
方法二:双指针方法(参考网上题解)
我们定义两个指针,i指针和k指针,i指针用来遍历整个nums数组,k指针用来放置nums数组元素。然后将非0元素按照原有的相对顺序都放置到nums数组前面,
剩下的位置都置为0。这样我们就完成了0元素的移动,同时也保持了非0元素的相对顺序。
具体过程如下:
1、定义两个指针i和k,初始化i = 0,k = 0。
2、i指针向后移动,遍整个nums数组,如果 nums[i] != 0,也就是说遇到了非0元素,此时我们就将nums[i]元素放置到nums[k]位置,同时k++后一位。
3、最后将k位置之后的元素都赋值为0。
作者:lin-shen-shi-jian-lu-k
链接:https://leetcode-cn.com/problems/move-zeroes/solution/283-yi-dong-ling-shuang-zhi-zhen-zuo-fa-6wmvs/
代码实现:
import java.util.Arrays;
public class MoveZeros {
public static void main(String[] args) {
int[] nums = {
0, 1, 0,0, 3, 12, 15, 23, 0, 19, 0};
moveZeroes1(nums);
System.out.println(Arrays.toString(nums));
}
// 方法1: 双指针法1
public static void moveZeroes1(int[] nums) {
// 1. 如果数组为空或者数组的长度为1结束方法
if (nums == null || nums.length == 1) {
return;
}
// 2. 遍历数组进行查找
for (int i = 0; i < nums.length; i++) {
// 2.1 找到数组元素值为0的元素
if(nums[i] == 0){
// 2.2 声明两个变量
int left_pointer = i, left_move = i + 1;
while (left_move < nums.length && nums[left_move] == 0){
left_move++;
}
if(left_move >= nums.length){
// 后面的元素都为0可以退出了
break;
}else {
// 交换元素
int temp = nums[left_move];
nums[left_move] = nums[left_pointer];
nums[left_pointer] = temp;
}
}
}
}
// 方法2: 双指针法2
public static void moveZeroes2(int[] nums){
// 1. 如果数组为空或者数组的长度为1结束方法
if (nums == null || nums.length == 1) {
return;
}
// 2. 设置双指针
int k = 0; // 记录数组中非0的个数
for(int i = 0; i < nums.length; i++){
if(nums[i] != 0){
nums[k++] = nums[i];
}
}
int k_zero = nums.length -k; // 记录数组中0的个数
for(int i = nums.length-1; k_zero != 0; i--){
nums[i] = 0;
k_zero--; // 每次k都要进行减一操作
}
}
}
原文链接:https://leetcode-cn.com/problems/move-zeroes/
边栏推荐
- Gradle系列——Gradle插件(基于Gradle文档7.5)day3-2
- 封装class类一次性解决全屏问题
- abaqus如何快速导入其他cae文件的assembly?
- Swagger的简单介绍,集成,以及如何在生产环境中关闭swagger,在测试和开发环境中自动打开
- CAT1 4G+Ethernet development board Tencent cloud mobile phone WeChat applet display temperature and delivery control
- 【机器学习】实验1布置:基于决策树的英雄联盟游戏胜负预测
- 笔记本开机黑屏提示:ERROR 0199:System Security-Security password retry count exceeded
- Two good php debug tutorials
- How does abaqus quickly import the assembly of other cae files?
- 数据库概论-MySQL的数据表的基本操作
猜你喜欢

Neo4j 中文开发者月刊 - 202207期

根据一个字段的内容去更新另一个字段的数据,这样的sql语句该怎么样书写

(2022牛客多校五)B-Watches(二分)

How does abaqus quickly import the assembly of other cae files?

结构体大小计算--结构体内存对齐

在VMware上安装Metasploitable2

C#重点问题之Struct和Class的异同
![[Dataset][VOC] Eyewear dataset 6000 in VOC format](/img/66/37f76d9ce5d5f68d6ea0e18710fa04.png)
[Dataset][VOC] Eyewear dataset 6000 in VOC format

解决:- SPY: No data found for this date range, symbol may be delisted报错

新产品立大功 伟世通第二季度营收双增
随机推荐
【暑期每日一题】洛谷 P1192 台阶问题
Facebook社媒营销的5大技巧,迅速提高独立站转化率!
PMP新考纲通关秘籍,告别抓瞎
(2022牛客多校五)D-Birds in the tree(树形DP)
Swagger的简单介绍,集成,以及如何在生产环境中关闭swagger,在测试和开发环境中自动打开
吃透Chisel语言.30.Chisel进阶之通信状态机(二)——FSMD:以Popcount为例
CAT1 4G+Ethernet development board Tencent cloud mobile phone WeChat applet display temperature and delivery control
【暑期每日一题】洛谷 P1551 亲戚
SimpleChannelInboundHandler使用总结
MPLS的相关技术
[Dataset][VOC] Eyewear dataset 6000 in VOC format
笔记本开机黑屏提示:ERROR 0199:System Security-Security password retry count exceeded
“蔚来杯“2022牛客暑期多校训练营5,签到题KBGHFCD
LeetCode SQL 197. 上升的温度
awk语法-01-基础语法(命令、选项、内部变量)
实例029:反向输出
Wuhan 2022 organizing of the high-performance computing added new ecological development of high-performance computing
实例028:递归求等差数列
【机器学习】实验4布置:AAAI会议论文聚类分析
typescript 'props' is declared but its value is never read solution