-
Notifications
You must be signed in to change notification settings - Fork 3.3k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
第 82 题:算法题「移动零」,给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。 #132
Comments
新增:解决了有连续的0无法实现功能的问题。 function zeroMove(array) {
let len = array.length;
let j = 0;
for(let i=0;i<len-j;i++){
if(array[i]===0){
array.push(0);
array.splice(i,1);
i --;
j ++;
}
}
return array;
} |
const moveZore = (arr) => {
let n = 0
arr.forEach((item, index) => {
if (item === 0){
arr.splice(index, 1)
n++;
}
})
arr.push(...(new Array(n)).fill(0))
return arr;
} |
let nums = [0,1,0,3,12];
|
let arr = [1,2,3,0,7,0] |
|
已修正连续多个 0 时的 bug let nums = [0, 0, 0, 1, 0, 3, 12];
console.log(moveZeroToLast(nums)); // [1, 3, 12, 0, 0, 0, 0]
function moveZeroToLast(arr) {
let len = arr.length;
return arr.filter(it => it === 0 ? len-- && false : true)
.concat(Array(arr.length - len).fill(0));
} |
上面所有的再循环中,先 splice 在 push 的方法都是有问题的 因为,当 |
const array = [2, 0, 1, 4, 0, 0, 0, 5, 7, 8];
array.sort((fir, sec) => {
return fir === 0;
})
// array = [ 2, 1, 4, 5, 7, 8, 0, 0, 0, 0 ]
这里有个问题,首元素为0无效,不知道为什么,求教
const array = [0, 2, 0, 1, 4, 0, 0, 0, 5, 7, 8];
array.sort((fir, sec) => {
return fir === 0;
})
console.log(array);
// array = [ 8, 7, 1, 4, 2, 5, 0, 0, 0, 0, 0 ] |
let moveZero = (arr) => { return arr |
最优解法想到好几个方法,楼上都写出来了,但是我觉得这些都不是最优解法,既然是算法题,自然是以算法的思维去解。 function moveZeroToLast(arr) {
let index = 0;
for (let i = 0, length = arr.length; i < length; i++) {
if (arr[i] === 0) {
index++;
} else if (index !== 0) {
arr[i - index] = arr[i];
arr[i] = 0;
}
}
return arr;
} |
那个这个问题怎么解决?没头绪 |
const moveZeroToEnd = (arr) => {
let index = 0
let current = 0
while(index < arr.length) {
if (arr[current] === 0) {
arr.splice(current, 1)
arr.push(0)
} else {
current++
}
index++
}
return arr
} |
//倒序循环可避免
const arr = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 1, 9, 9, 9, 0, 0, 0, 0, 1, 0, 3, 12, 0, 0, 0, 0];
const len = arr.length;
console.log(len)
for (let i = len; i >= 0; i--) {
if (arr[i] === 0) {
arr.splice(i, 1);
arr.push(0)
}
}
console.log(arr) |
为什么倒序可以解决这个办法 |
因为待处理的数据索引没有变。https://www.jianshu.com/p/77247e9e1849 |
思路:双指针
function moveZero(arr) {
let i = 0
let j = 0
while (j < arr.length) {
if (arr[i] !== 0) {
i++
} else if (arr[j] !== 0) {
;[arr[i], arr[j]] = [arr[j], arr[i]]
i++
}
j++
}
} 时间复杂度O(n),n是数组长度,空间复杂度O(1) |
//最后有啥办法不循环么,直接截取放最后
var arr = [0,1,0,3,12,0,89,0,8,0] ;
function ss (arr){
arr.sort((a,b)=>{
return a-b
});
let len = arr.lastIndexOf(0) +1;
arr.splice(0,len);
for (let i=0;i<len;i++){
arr.push(0)
}
console.log(arr)
}
ss(arr) |
// 正序循环方案
// 由于splice会将nums.length - 1,所以让数组下标自减,强制回溯到上一个已操作的元素
const moveZeroToEnd = (nums) => {
let length = nums.length
for (let i = 0; i < nums.length; i++) {
let el = nums[i]
if (el === 0) {
nums.splice(i, 1)
i--
}
}
let tmpAry = new Array((length - nums.length)).fill(0)
return [...nums, ...tmpAry]
}
moveZeroToEnd([1,2,0,0,0,0,0,0,3,0,4]) |
思路是把0剔除出来,然后再塞进去- - function moveZero(arr) {
let num = 0
let index = -1
while ((index = arr.indexOf(0)) > -1) {
num++
arr.splice(index, 1)
}
while (num--) {
arr.push(0)
}
} |
let or = [0, 1, 0, 3, 12] |
function move (arr) { |
|
原地交换,没有用多余的数组。应该是O(n)。 |
这个我在 chrome 上试的时候无法排序,在 safari 上倒是可以按照逻辑输出 @wz71014q |
还用上面的方法的话,如果元素为0,可以把正在循环的索引减 1 |
const array = [0, 2, 0, 1, 4, 0, 0, 0, 5, 7, 8]; 这样试试?
|
可以了,谢啦 @lo1412 |
clock in |
思路:
const result = (arr) => arr.filter(Boolean).concat([...Array(arr.length - arr.filter(Boolean).length).fill(0)])
result([0,1,0,3,0,12,0]) // [1, 3, 12, 0, 0, 0, 0] |
@kingstone3 我用node运行的是可以,后面放到chrome果然结果不一样。。。没有safari。。。没有试具体结果 // 换成这样后,在chrome第一次是输出全部相反的顺序,再运行一次sort,才会把顺序变回来
const array = [0, 2, 0, 1, 4, 0, 0, 0, 5, 7, 8];
array.sort((fir, sec) => {
return (fir === 0) ? 1 : -1
}) |
这是来自QQ邮箱的假期自动回复邮件。您好,我最近正在休假中,无法亲自回复您的邮件。我将在假期结束后,尽快给您回复。
|
这是来自QQ邮箱的假期自动回复邮件。
您好,我最近正在休假中,无法亲自回复您的邮件。我将在假期结束后,尽快给您回复。
|
|
这是来自QQ邮箱的假期自动回复邮件。您好,我最近正在休假中,无法亲自回复您的邮件。我将在假期结束后,尽快给您回复。
|
这是来自QQ邮箱的假期自动回复邮件。
您好,我最近正在休假中,无法亲自回复您的邮件。我将在假期结束后,尽快给您回复。
|
const moveZeroEnd = numList => {
const end = numList.length;
for (let i = 0, cursor = 0 ;i < end; i++) {
if (cursor >= end) {
numList[i] = 0;
continue;
}
for (; cursor < end && numList[cursor] === 0; cursor++);
numList[i] = numList[cursor];
cursor++;
}
}
const inputList = [0,1,0,3,12];
moveZeroEnd(inputList);
console.log(inputList);
const inputList1 = [0, 0, 0, 0, 1, 2, 3, 0, 4];
moveZeroEnd(inputList1);
console.log(inputList1); |
这是来自QQ邮箱的假期自动回复邮件。您好,我最近正在休假中,无法亲自回复您的邮件。我将在假期结束后,尽快给您回复。
|
这是来自QQ邮箱的假期自动回复邮件。
您好,我最近正在休假中,无法亲自回复您的邮件。我将在假期结束后,尽快给您回复。
|
[12,4,8,0,9,78,67,0,45,98,33,00,23,767,8878,66,90,-87,8,0,67,65].map(f => f==0?Infinity:f).sort((a,b) => a-b).map(e => e==Infinity?0:e)
在 2023-02-25 09:11:39,"Stephen-Monster" ***@***.***> 写道:
这是来自QQ邮箱的假期自动回复邮件。
您好,我最近正在休假中,无法亲自回复您的邮件。我将在假期结束后,尽快给您回复。
—
Reply to this email directly, view it on GitHub, or unsubscribe.
You are receiving this because you commented.Message ID: ***@***.***>
|
答案中有很多用到splice, 其实是不太符合题意的,毕竟一个splice会移动所有0后面的数字。 function bubble(arr) {
const len = arr.length;
for(let i = 0, step = 1; i + step < len;) {
let j = i + step;
if (arr[i] === 0) {
if (arr[j] !== 0) {
[arr[i], arr[j]] = [arr[j], arr[i]]
i++
} else {
step ++
}
} else {
i++
}
}
console.log(arr)
}
bubble([12,4,8,0,9,78,67,0,45,98,33,00,23,767,8878,66,90,-87,8,0,67,65]) |
插入排序原理 function moveZeroToEnd(arr) {
let len = arr.length;
for (let i = len - 2; i >= 0; i--) {
let tmp = arr[i]
let j = i + 1;
while ((j < len) && tmp === 0) {
arr[j - 1] = arr[j]
j++;
}
arr[j - 1] = tmp
console.log(arr);
}
return arr
} |
|
这是来自QQ邮箱的假期自动回复邮件。您好,我最近正在休假中,无法亲自回复您的邮件。我将在假期结束后,尽快给您回复。
|
这是来自QQ邮箱的假期自动回复邮件。
您好,我最近正在休假中,无法亲自回复您的邮件。我将在假期结束后,尽快给您回复。
|
const moveToEnd = (arr) => { |
|
这是来自QQ邮箱的假期自动回复邮件。您好,我最近正在休假中,无法亲自回复您的邮件。我将在假期结束后,尽快给您回复。
|
这是来自QQ邮箱的假期自动回复邮件。
您好,我最近正在休假中,无法亲自回复您的邮件。我将在假期结束后,尽快给您回复。
|
let arr = [0, 1, 0, 3, 12, 0, 9, 8, 6, 0, 1] |
这是来自QQ邮箱的假期自动回复邮件。您好,我最近正在休假中,无法亲自回复您的邮件。我将在假期结束后,尽快给您回复。
|
这是来自QQ邮箱的假期自动回复邮件。
您好,我最近正在休假中,无法亲自回复您的邮件。我将在假期结束后,尽快给您回复。
|
let len = nums.length } |
这是来自QQ邮箱的假期自动回复邮件。您好,我最近正在休假中,无法亲自回复您的邮件。我将在假期结束后,尽快给您回复。
|
这是来自QQ邮箱的假期自动回复邮件。
您好,我最近正在休假中,无法亲自回复您的邮件。我将在假期结束后,尽快给您回复。
|
这是来自QQ邮箱的假期自动回复邮件。您好,我最近正在休假中,无法亲自回复您的邮件。我将在假期结束后,尽快给您回复。
|
这是来自QQ邮箱的假期自动回复邮件。
您好,我最近正在休假中,无法亲自回复您的邮件。我将在假期结束后,尽快给您回复。
|
|
一个循环就结束 很简单 const fn = (arr) => {
let count = 0;
for (let i in arr) {
if (arr[i] === 0) {
count++;
} else {
arr[i - count] = arr[i];
arr[i] = 0;
}
}
}; |
这是来自QQ邮箱的假期自动回复邮件。您好,我最近正在休假中,无法亲自回复您的邮件。我将在假期结束后,尽快给您回复。
|
这是来自QQ邮箱的假期自动回复邮件。
您好,我最近正在休假中,无法亲自回复您的邮件。我将在假期结束后,尽快给您回复。
|
示例:
说明:
必须在原数组上操作,不能拷贝额外的数组。
尽量减少操作次数。
The text was updated successfully, but these errors were encountered: