网站用什么语言,网页截图快捷键设置,做网络调查的网站赚钱,福田公司名称及地址方法一 splice#xff1a;
通过数组的slice方法#xff0c;碰到 0就在后面加一个0#xff0c;最后截取原数组的长度#xff0c;舍弃后面部分。
但这样做是违反了题目的要求#xff0c;不要在超过该数组长度的位置写入元素。
var duplicateZeros function(arr) {var le…
方法一 splice
通过数组的slice方法碰到 0就在后面加一个0最后截取原数组的长度舍弃后面部分。
但这样做是违反了题目的要求不要在超过该数组长度的位置写入元素。
var duplicateZeros function(arr) {var len arr.lengthfor(let i0;ilen;i){if(arr[i]0){arr.splice(i,0,0)i}}arr.splice(len)
};
消耗时间和内存情况 方法二 ——方法一优化 不直接操作arr将arr的字符串形式赋值给str对str按照要求进行修改然后将str按位赋值给arr
这种方法也是算取巧
var duplicateZeros function(arr) {var str arr.join().replaceAll(0,00)for(var i0;iarr.length;i){arr[i]str[i]}
};
消耗时间和内存情况 方法三 两次遍历双指针 时间复杂度O(n) 空间复杂度O(1)
用实例来说明
arr [0,1,7,6,0,2,0,7]arr里面虽然有3个0但是前面两个0被复写完之后第三个0就被舍弃了所以第一次遍历记录arr里有多少个0能被复写并记录最后一个能被复写的0的位置
双指针left和rightright指向数组的末尾left指向能被保留下来的最后一个元素那么leftright]之间的元素都是要被舍弃的。
如果left指向的是非0元素那么就把left指向的元素移动到right处left、right都往前移动一位
如果left指向的是0元素则看这个0是不是能被复写的0如果不是就按照非0元素处理如果是则right以及right-1的位置都要被赋值为0
两次单层循环没有使用其他数组或字符串这应该才是最为理想的解法
var duplicateZeros function(arr) {var right arr.length-1,left0,countfor(let i0;iarr.length;i){if(arr[i]0 right-ileft){leftcounti} }left right-leftwhile(left0){if(arr[left]0 leftcount){arr[right]0right--arr[right]0right--left--}else{arr[right]arr[left]right--left--}}
};
消耗时间和内存情况