请你来实现一个 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));