Heim > Fragen und Antworten > Hauptteil
Die Frage, die ich gestellt habe, betraf das Entfernen von Duplikaten aus einem Array.
Der Fragestamm https://leetcode.com/problems...
Ich habe es akzeptiert, als ich es gemacht habe, aber mir fiel plötzlich eine Frage ein: Wie kann ich das? Tun Sie es, ohne ein neues zu öffnen? Im Falle eines Arrays die Deduplizierung des ursprünglichen Arrays abschließen und das geänderte Array zurückgeben? ?
Das Folgende ist der Code, den ich übergeben habe
var removeDuplicates = function(nums) {
if(nums === null || nums.length === 0) return 0;
if(nums.length == 1) return 1;
var count = 0;
for(var i = 1 ; i < nums.length ; i++){
if(nums[count] != nums[i]){
count++;
nums[count] = nums[i];
}
}
return ++count;
};
Am Anfang dachte ich darüber nach, nums.length am Ende zurückzugeben, aber nachdem ich sorgfältig darüber nachgedacht hatte, wurde mir klar, dass dies kein Scherz war. Nachdem ich es auf diese Weise geschrieben hatte, musste ich die ursprünglichen unveränderten Zahlen zurückgeben, also begann ich darüber nachzudenken Ich weiß nicht, wie man dieses geänderte Array zurückgibt, aber nachdem ich viele Artikel über das Entfernen von Array-Duplikaten gelesen habe, habe ich immer noch keine Antwort gefunden. ! ! !
阿神2017-06-12 09:30:19
就地去重的思路很简单
建立一个以每个数组元素为 key 的 hash 对象
每个元素通过 hash 判断其是否已经存在与数组中
如存在,将该元素删除
遍历完成后,移动数组元素,填补空位
由于移动数组元素是一个高耗操作(例如 N 长数组被均匀挖掉 N/2 个空,那么这时由后往前移动元素的时间复杂度能到 N^2 的水平),并且这个算法不符合当前的 immutable 趋势,因此这种做法是吃力不讨好的,一般场景下也没有必要去做。
怪我咯2017-06-12 09:30:19
这道题不是单纯的数组去重,这个数组是排好序的,这就跟乱序数组去重是不一样的。
有序数组去重,相同元素会分布在一起,所以只需要在遍历过程中判断后一个元素跟前一个元素是否相同,来进行去重。
这道题当时我的 AC
var removeDuplicates = function(nums) {
var j = 0;
var i = 0;
for (; i < nums.length; i++) {
if (nums[j] !== nums[i]) {
nums[++j] = nums[i];
}
}
return j+1;
};