我正在解決leetcode 挑戰,但我不確定為什么我的答案沒有被接受。我相信我誤解了一些簡單的事情。所有細節都包含在這里。也在下面發帖。
問題:
對于這個給定的挑戰從排序陣列中洗掉重復項
即使我似乎對基線測驗有正確的答案,我的解決方案也只回傳一個空陣列。關于挑戰規則的實施,我是否忽略了什么?Splice 會在適當的位置編輯元素.... 所以我認為這沒問題。
任何建議,將不勝感激。
var removeDuplicates = function(nums) {
const map = new Map();
let count = 0;
nums.forEach((item, i) => {
if (map.get(item) === undefined){
map.set(item, i);
} else if (map.get(item) !== undefined) {
nums.splice(i, 1);
nums.push('_');
count ;
}
});
return count;
};
uj5u.com熱心網友回復:
你不應該從一個陣列的拼接專案,你是迭代,因為這樣的迭代是基于遞增的指標,洗掉會導致陣列值轉移到左側。所以這種雙重效果會讓你跳過陣列值。
此外,您應該避免將所有拼接在一起,因為它表示 O(n) 時間復雜度。
此外,作業說“不要分配額外的空間......你必須這樣做......使用 O(1) 額外記憶體。” ,因此在 a 中收集值Map不是您應該做的。由于輸入陣列已排序,因此您也確實不需要此映射。
而是使用兩個索引:一個用于讀取值,另一個用于寫入值。當有重復時,第一個將在后者之前運行。
var removeDuplicates = function(nums) {
if (nums.length == 0) return 0;
let k = 0;
for (let value of nums) {
if (value != nums[k]) {
nums[ k] = value;
}
}
return k 1;
};
請注意,沒有必要修改length陣列的 ,正如代碼挑戰所說:
...的第一個
k元素nums應該保存最終結果。你在第一個k元素之外留下什么并不重要。
uj5u.com熱心網友回復:
移除與索引的元件i使用splice,該陣列元件移位。下一次迭代開始,您查看 index 上的元素i 1。但是隨著元素的移動,您會錯過位置上i 1的元素并i在移動后成為位置上的元素。
我認為發布正確答案對我來說是錯誤的,因為這是一個挑戰,其他參與者應該自己解決它,而不是從這里復制粘貼答案。所以我只是展示了我們使用當前解決方案可以獲得什么:
const removeDuplicates = function(nums) {
const map = new Map();
let count = 0;
nums.forEach((item, i) => {
if (map.get(item) === undefined){
map.set(item, i);
} else if (map.get(item) !== undefined) {
nums.splice(i, 1);
nums.push('_');
count ;
}
});
return count;
};
const nums = [0,0,1,1,1,2,2,3,3,4]; // Input array
const expectedNums = [0,1,2,3,4]; // The expected answer with correct length
const k = removeDuplicates(nums); // Calls your implementation
console.log(nums.join(','))
console.log(expectedNums.join(','))
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/401233.html
標籤:javascript
下一篇:如何從json檔案中提取一些資料
