前端笔试题(2017年9月)

1.给定一组数据要求找出数组中任意三个数和为0
如[-1, 0, 1, 2, -1, 4],返回[-1,-1,2][-1,0,1]
首先找出数组中所有和为0的组合:
解法一:枚举(时间复杂度O^3)
  function query(arr){
        let result = [];
        let len = arr.length;
        for(let i=0; i<len-2; i++){
            for(let j=i+1; j<len-1; j++){
                for(let k=j+1; k<len; k++){
                    if(arr[i]+arr[j]+arr[k] == 0){
                        let a = [];
                        a.push(arr[i], arr[j], arr[k]);
                        result.push(a);
                    }
                }
            }
        }
        return result;
    }

法二:三数和算法(时间复杂度(O^2))
首先要求数组必须是有序的,所以先对数组进行排序
假设数组是升序的:
i指向数组中的第一个数
j指向i后一个数
k指向数组最后一个数
如果arr[i]+arr[j]+arr[k] == 0,那么j++,k--
如果arr[i]+arr[j]+arr[k] > 0, 那么k--
如果arr[i]+arr[j]+arr[k] < 0, 那么j++
   function query(arr) {
        arr.sort(function(a,b){
            return a-b;
        })
        let result = [];
        let len = arr.length;
        for (let i = 0; i < len - 2; i++) {
            let j = i + 1;
            let k = len - 1;
            while (k > j) {
                if(arr[i]+arr[j]+arr[k] == 0){
                    let a = [];
                    a.push(arr[i], arr[j], arr[k]);
                    result.push(a);
                    j++;
                    k--;
                }else{
                    if(arr[i]+arr[j]+arr[k] > 0){
                        k--;
                    }else{
                        j++;
                    }
                }
            }
        }
        return result;
    }


由于题目要求集合类似[1,0,-1]和[-1,0,1]只能算一个解所以需要对数组进行去重处理
  function unique(result){
        let obj = {};
        let arr = [];
        result.forEach(function(item){
            item.sort(function(a,b){
                return a-b;
            });
            obj[item.join()] = 1;
        })
        keys = Object.keys(obj);
        keys.forEach(function(item){
            arr.push(item.split(","));
        })
        return arr;
    }



2.实现如下函数(具体不记得了,大致这个意思):
console.log(fun(2)(3))//6console.log(fun(3)(4)(2))//24
典型的可以用闭包实现
 function fun(x) {
        let sum = x;
        let tmp = function (y) {
            sum *= y;
            return tmp;
        }
        tmp.toString = function () {
            return sum;
        }
        return tmp;
    }


但是有一个小问题(打印的时候会连function一起打印出来不知道为什么(按理说console.log()中应该会转换类型为字符串而调用toString()才对))希望大神可以指点一下

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值