zoukankan      html  css  js  c++  java
  • 刷面经笔记2019.02.16

    1.栈的压入和弹出

    输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列5,4,3,2,1或3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。

    function IsPopOrder(pushV,popV){
        if(pushV.length === 0) return false;
        var stack = []; // 模拟栈
        for(var i = 0, j = 0; i < pushV.length;){
            stack.push(pushV[i]);
            i += 1;
            // 压入栈的值需要被弹出
            while(j < popV.length && stack[stack.length-1] === popV[j]){
                stack.pop();
                j++;
                if(stack.length === 0) break;
            }
        }
        return stack.length === 0;
    }

    2.利用栈模拟队列

    思路:

    • 对栈A添加数据。
    • 如果栈B为空,循环将栈A中内容弹出放入栈B,并弹出栈B最后一项
    • 如果栈B不为空,则直接弹出栈B的最后一项
    var stackA = [];
    var stackB = [];
    
    function push(node){
        stackA.push(node);
    }
    function pop(){
        if(!stackB.length){
            while(stackA.length){
                stackB.push(stackA.pop());
            }
        }
        return stackB.pop();
    }

    3.连续最长不重复字符串

    在一个字符串中找出连续的不重复的最大长度的字符串,解决这类问题的思路:

    • 利用循环叠加字符串,直到出现重复为止
    • 每一次叠加,记录下来最大长度的字符串
    // 连续最长不重复字符串
    function getMaxLenStr(str) {
        var cur = [];
        var maxLenStr = '';
        for(var i = 0; i < str.length; i++) {
            if(!cur.includes(str[i])) {
                cur.push(str[i]);
            } else {
                cur = []; // 置为空
                cur.push(str[i]);
            }
            
            // 存储最大长度的字符串
            if(maxLenStr.length < cur.length) {
                maxLenStr = cur.join('');
            }        
        }
        return maxLenStr;
    }
    
    getMaxLenStr('ababcabcde'); // abcde

    4.求一个数组当中,连续子向量的最大和。

    function FindGreatestSumOfSubArray(arr) {
        let sum = arr[0];
        let max = arr[0];
        for(let i = 1; i < arr.length; i++) {
            if(sum < 0) {
                sum = arr[i];
            }else{
                sum += arr[i];
            }
            // 记录最大值
            if(max < sum) {
                max = sum;
            }
        }
        return max;
    } 

    5.给定一个编码字符,按编码规则进行解码,输出字符串

    编码规则:coount[letter] ,将letter的内容count次输出,count是0或正整数,letter是区分大小写的纯字母。

    实例:

    • const s= 3[a]2[bc]; decodeString(s); // 返回 ‘aaabcbc’
    • const s= 3[a2[c]]; decodeString(s); // 返回 ‘accaccacc’
    • const s= 2[ab]3[cd]ef; decodeString(s); // 返回 ‘ababcdcdcdef’

    思路:

    • 使用栈这种数据结构,如果push的内容为‘]’,则循环pop字符,直到碰到’[‘,然后将pop

    出来的字符串按规则整理后,重新push进栈中,最后将栈内的内容拼接成字符串输出即可。

    function decodeString(str) {
        let stack = []; // 存储字符串的栈
        for (let i = 0; i < str.length; i++) {
            let cur = str[i];
            if (cur !== ']') {
                stack.push(cur);
            } else { // 弹出
                let count = 0;
                let loopStr = [];
                let popStr = '';
                while ((popStr = stack.pop()) !== '[') {
                    loopStr.unshift(popStr);
                }
                count = stack.pop();
                // 添加结果
                let item = '';
                for (let i = 0; i < count; i++) {
                    item += loopStr.join('');
                }
                stack.push(...(item.split('')));
            }
        }
        return stack.join('');
    }

    6.['1', '2', '3'].map(parseInt) 的运行结果

    答案为:[1, NaN, NaN]

    解析:

    arr.map(function callback(currentValue[, index[, array]]) { // Return element for new_array }[, thisArg])
    这个callback一共可以接收三个参数,其中第一个参数代表当前被处理的元素,而第二个参数代表该元素的索引。

     而parseInt则是用来解析字符串的,使字符串成为指定基数的整数。
    parseInt(string, radix)
    接收两个参数,第一个表示被处理的值(字符串),第二个表示为解析时的基数。

    a. parseInt('1', 0) //radix为0时,且string参数不以“0x”和“0”开头时,按照10为基数处理。这个时候返回1
    b. parseInt('2', 1) //基数为1(1进制)表示的数中,最大值小于2,所以无法解析,返回NaN
    c. parseInt('3', 2) //基数为2(2进制)表示的数中,最大值小于3,所以无法解析,返回NaN

    map函数返回的是一个数组,所以最后结果为[1, NaN, NaN]

    7.自定义事件

     var content = document.querySelector('.content');
        // 自定义事件
        var evt = new Event('custom');
        var customEvt = new CustomEvent('customEvt', {
            // 通过这个属性传递参数
            detail: {
                name: 'tom',
                age: 12
            }
        });
        content.addEventListener('custom', (e) => {
            console.log('自定义事件被触发,无参数...');
            console.log(e);
        });
        content.addEventListener('customEvt', (e) => {
            console.log('自定义事件被触发,有参数...');
            console.log(e);
            console.log(e.detail);
        });
        // 点击时触发这个自定义事件
        content.addEventListener('click', (e) => {
            content.dispatchEvent(evt);
            content.dispatchEvent(customEvt);
        });
  • 相关阅读:
    Java 类和对象12
    Java类和对象11
    java 类和对象10
    Java类和对象9
    Java类和对象8
    Java 类和对象7
    包装与方法
    JAVA链表
    泛型
    多态 接口
  • 原文地址:https://www.cnblogs.com/lhh520/p/10388267.html
Copyright © 2011-2022 走看看