给定一个数字求1的个数

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


posted @ 2018-09-20 12:26  子龙_子龙  阅读(99)  评论(0编辑  收藏  举报