算不上什么简单的方法但是绝对好理解
整数中1出现的次数(从1到n整数中1出现的次数)
http://www.nowcoder.com/questionTerminal/bd7f978302044eee894445e244c7eee6
public class Solution { public int NumberOf1Between1AndN_Solution(int n) { if(n<1) return 0; if(n<10) return 1; int result=0; int i=1; int num=n; while(true){ int a=new Double(Math.pow(10,i)).intValue(); int resi=n%10; n=n/10; if(resi>1){ result+=(n+1)*a/10; }else if(resi==1){ result+=(n-1)*a/10+num-n*a+1; }else{ result+=n*a/10; } if(n==0){ return result; } i++; } } }
我的思路就是看每一位计算每一位出现1的次数再加起来就行,判断每一位还是通过不断取余,10,100,1000这样,也许有更方便的办法但是懒得想了。
之后对于每一位出现1的次数就是分三种情况
1.非1非0
那么出现次数显而易见是当前的(商+1)*位数。比如果21305中3这一位,它出现1的话连续出现会出现100次就是A1B,那么前面的A每加1,意味着后面已经改变了1000次,在这1000次中只有连续的100次百位是1。而出现了几次100次?当然就是A+1次,因为要从0开始计数。所以百位出现1的次数是22*100=2200;
2.该位是0
那么出现次数就是当前的商*位数。比如果21305中的十位,具体分析和上面差不多,只是因为要从0开始计数一直到212,因为213后面还没有到1所以不用考虑。那么十位的出现1的次数就是213*10=2130;
3.该位是1
那么出现次数就是当前的商*位数+1后面的数+1。比如果21305中的千位,具体分析也和上面差不多,因为要从0开始计数一直到2,所以是2*1000,但是以2开头千位为1的数并没有走完,只走了305+1(同样从0开始),因此这一位是2*1000+306=2306;
总结:以21305为例那么最后的值应该是1*10000+(2*1000+306)+22*100+213*10+2131*1=18767