網(wǎng)頁設(shè)計與網(wǎng)站開發(fā)第三版課后答案百度提問登錄入口
方法一 splice:
通過數(shù)組的slice方法,碰到 0就在后面加一個0,最后截取原數(shù)組的長度,舍棄后面部分。
但這樣做是違反了題目的要求,不要在超過該數(shù)組長度的位置寫入元素。
var duplicateZeros = function(arr) {var len = arr.lengthfor(let i=0;i<len;i++){if(arr[i]===0){arr.splice(i,0,0)i++}}arr.splice(len)
};
消耗時間和內(nèi)存情況:
方法二 ——方法一優(yōu)化:
?不直接操作arr,將arr的字符串形式賦值給str,對str按照要求進(jìn)行修改,然后將str按位賦值給arr
這種方法也是算取巧
var duplicateZeros = function(arr) {var str = arr.join('').replaceAll('0','00')for(var i=0;i<arr.length;i++){arr[i]=str[i]}
};
消耗時間和內(nèi)存情況:
方法三 兩次遍歷+雙指針( 時間復(fù)雜度O(n) 空間復(fù)雜度O(1) )
用實例來說明:
arr?=[0,1,7,6,0,2,0,7],arr里面雖然有3個0,但是前面兩個0被復(fù)寫完之后第三個0就被舍棄了,所以第一次遍歷記錄arr里有多少個0能被復(fù)寫,并記錄最后一個能被復(fù)寫的0的位置
雙指針left和right,right指向數(shù)組的末尾,left指向能被保留下來的最后一個元素,那么(left,right]之間的元素都是要被舍棄的。
如果left指向的是非0元素,那么就把left指向的元素移動到right處,left、right都往前移動一位
如果left指向的是0元素,則看這個0是不是能被復(fù)寫的0,如果不是就按照非0元素處理,如果是則right以及right-1的位置都要被賦值為0
兩次單層循環(huán),沒有使用其他數(shù)組或字符串,這應(yīng)該才是最為理想的解法
var duplicateZeros = function(arr) {var right = arr.length-1,left=0,countfor(let i=0;i<arr.length;i++){if(arr[i]===0 && right-i>left){left++count=i} }left = right-leftwhile(left>=0){if(arr[left]===0 && left<=count){arr[right]=0right--arr[right]=0right--left--}else{arr[right]=arr[left]right--left--}}
};
消耗時間和內(nèi)存情況: