php代码数鸡蛋数学题,给定一个数字求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);

};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值