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
#include
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
#include
using namespace std;
// dp[i]: 从第一篇笔记开始选到第i篇, 所能得到的最大点赞数。
// count[i]: 此时选取的笔记数量
int main(){
int n, val;
cin >> n;
vector vec(n + 1, 0);
for(int i = 1; i <= n; ++i){
cin >> val;
vec[i] = val;
}
vector dp(n + 1, 0);
vector 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
#include
#include
using namespace std;
static bool cmp(vector & a, vector &b)
{
return a[0]>N;
int h, x;
vector> nums;
while(cin>>h>>x)
{
nums.push_back({h, x});
}
int ret=0;
sort(nums.begin(), nums.end(), cmp);
vector dp;
dp.push_back(nums[0][1]);
for(int i=1;i=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<
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.prototypeES6中的class继承中将父类的原型对象作为了子类的原型对象的原型对象,所以B.prototype.__proto__ === A.prototype, b.__proto__.__proto__ === A.prototype
9.请用 HTML+CSS 实现一个定宽定高元素在容器中的水平和垂直居中。
①flex
.bigBox {
width: 200px;
height: 200px;
background-color: aqua;
display: flex;
justify-content: center;
align-items: center;
}
.minBox {
width: 50px;
height: 50px;
background-color: pink;
}
②绝对定位
.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%);
}
效果:
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}