最近在找工作,好几次面试都问过数组去重的问题。虽然问的都不一样,但是核心思想是没有变的。
第一种是比较常规的方法
思路:
- 构建一个新的数组存放结果
- for循环中每次从原数组中取出一个元素,用这个元素循环与结果数组对比
- 若结果数组中没有该元素,则存到结果数组中
Array.prototype.unique1 = function(){ var res = [this[0]]; for(var i = 1; i < this.length; i++){ var repeat = false; for(var j = 0; j < res.length; j++){ if(this[i] == res[j]){ repeat = true; break; } } if(!repeat){ res.push(this[i]); } } return res; } var arr = [1, 'a', 'a', 'b', 'd', 'e', 'e', 1, 0] alert(arr.unique1());
|
第二种方法比上面的方法效率要高
思路:
- 先将原数组进行排序
- 检查原数组中的第i个元素 与 结果数组中的最后一个元素是否相同,因为已经排序,所以重复元素会在相邻位置
- 如果不相同,则将该元素存入结果数组中
Array.prototype.unique2 = function(){ this.sort(); var res = [this[0]]; for(var i = 1; i < this.length; i++){ if(this[i] !== res[res.length - 1]){ res.push(this[i]); } } return res; } var arr = [1, 'a', 'a', 'b', 'd', 'e', 'e', 1, 0] alert(arr.unique2());
|
第二种方法也会有一定的局限性,因为在去重前进行了排序,所以最后返回的去重结果也是排序后的。如果要求不改变数组的顺序去重,那这种方法便不可取了。
第三种方法(推荐使用)
思路:
- 创建一个新的数组存放结果
- 创建一个空对象
- for循环时,每次取出一个元素与对象进行对比,如果这个元素不重复,则把它存放到结果数组中,同时把这个元素的内容作为对象的一个属性,并赋值为1,存入到第2步建立的对象中。
说明:至于如何对比,就是每次从原数组中取出一个元素,然后到对象中去访问这个属性,如果能访问到值,则说明重复。
Array.prototype.unique3 = function(){ var res = []; var json = {}; for(var i = 0; i < this.length; i++){ if(!json[this[i]]){ res.push(this[i]); json[this[i]] = 1; } } } var arr = [112,112,34,'你好',112,112,34,'你好','str','str1']; alert(arr.unique3());
|
下面我遇到的面试题
注释掉的是常规写法
function (str){ var arr = str.split(""); var result = [], hash = {}; for(var i=0,elem; (elem = arr[i]) != null; i++){ if(!hash[elem]){ result.push(elem); hash[elem] = 1 }else{ hash[elem] ++; } } for(var n=0,elem; (elem = result[n]) != null ; n++){ var reg = new RegExp(result[n], "g"); hash[elem] > 1 ? str = str.replace(reg, ")") : str = str.replace(reg, "("); } return str; } console.log(test('abcb'));
|
这个是帮朋友写的一个题
function change(str, key){ var arr = str.split(''); key = key.split(''); var hash = {}; for(var i=0,elem; (elem = key[i]) != null; i++){ if(!hash[elem]) hash[elem] = true } for(var n=0, elem; (elem = arr[n]) != null; n++){ if(hash[elem]) arr.splice(n,1); } return arr.join(""); } console.log(change("they are students ", "aeous"));
|