leetcode php,学习猿地-php 解题leetcode 282 移动零

题目描述

leetcode 282 问题,数组问题

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

示例:

输入: [0,1,0,3,12] 输出: [1,3,12,0,0]

说明:

必须在原数组上操作,不能拷贝额外的数组。

尽量减少操作次数

测试样例

输入: [0,1,0,3,12]

输出: [1,3,12,0,0]

输入: [0,1]

输出: [1,0]

输入: []

输出: []

方案

方案1:

做两次遍历,第一次遍历,假若有m个非0元素,将所有非0元素填充到数组前m个位置,记录下数量m。

第二次遍历从m开始到数组最后一个n,全部填充0;

代码实现

php

function moveZeroes($nums){

$len = count($nums);

$flag = 0;

for($i=0;$i

if($nums[$i] != 0) {

$nums[$flag] = $nums[$i];

$flag++;

}

}

for($i=$flag;$i

$nums[$i] = 0;

}

return $nums;

}

js

var moveZeroes = function(nums) {

var zIndex = 0;

var len = nums.length;

for(var i=0;i

if(nums[i]!=0){

var tmp = nums[i];

nums[i] = nums[zIndex];

nums[zIndex] = tmp;

zIndex++;

}

}

};

方案2:

进行一次遍历,调换0元素与非0元素之间的位置,添加一个游标$flag,记录数组中第一个0元素的位置,如果$i个元素不等于0,$nums[$flag]与$nums[$i]位置互换,$flag 加一,遍历完后,所有的非0元素替换到数组的前面。

[0........$flag)这个区间是非0元素

[$flag.....$i)这个区间是0元素

[$i.......$n-1]待遍历元素

遍历演示

[0,1,0,3,12] $i = 0 $flag=0;

[1,0,0,3,12] $i = 1 $flag=1;

[1,0,0,3,12] $i = 2 $flag=1;

[1,3,0,0,12] $i = 3 $flag=2;

[1,3,12,0,0] $i = 4 $flag=3;

代码:

php

//交换函数

function _swap(&$arr,$a,$b){

$arr[$a] ^= $arr[$b];

$arr[$b] ^= $arr[$a];

$arr[$a] ^= $arr[$b];

}

function moveZeroes($nums){

$len = count($nums);

$flag = 0;

for($i=0;$i

if ($nums[$i] != 0) {

if ($i != $flag) {

_swap($nums, $i, $flag);

}

$flag++;

}

}

return $nums;

}

js

var moveZeroes = function(nums) {

//交换函数

var _swap = function(arr,a,b){

arr[a] ^= arr[b];

arr[b] ^= arr[a];

arr[a] ^= arr[b];

}

var flag = 0;

var len = nums.length;

for(var i=0;i

if(nums[i]!=0){

if(i!=flag){

_swap(nums,i,flag)

}

flag++;

}

}

};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值