【刷题】——小红书三套卷

选择题

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

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

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

  • null == undefined、null === null (true)

  • null === undefined、NaN == null、NaN === NaN、Infinity + 1 !== Infinity(false)

  • X当前域的 cookie 都可以通过 js 在当前域下获取,错误,http-only,对于一些保密性较高的 cookie 后端可以通过设置 HttpOnly 标记 cookie 只能通过 http 传递,前端 js 无法读取,这样可以防范xss攻击。

  • JSONP 不是 XMLHttpRequest 中的一种,JSONP 用的是 html 的 script 标签,xmlhttprequest 是浏览器内置的 HTTP 相关对象,两者不同。

  • localStorage API 不支持设置过期时间

  • css加载不会阻塞DOM树的解析、会阻塞DOM树的渲染、会阻塞后面js语句的执行

  • iframe会阻塞主页面的onload事件;

  • 会阻塞dom解析的资源有:
    1.内联css
    2.内联js
    3.普通外联js
    4.外联defer js
    5.js之前的外联css

简答题

在这里插入图片描述
给出的打印的值

Tom
Tom(使用new操作时,构造函数内部的this指向相应的实例化对象;未使用new操作符时,为普通函数调用,全局函数内的this指向window,所以var a = Person就将全局范围内的name改成了Tom)
undefined?(person('Tom)相当于只是执行person函数,没有返回值,输出undefined)
Michael
Person{name:‘Michael’}

在这里插入图片描述

let num = 6364643.22
 
function paddingNum(num){
    let flag = num > 0 ? true : false;
 
    let numArr = Math.abs(num).toString().split('.');
    let right = numArr[1] ? '.'+numArr[1] : '';
    let left = numArr[0];
    let temp = '';
    while(left.length){
        temp = ',' + left.slice(-3) + temp;
        left = left.slice(0,left.length - 3);
    }
 
    return flag ? left + temp + right:'-'+left+temp+right
}
 
console.log(paddingNum(num).slice(1));
function duplicates(arr){
    let obj = {};
    arr.forEach((str) => {
        obj[str] = typeof obj[str] === 'undefined' ? false:true
    });
    return obj
     
}

js严格模式下

1.严格模式对 JavaScript 的语法和行为,都做了一些改变。
严格模式下,变量必须先声明再使用,严禁删除已经声明变量。
严格模式下,预编译时 this 为 undefined。
严格模式下,不支持arguments、caller、callee、with。
严格模式下,在函数内部对修改参数不会反映到 arguments 中,淘汰了 arguments.callee 和 arguments.caller, 抛弃 with 语句。
严格模式下,不可在 if 内部声明函数
严格模式下,拒绝重复的属性和参数。
严格模式下,局部的this必须被赋值、赋值什么就是什么。

  1. 严格模式下 this 指向问题
    ① 以前在全局作用域函数中的 this 指向 window 对象。

② 严格模式下全局作用域中函数中的 this 是 undefined。

③ 以前构造函数不加 new 也可以调用,当普通函数,this 指向全局对象。

④ 严格模式下,如果构造函数不加 new 调用, this 指向的是 undefined ,如果给他赋值则会报错 。

console.log(null == undefined); // true
console.log(typeof NaN); // ‘number’
console.log(typeof Function); // ‘function’
console.log(typeof Object); // ‘function’
console.log(typeof {}); // ‘object’
console.log(‘a’ + 1); // ‘a1’
console.log(‘a’ - 1); // NaN
console.log(Function instanceof Object); // true
console.log(Object instanceof Function); // true

'use strict'

var name = 'Jay'
var person = {
    name: 'Wang',
    pro: {
        name: 'Micheal',
        getName: function() {
            return this.name
        }
    }
}

console.log(person.pro.getName());

var people = person.pro.getName

console.log(people);

"use strict"声明以严格模式执行

输出:“Michael”
解释:这里是person.pro调用了getName(),getName()里面的this指向了person.pro,所以这里的this.name == “Michael”

输出:error报错
解释:将person.pro.getName方法赋给了pepole,然后在全局执行上下文中调用了pepole(),因为是在严格模式下执行,所以pepole()里面的this是指向undefined,undefined又获取name属性,最后导致报错

关键词屏蔽 **

这个题比较经典,有一次面试也考来着
在这里插入图片描述
用正则处理非常简单,别的方法比较麻烦

function fn(str, arr) {
    for (let item of arr) {
        let len = item.length;
        let ret = new RegExp(`${item}`, 'g')
        str = str.replace(ret, '*'.repeat(len));
    }
    return str;
}

console.log(fn('想要轻生,have sex,sexy,babe', ['轻生', 'sex']))

编程题

1、括号删除,<<<回退

薯队长写了一篇笔记草稿,请你帮忙输出最后内容。
1.输入字符包括,“(” , “)” 和 "<“和其他字符。
2.其他字符表示笔记内容。
3.()之间表示注释内容,任何字符都无效。 括号保证成对出现。
4.”<“表示退格, 删去前面一个笔记内容字符。括号不受”<"影响 。

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

薯队长想从中选出一些笔记,作一个精选集合。挑选的时候有两个规则:
1.不能出现连续编号的笔记。
2.总点赞总数最多
如果满足1,2条件有多种方案,挑选笔记总数最少的那种

动态规划,打家劫舍

let len = parseInt(readline());
 
let arr = readline().split(' ').map((item) => parseInt(item));
 
let dp = new Array(len+1).fill(0);
let count = new Array(len + 1).fill(0);
 
dp[0] = arr[0];
count[0] = 1;
 
dp[1] = Math.max(arr[0],arr[1]);
count[1] = 1;
 
for(let i = 2; i < len; i++){
    if(dp[i-1] < dp[i-2] + arr[i]){
        dp[i] = dp[i-2] + arr[i];
        count[i] = count[i-2]+1;
    }else{
        dp[i] = dp[i-1];
        count[i] = count[i-1];
    }
}
 
console.log(dp[len-1] + ' ' + count[len-1]);

3、二维排序,然后最长上升子序列

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

let num = [
    [3, 2],
    [1, 1],
    [1, 3],
    [1, 5],
    [2, 3],
    [2, 3],
];

num.sort((a, b) => {
    if (a[0] != b[0]) {
        return a[0] - b[0]
    } else {
        return a[1] - b[1]
    }
})

console.log(num);

let dp = new Array(num.length).fill(1);

let max = 1;

for (let i = 1; i < num.length; i++) {
    for (let j = 0; j < i; j++) {
        if (num[j][1] <= num[i][1]) {
            dp[i] = Math.max(dp[i], dp[j] + 1);
            max = Math.max(dp[i], max);
        }
    }
}

console.log(max);

这个输入要多注意

长城数组,最少改变几次

这个题很简单啊!!!,就是去比较奇数位置和偶数位置的第一多第二多的数字!!!!!!!

【长城数组】要求数组内每个数两边的数都相等,且和它本身不相等。输入 n ,和一个长度为 n 的任意数组。你需要修改其中的数,使得它变为“长城数组”。输出最少需要修改几个数???

思路:“长城数组”其实就是 奇数位置(第1,3,5,…个)均相等、偶数位置均相等,且不全相等的数组。因此需要分别记下来原数组中奇数位、偶数位上每个数字出现的次数,最终我们留下出现最多的数,其他都替换成这个数。但是,有一种特殊情况,那就是这两个数相同,此时只能让奇数位或者偶数位“退而求其次”,即替换成出现第二多的数。所以需要对比一下,奇数位和偶数位换哪个需要的额外次数更小。

//长城数组
//[1,2,1,3,2,1] ————》 [1,2,1,2,1,2];

//奇数、偶数分别相同,记录出现最多次数的,如果相同则有一个要去找第二多的数字


function getTimes(arr) {
    let oddMap = new Map();
    evenMap = new Map();


    for (let i = 0; i < arr.length; i++) {
        if (i % 2 === 0) {
            oddMap.set(arr[i], (oddMap.get(arr[i]) || 0) + 1);

        } else {
            evenMap.set(arr[i], (evenMap.get(arr[i]) || 0) + 1);

        }
    }


    //找出奇数、偶数中第一和第二多的

    let [oddFirstNum, oddFirstCount, oddSecondNum, oddSecondCount] = getValue(oddMap);
    let [evenFirstNum, evenFirstCount, evenSecondNum, evenSecondCount] = getValue(evenMap);


    function getValue(map) {
        let firstNum = 0,
            firstCount = 0;
        secondNum = 0, secondCount = 0;

        for (let [item, value] of map) {
            if (value >= firstCount) {
                secondCount = firstCount;
                secondNum = firstNum;
                firstNum = item;
                firstCount = value;
            } else if (value < firstCount && value > secondCount) {
                secondCount = value;
                secondNum = item;
            }
        }
        return [firstNum, firstCount, secondNum, secondCount];
    }

    //最终要判断一下奇数偶数中最多的数字是否相同

    if (evenFirstNum !== oddFirstNum) {
        return arr.length - oddFirstCount - evenFirstCount;
    } else if (evenFirstNum === oddFirstNum) {

        if (oddFirstCount - oddSecondCount >= evenFirstCount - evenSecondCount) {
            return arr.length - oddFirstCount - evenSecondCount;
        } else {
            return arr.length - oddSecondCount - evenFirstCount;
        }
    }

}

console.log(getTimes([1, 1, 4, 5, 1, 4]))

走迷宫系列

薯队长最近在玩一个迷宫探索类游戏,迷宫是一个N*N的矩阵形状,其中会有一些障碍物禁止通过。这个迷宫还有一个特殊的设计,它的左右 边界以及上下边界是连通的,比如在(2,n)的位置继续往右走一格可以到(2,1), 在(1,2)的位置继续往上走一格可以到(n,2)。请问薯队长从起点位置S,最少走多少格才能到达迷宫的出口位置E。

//左右边界连通、上下连通

function node(x, y, layer) {
    this.x = x;
    this.y = y;
    this.layer = layer;
}

/**
 * 找出起点和终点
 * @param {*} a 
 * @param {*} arr 
 */
function fn(a, arr) {
    var xStart = -1,
        yStart = -1;
    var xEnd = -1,
        yEnd = -1;
    var count = 0;
    for (var i = 0; i < arr.length; i++) {
        for (var k = 0; k < arr[0].length; k++) {
            if (arr[i][k] == 'S') {
                xStart = i;
                yStart = k;
            }
            if (arr[i][k] == 'E') {
                xEnd = i;
                yEnd = k;
            }
        }
    }

    //

    var stack = [];
    stack.push(new node(xStart, yStart, 0));
    var newArr = arr.slice();
    var x = -1,
        y = -1;

    /**
     * dfs进行遍历??找出最小的???
     * 
     */



    while (stack.length > 0) {
        var temp = stack.shift();
        if (temp.x == xEnd && temp.y == yEnd) {
            return temp.layer
        }
        x = temp.x + 1;
        y = temp.y;
        if (x == a) x = 0;
        if (newArr[x][y] != '#') {
            stack.push(new node(x, y, temp.layer + 1));
            newArr[x][y] = '#'
        };
        //---------------
        x = temp.x - 1;
        y = temp.y;
        if (x == -1) x = a - 1;
        if (newArr[x][y] != '#') {
            stack.push(new node(x, y, temp.layer + 1));
            newArr[x][y] = '#'
        };
        //-------------
        x = temp.x;
        y = temp.y + 1;
        if (y == a) y = 0;
        if (newArr[x][y] != '#') {
            stack.push(new node(x, y, temp.layer + 1));
            newArr[x][y] = '#'
        };
        //-----------------
        x = temp.x;
        y = temp.y - 1;
        if (y == -1) y = a - 1;
        if (newArr[x][y] != '#') {
            stack.push(new node(x, y, temp.layer + 1));
            newArr[x][y] = '#'
        };

    }

    return "-1"

}

var a = 5,
    arr = [
        [1, '#', 1, 1, 1],
        [1, 1, '#', 's', 1],
        [1, 'e', '#', '#', '#'],
        [1, 1, 1, 1, 1],
        [1, 1, 1, 1, 1]
    ]
console.log(fn(a, arr))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值