LeetCode 11.26

158 阅读1分钟

Leetcode 8 字符串转换整数

这两个方法都是看了别人的答案写出来的,如果要我写我可能一个个字符匹配然后陷入逻辑怪圈出不来了。

//调用API。
var myAtoi = function(s) {
    const number = parseInt(s, 10);
    if(isNaN(number)) {
        return 0;
    } else if (number < Math.pow(-2, 31) || number > Math.pow(2, 31) - 1) {
        return number < Math.pow(-2, 31) ? Math.pow(-2, 31) : Math.pow(2, 31) - 1;
    } else {
        return number;
    }
};
//自动机,感觉有点像策略模式和状态模式(不一样就当我智障)。每一次输入状态都会改变,状态改变时对应的处理方式也会改变。需要注意的就是使用map来决定状态的一一映射,最后输出数字的时候需要注意最大最小值的边界。
var myAtoi = function(s) {
    class atoi{
        constructor(){
            this.state = 'start';
            this.signed = 1;
            this.answer = 0;
            this.map = new Map([
                ['start', ['start', 'signed', 'number', 'end']],
                ['signed', ['end', 'end', 'number', 'end']],
                ['number', ['end', 'end', 'number', 'end']],
                ['end', ['end', 'end', 'end', 'end']]
            ])
        }
        getIndex(char){
            if(char===' '){
                return 0;
            }
            else if(char==='+'||char==='-'){
                return 1;
            }
            else if(!isNaN(char)){
                return 2;
            }
            else{
                return 3;
            }
        }
        calc(char){
            this.state = this.map.get(this.state)[this.getIndex(char)];
            if(this.state==='number'){
                this.answer = this.answer*10 + Number(char);
                this.answer = this.signed===1?Math.min(this.answer,Math.pow(2,31)-1):Math.min(this.answer,Math.pow(2,31));
            }
            if(this.state==='signed'){
                this.signed = char==='+'?1:0;
            }
        }
    }
    let test = new atoi();
    for(let i of s){
        test.calc(i);
    }
    return test.signed===1?test.answer:-test.answer;
};

LeetCode 28 实现strStr()

//暴力,看官方解才写出来。。。。。
var strStr = function(haystack, needle) {
    let m = haystack.length;
    let n = needle.length;
    for(let i = 0;i+n<=m;i++){
        let flag = true;
        for(let j = 0;j<n;j++){
            if(haystack[i+j]!=needle[j]){
                flag = false;
                break
            }
        }
        if(flag) {
            return i;
        }
    }
    return -1;
};
//KMP算法,有空再看看。

LeetCode 38 外观数列

//玄学计算机,类似数学归纳法的题目全部递归就行。
var countAndSay = function(n) {
    let res = traceBack(n);
    return res;
};
var traceBack = (n) =>{
    if(n===1) return '1';
    let str = traceBack(n-1);
    let res = "";
    for(let i = 0 ;i<str.length;){
        let tmp = str[i];
        let start = i++;
        while(str[i]===tmp){
            i++;
        }
        res += (i-start)+tmp;
    }
    return res;
}

LeetCode 14 最长公共前缀

//纵向遍历,我还以为最长公共字符串,差点写不出来。
var longestCommonPrefix = function(strs) {
    let min = Number.MAX_VALUE;
    for(let i of strs){
        min = Math.min(min, i.length);
    }
    let res = "";
    for(let i =0;i<min;i++){
        let tmp = strs[0][i];
        for(let j of strs){
            if(j[i]!==tmp){
                return res;
            }
        }
        res += strs[0][i];
    }
    return res;
};

image.png 不得不说,cpp还是很牛的。

LeetCode 237 删除链表中的结点

//.....面试多来点这种题目。
var deleteNode = function(node) {
    let tmp = node.next;
    node.val = node.next.val;
    node.next = tmp.next;
};