整数中1出现的次数(从1到n整数中1出现的次数)
整数中1出现的次数(从1到n整数中1出现的次数)
http://www.nowcoder.com/questionTerminal/bd7f978302044eee894445e244c7eee6
这道题思路很简单,就是处理情况的时候容易出错。
思路:
求每位出现1的次数,然后相加即可。
现在问题变成如何求每一位出现1的次数。
以23145为例
定三个变量:
假如当前求的是十位上1出现的次数,那么:
高位:231
低位:5
当前值:4
我们只需要想当前值为1的时候,高位和低位有多少选择。
因为当前值4>1,所以高位可取0~231,低位可取0~9.
所以十位上1出现的次数就是232*10;
特殊情况就是当前位是1的时候,
这时候当高位取最大值的时候,低位只能取0~低位最大值。
高位取其他值的时候,按上面的计算就行。
以上面的百位为例:
高位:23
当前:1
低位:45
百位出现1的次数=23*100+(45+1)
当当前位为0的时候,最高位可取0~(最高位-1),低位可取0~(当前求的位数值-1),相乘即可。
代码:
public class Solution { public int NumberOf1Between1AndN_Solution(int n) { int count=0; int high; int low; int prelow=0; for(int i=1;i<=n;i=i*10){//i记录当前是多少位 high=n/(i*10); low=n%(i*10)/i; if(i>=10){//当前位非个位的时候才有低位 prelow=n%i; } if(i==1){//当前位为个位的时候 if(low>=1){ count=high+1; }else{ count=high; } }else{ if(low==1){ count=count+high*i+prelow+1; }else if(low>1){ count=count+(high+1)*i; } else{ count=count+high*i; } } } return count; } }