剑指offer 2.23

90 阅读1分钟

剑指 Offer 67. 把字符串转换成整数

// 注意边界值和判定条件,数字不能用parseInt(),这里的i-'0'需要括号,要不然就会变成字符串拼接改变了数据类型。
var strToInt = function(str) {
    let flagSpace = true;//头部空格
    let flag = 0;//正负号,未出现为0,正号为1,负号为2
    let first = 0;//第一个非空字符,未出现为0,符号为1,数字为2
    let res = 0;
    for(let i of str){
        if(i==' '&&flagSpace) continue;
        else{
            flagSpace = false;
            if(!first){
                // 第一个字符不为符号或数字
                if(i!='+'&&i!='-'&&(i<'0'||i>'9')){
                    return 0;
                }
                // 第一个字符为符号
                if(i=='+'||i=='-'){
                    flag = i=='+'?1:2;
                    first = 1;
                }
                // 第一个字符为数字
                else{
                    first = 2;
                    res += i - '0';
                }
                continue;
            }
            if(i<'0'||i>'9'){
                break;
            }
            else {
                res = res*10 + (i - '0');
                if(flag!=2&&res>2147483647) return 2147483647;
                if(flag==2&&res>2147483648) return -2147483648;
            }
        }
    }
    return flag!=2?res:-res;
};

剑指 Offer 59 - I. 滑动窗口的最大值

// 被困难吓到了,没想到暴力就出来了。
var maxSlidingWindow = function(nums, k) {
    if(!nums.length) return [];
    if(k==1) return nums;
    let store = [];
    let getMax = (arr)=>{
        let max = Number.MIN_VALUE;
        for(let i of arr){
            max = i>max?i:max;
        }
        return max;
    }
    let res = [];
    for(let i of nums){
        if(store.length<k){
            store.push(i);
        }
        else{
            res.push(getMax(store));
            store.shift();
            store.push(i);
        }
    }
    res.push(getMax(store));
    return res;
};
// 单调队列
var maxSlidingWindow = function(nums, k) {
    if(!k||!nums.length) return [];
    if(k==1) return nums;
    let store = [];
    let res = [];
    for(let i =0;i<k;i++){
        if(!store.length) {
            store.push(nums[i]);
            continue;
        }
        while(store.length&&store[store.length-1]<nums[i]) store.pop();
        store.push(nums[i]);
    }
    for(let i = k-1;i<nums.length;i++){
        while(store.length&&store[store.length-1]<nums[i]) store.pop();
        store.push(nums[i]);
        if(i-k>=0){
            if(nums[i-k]==store[0]) store.shift();
        }
        res.push(store[0]);
    }
    return res;
};

关于单调队列,在形成原始队列时,若新加的值大于队尾值,已知FIFO,队尾值会优先弹出,所以可以直接弹出小于新加值的所有值。而在滑动窗口移动时,需要注意左侧弹出的值是不是当前队列的最大值,若是则通过原始方法无法更新队首的最大值,此时就需要手动弹出队首的值。