小红书2020校招前端笔试题卷三

1.、以下代码的运行结果是?()

A、321

B、123

C、213

D、312

 这是事件循环机制,因为js是单线程的,是基于事件循环的。而setTimeout函数是异步的,异步的事件会加入一个队列,会等到当前同步的任务执行完毕后,再执行setT imeout队列的任务。所以,通过设置任务在延迟0毫秒后执行,就能改变任务执行的先后顺序,延迟该任务发生,改变它所调用的函数的优先级,使之异步执行。

2.下列说法正确的是()

A、setTimeout(foo, 0) 这行代码可以等价替换为 foo()

B、使用 Object.assign(obj1, obj2) 可以实现对象的浅拷贝

C、for...in 循环可以遍历对象自身及其原型链上的可枚举属性

D、Object.keys() 可以遍历出对象原型链上的属性

for in循环是遍历对象上的每一个可枚举属性,包括原型链上面的可枚举属性,

obeject.keys()只是遍历自身的可枚举属性,不可以遍历原型链上的可枚举属性,

object.assign()对象的拷贝,用于将所有可枚举属性的值从一个或多个源对象复制到目标对象,将他返回到目标对象

3.下列结果返回 true 的是()

A、 null == undefined

B、null === undefined

C、null === null

D、 NaN == null

E、NaN === NaN

F、Infinity + 1 !== Infinity

NaA与任何不相等 ===是严格相等,会比较值和类型,null和undefined是不同种类型,但值相等

4.笔记草稿

薯队长写了一篇笔记草稿,请你帮忙输出最后内容。

 1.输入字符包括,"("    ,    ")"    和    "<"和其他字符。 

2.其他字符表示笔记内容。

 3.()之间表示注释内容,任何字符都无效。    括号保证成对出现。

 4."<"表示退格,    删去前面一个笔记内容字符。括号不受"<"影响    。 

参考代码:

#include<iostream>
#include<string>
using namespace std;


int main() {
	string str;
	getline(cin, str);
	string res;
	for (int i = 0; i < str.size(); i++) {
		if (str[i] == '(')
		{
			i++;
			int n = 1;
			while (i < str.size() && n != 0)
			{
				if (str[i] == '(')
					n++;
				if (str[i] == ')')
					n--;
				if (n == 0)
					break;
				i++;
			}
		}
		else if (str[i] == '<')
		{
			if (!res.empty())
				res.pop_back();
		}
		else {
			res.push_back(str[i]);
		}
	}
	cout << res << endl;
	return 0;
}

5.笔记精选

 薯队长写了n篇笔记,编号从1~n,每篇笔记都获得了不少点赞数。    

薯队长想从中选出一些笔记,作一个精选集合。挑选的时候有两个规则:

 1.不能出现连续编号的笔记。 

2.总点赞总数最多 

如果满足1,2条件有多种方案,挑选笔记总数最少的那种

思路:

要在一个连续的数组里面选k个数,使得这k个数的点赞最多,并且还不能选编号连续的数(比如选了nums[i],就不能选nums[i + 1],只能选nums[i + 2]........),那也就是说:要得到最大的点赞量,要看你前面是怎么选的,那既然后面的结果受前面的选择所影响,很容易联想到动态规划,因为通俗地讲,动态规划就是一个递推式,由前面推到后面,我们需要推到第n个数,从第1个数开始推。这样,我们定义dp(n + 1),dp[i]就表示选到第i个数的时候,能获得的最大点赞数。最终的dp[n]就该是需要输出的最大点赞数。

那接下来就是怎么推的问题了。首先,遇到一个数nums[i],我有两种选择:选这个数,那么意味着我前面的nums[i - 1]不能选,只能选nums[i - 2];不选这个数呢?那么意味着我可以选nums[i - 1],由于我要取最大点赞数,所以取它们俩的大者 赋值到dp[i]即可,以此类推到n。

至此,基本思路讲解完毕,现在还有一个问题,我们需要统计选了几个数。这个比较简单,选一个就+1,嘛,所以count[i] = count[i - 2] + 1; 或者 count[i] = count[i - 1],这时候应该可以理解这两句话的含义了吧,就是选与不选nums[i]的问题了。下面看代码:

#include <iostream>
#include <vector>
using namespace std;

// dp[i]: 从第一篇笔记开始选到第i篇, 所能得到的最大点赞数。
// count[i]: 此时选取的笔记数量
int main(){
    int n, val;
    cin >> n;
    vector<int> vec(n + 1, 0);
    for(int i = 1; i <= n; ++i){
        cin >> val;
        vec[i] = val;
    }
    vector<int> dp(n + 1, 0);  
    vector<int> count(n + 1, 0);
    dp[1] = vec[1];  //选第一篇笔记, 最大点赞数自然就是vec[1]
    count[1] = 1;    //选了一个数
    for(int i = 2; i <= n; ++i){
        //选了dp[i - 2], 就不能选dp[i - 1], 但可以选vec[i](不能连续)
        if(dp[i - 1] < dp[i - 2] + vec[i]){
            dp[i] = dp[i - 2] + vec[i];
            count[i] = count[i - 2] + 1;
        } else{
            //不选dp[i - 2]和vec[i]
            dp[i] = dp[i - 1];
            count[i] = count[i - 1];
        }
    }
    cout << dp[n] << ' ' << count[n] << endl;
    return 0;
}

6.倒卖战利品

在游戏中,击败魔物后,薯队长获得了N件宝物,接下来得把这些宝物卖给宝物回收员来赚点小钱。这个回收员有个坏毛病,每次卖给他一件宝 物后,之后他就看不上比这件宝物差的宝物了。在这个世界中,衡量宝物的好坏有两个维度,稀有度X和实用度H,回收员在回收一个宝物A 后,下一个宝物的稀有度和实用度都不能低于宝物A。那么薯队长如何制定售卖顺序,才能卖给回收员宝物总个数最多。 

参考代码:

参考leetcode300 中级算法 - LeetBook - 力扣(LeetCode)全球极客挚爱的技术成长平台

  #include<iostream>
 #include<vector>
 #include<algorithm>
 using namespace std;
 
 static bool cmp(vector<int> & a, vector<int> &b)
 {
     return a[0]<b[0]||(a[0]==b[0]&&a[1]<b[1]);
 }
 
 int main()
 {
     int N;
     cin>>N;
     int h, x;
     vector<vector<int>> nums;
     while(cin>>h>>x)
     {
         nums.push_back({h, x});
     }
     int ret=0;
     sort(nums.begin(), nums.end(), cmp);
     vector<int> dp;
     dp.push_back(nums[0][1]);
     for(int i=1;i<nums.size();i++)
     {
         if(nums[i][1]>=dp.back())    {dp.push_back(nums[i][1]);}
         else {int idx = lower_bound(dp.begin(), dp.end(), nums[i][1])-dp.begin(); dp[idx]=nums[i][1];}    //lower_bound:找到地一个大于或等于该数的位置
     }
     cout<<dp.size();
     return 0;
 }

 

7.请给出打印出的值:

 Tom
Tom
undefined
Michael
Person { name: 'Michael' }

第一个Tom:因为Person独立调用this指向window,将window.name改成了Tom

第二个Tom:全局下的name已改成了Tom

第三个undefined:普通函数没有返回值时返回undefined

第四个Michael:new调用this为当前实例

第五个Person { name: 'Michael' }:构造函数有返回对象以自己为主,没有返回值或者返回值不为对象类型则默认返回创建的实例对象

8.请表述以下代码的执行结果和原因:

 A.prototype
B.prototype
A
A.prototype
A.prototype

ES6中的class继承中将父类的原型对象作为了子类的原型对象的原型对象,所以B.prototype.__proto__ === A.prototype,   b.__proto__.__proto__ === A.prototype

9.请用 HTML+CSS 实现一个定宽定高元素在容器中的水平和垂直居中。

①flex

<body>

  <div class="bigBox">

    <div class="minBox"></div>

  </div>

</body>

<style>

  .bigBox {

    width: 200px;

    height: 200px;

    background-color: aqua;

    display: flex;

    justify-content: center;

    align-items: center;

  }

  .minBox {

    width: 50px;

    height: 50px;

    background-color: pink;

  }

</style>

②绝对定位

<body>

  <div class="bigBox">

    <div class="minBox"></div>

  </div>

</body>

<style>

  .bigBox {

    width: 200px;

    height: 200px;

    background-color: aqua;

    position: relative;

  }

  .minBox {

    width: 50px;

    height: 50px;

    background-color: pink;

    position: absolute;

    top: 50%;

    left: 50%;

    transform: translate(-50%, -50%);

  }

</style>

效果:

10.

function paddingNum(num) {
    let flag = num > 0 ? true : false;
    const numArr = Math.abs(num).toString().split('.');
    let right = numArr[1] === undefined ? '' : '.' + numArr[1];
    let leftArr = numArr[0].split('');
    let res = [];
    for (let i = leftArr.length - 1, count = 0; i >= 0; i--, count++) {
        if (count % 3 === 0 && i != leftArr.length - 1) res.unshift(',');
        res.unshift(leftArr[i]);
    }
    return flag ? res.join('') + right : '-' + res.join('') + right;
}
console.log(paddingNum(-12345678.789));    // -12,345,678.789

 

11.

 

function dupicatedWord(arr) {
    let map = new Map();
    arr.forEach(val => {
        map.has(val) ? map.set(val, true) : map.set(val, false);
    });
    let obj = {};
    for (let [k, v] of map) {
        obj[k] = v;
    }
    return obj;
}
console.log(dupicatedWord([1, 2, 3, 4, 2, 3, 4, 3, 4, 4]));  
   // {1: false, 2: true, 3: true, 4: true}

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值