public int NumberOf1Between1AndN_Solution(int n) { //出现的总数其实就是各个位置上的1的个数的和 //当前位,n(i),cur //高位n(N)....n(i+1),high //低位n(i-1)...n(1),low //注意当前位出现1的个数其实是和当前位的digital是挂钩的,比如是十分位,那么可能有10...19出现1,有10个 //而百分位就成了100...199出现1,有100个数,以此类推 //而像是10分位的1,有几个10...19出现呢?这就看高位了,至少会有0~high-1共有high个 //不管是当前位是什么,总会有(0~high-1) * digital的基本盘,就是看当前位的值决定是否能多捞点 //如果当前位是0如2007的第二位,那么在当前位可能出现1的次数为, high*digital //如果当前位是1如2017的第二位,那么在当前位可能出现1的次数为 high*digital+low+1 //如果当前位是2...9如2037的第二位,那么在当前位可能出现1的次数为 (high+1)*digital int cur = n % 10; int high = n / 10; int low = 0; int digital = 1; int res = 0; while(cur!=0||high!=0){ res+=high*digital; if(cur==1){ res+=low+1; }else if(cur!=0){ res+=digital; } low += cur * digital; digital *= 10; cur = high%10; high /= 10; } return res; }