首页 > 其他 > 详细

从一道leetcode题的二分法扩展

时间:2020-11-09 10:50:12      阅读:26      评论:0      收藏:0      [点我收藏+]

请你来实现一个 atoi 函数,使其能将字符串转换成整数。

首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。接下来的转化规则如下:

  • 如果第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字字符组合起来,形成一个有符号整数。
  • 假如第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成一个整数。
  • 该字符串在有效的整数部分之后也可能会存在多余的字符,那么这些字符可以被忽略,它们对函数不应该造成影响。
    • 本题中的空白字符只包括空格字符 ‘ ‘ 。
    • 假设我们的环境只能存储 32 位大小的有符号整数,那么其数值范围为 [?231,  231 ? 1]。如果数值超过这个范围,请返回  INT_MAX (231 ? 1) 或 INT_MIN (?231) 。

这道题已经通过了。代码如下

var myAtoi = function(s) {
    s = s.trimLeft();
    if(/^([-|+]?[\d]+)/g.test(s)==false){
        return 0;
    }
    const value = RegExp.$1;
    console.log(RegExp.$0, RegExp.$1);
    const ret = parseInt(value);
    if(ret<-1*Math.pow(2, 31)){ return -1*Math.pow(2,31) }
    if(ret>Math.pow(2, 31)-1) { return Math.pow(2,31)-1; }
    return ret;
};
 
其实关于Math.pow可以有以下拓展。31可以看作 累乘31次,也可以看成 00 0000 00000000(8) 0000000000000000(16)16*8*4*2*1
 
这种二分法求解。相似的还有leftPad, 斐波那契的公式法有个n次方
function leftPad(str, len, ch){
    if(!ch && ch!=0){ch=‘ ‘}
    let left = len-str.length;
    let strStr = "";
    while(left){
        if(left%2==1){
            strStr+=ch;
        }
        if(left==1){
            return strStr+str;
           
        }
        left = Math.floor(left/2);
        strStr+=strStr;
        console.log(strStr);
    }
}
// console.log(leftPad("hello", 20, 3));
function MathPow(base, time){
    let ret = 1;
    var flag = time%2;
    while(time){
        
        if(time%2){
            ret*=base;
        }
        if(time==1&&flag){
            return ret;
        }
        ret *= ret; // 1 1 2
        time = parseInt(time/2);
    }
    return ret;
}
console.log(MathPow(2,10));
 

从一道leetcode题的二分法扩展

原文:https://www.cnblogs.com/connie313/p/13946935.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!