javascript笔试题(4) js模板

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年春季阿里巴巴实习生笔试)

题目:给定如下的一段字符串

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值