大疆

2020大疆笔试题 08-04

题一

假设每喝一杯咖啡(喝咖啡时间忽略不计)就能让自己debug效率提高A倍,一小时内重复喝没用,最多只能喝X杯(太多晚上睡不着),并且为了可持续发展,每天最多只能专注8个小时的工作时间。在没喝咖啡的状态下解决每个bug所需要的时间为t1,t2,t3,…,tN分钟。

输入:多组测试数据。每组测试数据如下
第一行输入三个整数:N、A、X,分别代表需要解决的bug数量、喝咖啡之后效率提升的倍数、一天最多可以喝掉的咖啡数
第二行输入N个整数,表示在不喝咖啡的情况下解决这些bug所需的时间t1, t2, …, tN
输出:如果能在八小时内解决这些bug(如果时间为小数,向上取整),输出解决bug的时间,否则输出0

case:input:
8 2 8
60 60 60 60 60 60 60 60
4 3 3
333 77 100 13

output:
240
175


看题目都蒙了,做题一慌就废了

分析:一杯咖啡持效时间为60分钟,提升效率为A倍,那么X杯咖啡能维持X*60*A分钟;而在不喝咖啡的情况下,改bug共需要sum分钟;若X*60*A > sum,在X杯咖啡的有效时间内可以把bug改完,那么实际改bug需要的时间就是Math.ceil(sum/A);若X*60*A <= sum,X杯咖啡的有效时间X*60*A不足够我们改完bug,也就是除了X杯咖啡的有效时间X*60*A,我们还需要sum-X*60*A分钟没有咖啡作用力的时间,所以共需要X*60+sum-X*60*A的时间。

while(line = read_line()){
    line = line.split(' ');
    line = line.map(item=>{return parseInt(item)});
    var N = line[0],
        A = line[1],
        X = line[2];
    line = read_line();
    line = line.split(' ');
    var sum = 0;
    line.forEach(item=> sum += parseInt(item));
    var coffeeTime = 60*A*X;
    var res;
    if(coffeeTime >= sum){
        res = Math.ceil(sum / A);
    }
    else{
        res = X + sum-coffeeTime;
    }
    if(res > 480){
        print(0)
    }
    else{
        print(res)
    }
}

题二

输入:多组测试数据
第一行输入两个整数T、N,分别代表钱数和零食种类数。
接下来的N行,每行输入三个整数ai, bi, ci(1 <= i <= N) ,代表零食的价格、零食的满意度、零食的数量
输出:求出最大满意度

case:input
100 2
1 1 1
1 1 1
100 3
26 100 4
5 1 4
5 2 2

output
2
306


0-1背包问题求解,比普通的0-1背包问题复杂,题目给出了三个条件:零食价格,零食满意度,零食数量。这里把它看成两个条件:零食价格,零食满意度,把零食数量算到零食种类中去,然后再用常见的0-1背包 动态规划方法来求解。

赛马网JS 编译

while(line = read_line()){
    // 循环读取“接下来的M行”
    line = line.split(' ');
    var N = parseInt(line[0]),
        M = parseInt(line[1]);
    var prices = [],values = [];
    for(var i=0;i<M;i++){
        line = read_line();
        line = line.split(' ');
        line = line.map(item=>{return parseInt(item)});
        for(var j=0;j<line[2];j++){
            prices.push(line[0]);
            values.push(line[1]);
        }
    }
    //拿到数据后  用0-1背包问题求解
    var len = prices.length;

    var dp = new Array(len);
    for(var i=0;i<len;i++){
        dp[i] = new Array(N+1);
        dp[i].fill(0);
    }

    for(var i=0;i<=N;i++){
        if(i>=prices[0]){
            dp[0][i] = values[0];
        }
    }

    for(var j=0;j<=N;j++){
        for(var i=1;i<len;i++){
            if(prices[i]<j){
                dp[i][j] = dp[i-1][j];
            }
            else{
                dp[i][j] = Math.max(dp[i-1][j],values[i]+dp[i-1][j-prices[i]]);
            }
        }
    }

    print(dp[len-1][N])
}

2018 大疆 前端笔试

原文链接:https://blog.csdn.net/Charles_Tian/article/details/80967468

1.将浮点数点左边的数每三位添加一个逗号,如12000000.11转化为12,000,000.11?

(1)正则表达式

function commafy(num){
  return num && num.toString().replace(/\B(?=(\d{3})+\.)/g, ',');
}
console.log(commafy(1231423423.22))  //1,231,423,423.22

(2)字符串操作方法

function formatNum(num){
	var newStr = "";
	var count = 0;
	var str = num.toString(); 
	for(var i = str.indexOf(".")-1;i>=0;i--){
		if(count % 3 == 0 && count != 0){
		   newStr = str.charAt(i) + "," + newStr;
		}else{
		   newStr = str.charAt(i) + newStr; //逐个字符相接起来
		}
		count++;
	}
   	str = newStr + str.substr(str.indexOf("."));
   	return str
}

2.事件委托(给出一个ul标签和三个li标签,每个li标签各有一个id名,js通过for循环给每个li标签添加了一个click事件。问以下代码还有什么可以优化的地方?)

HTML部分:

<ul id='menu'>
	<li id='list1'>list1 was clicked</li>
	<li id='list2'>list2 was clicked</li>
	<li id='list3'>list3 was clicked</li>
</ul>

JS部分:

var list = document.getElementsByTagName('li');
for (var i = 0; i < list.length; i++) {
	list[i].onclick = function(){
		console.log(this.innerHTML)
	}
};

每添加一个事件就会耗费一部分内存,所以事件越少性能越高。
事件委托就是利用事件冒泡的原理,委托子元素的父元素去代理执行事件,所以,上述方式是添加了三个事件,而通过事件委托可只需要添加一个点击事件即可实现相同的功能

var menu = document.getElementById('menu');
menu.addEventListener('click',function(e){
	console.log(e.target.id + ' was clicked')
})

注意,e.currentTarge是指注册了事件监听器的对象,e.target是指对象里的子对象,实际触发这个事件的对象。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值