1、数组去重
(2014年春季阿里巴巴实习生笔试)
题目:有一个大数组,var a = [‘1’,’2’,’3’,…];a数组的长度是100,内容填充随机整数的字符串,请先构造此数组a,然后设计一个算法,将其内容去重。
function Random(n) {
var arr = [];
for (var i = 0; i < n; i++) {
arr[i] = parseInt(Math.random() * 100);
}
console.log(arr);
return arr;
}
//使用indexof 这里也可以使用arr2的indexOf
function DeleRepeat1(arr) {
var arr2 = [];
var len = arr.length;
for (var i = 0; i < len; i++) {
if (arr.indexOf(arr[i]) == i) {
arr2.push(arr[i])
}
}
return arr2;
}
//使用hash
function DeleRepeat2(arr) {
var arr2 = [];
var obj2 = {};
var len = arr.length;
for (var i = 0; i < len; i++) {
if (!obj2[arr[i]]) {
obj2[arr[i]] = 1;
arr2.push(arr[i]);
}
}
return arr2;
}
var arr = Random(100);
console.log(DeleRepeat1(arr));
console.log(DeleRepeat2(arr));
随机生成数组。数组去重。
上面两个方法是大神们推荐的。
- 1.为什么数组去重里一定要建立一个新数组?
我们知道js的数组有splice函数,可以删除数组中的一个值。然后我就尝试不建立新数组,循环遍历数组,当判断数组内arr.indexof(arr[i])!=i的时候,直接使用splice函数去删除第i个元素,发现结果是错的。
少删除了一些元素。
为啥捏。一想就明白了。
我当时是这么写的。
for(var i=0;i<arr.length;i++){
if(arr.indexOf(arr[i])!=i)arr.splice(i,1);
}
当我成功删除了一个元素的时候,arr.length就减一了,i位置的数被删除了,那下一个数应该还是第i个数。i不应当自增1。
写成这样才可以捏
function DeleRepeat3(arr) {
for(var i=0;i<arr.length;i++){
if(arr.indexOf(arr[i])!=i)
{
//这里i执行完自减一
arr.splice(i--,1);
}
}
return arr;
}
- 2.这三种方法哪一个性能好一些?
当然要计算一下时间复杂度了。
第一种方法:循环遍历加indexOf方法(indexOf当然也要遍历数组了)
O(n*n)时间复杂度。
第二种方法:循环遍历加hash 。hash的事件复杂度是O(1)呀。
O(n)的事件复杂度。
第三种方法:循环遍历 加 indexOf 加 splice 。好吧。这个的时间复杂度 最高。O(n*n*n)的时间复杂度。
所以,最好的数组去重方式还是hash,以空间换时间的办法。
2、正则表达式 模版匹配
(2014年春季阿里巴巴实习生笔试)
题目:给定如下的一段字符串