Given an integer n, count the total number of digit 1 appearing in all non-negative integers less than or equal to n.
先贴我昨天不成功的代码:
function count(n){ let temp = n.toString(), l = temp.length; if( l == 1 && n >= 1){ return 1; }else if( l == 1 && n == 0 ){ return 0 } if( temp[0] == 1 ){ let max= 2*Math.pow(10,l-1) - 1, min = Math.pow(10,l-1); max = max >= n ? n : max; return (max - min + 1 + count(max-min) ) + count( --min ); }else{ let min = 2*Math.pow(10,l-1)-1; return count( min) + (((+temp[0]) - 2 ))*count( Math.pow(10,l-1) ) + count( +temp.slice(1) ); }
思路:
要求一个数字中1的个数,可以分解为求与其位数相同的 1xxx-1999中1的个数 加上 1xxx-1中1的个数,再加上其最高位-2 乘以 与其位数相同的1xxx中1的个数,再加上它末尾数字中1的个数,
采用递归找1的个数,递归出口是 n只有1个数字时返回1的个数。
我这思路一出来,连我自己都觉得我机智,
可惜昨天调试了 一天 发现结果是错的,心很痛,
我今天突然好像发现了问题,一会儿再调调看看
然后是百度之后的结果,稍后说。
刚刚我又刷了一道,是判定一个数字是不是有效数字的,我是用正则解决的,下午再说那道题的解法吧。有效数字这个问题很***,因为题目的意思就是坑你的:
var isNumber = function(s) { let patternNagative = /(^\s*\-?\d+\s*$)|(^\s*\-?\d+\.\s*$)|(^\s*\-?\.\d+\s*$)|(^\s*\-?\d+\.\d+\s*$)|(^\s*\-?\d+e\-?\d+\s*$)/, patternPositive = /(^\s*\+?\d+\s*$)|(^\s*\+?\d+\.\s*$)|(^\s*\+?\.\d+\s*$)|(^\s*\+?\d+\.\d+\s*$)|(^\s*\+?\d+e\+?\d+\s*$)/, patternEAfterDot = /(^\s*(\-|\+)?((\d+)|(\d+e\-?\d+))\.\d*e(\+|\-)?\d+\s*$)|(^\s*(\+|\-)?\.\d+e(\+|\-)?\d+\s*$)/; return patternNagative.test(s) || patternPositive.test(s) || patternEAfterDot.test(s); };