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));