首先要明确题意:是1出现的个数,而不是包含1的整数的个数;
其次:分情况进行讨论
(1)大框架是按位进行置1,去讨论除本位之外的情况(比如,个位置为1,分析十百千位的情况)
(2)考虑当前位,若当前位大于等于1,则左边位可以取到最大值;否则,最高位取到(最大值-1);
(3)考虑最高位,若最高位大于等于1,则可以取完;否则,最高位取到本数的最大值;
最后,当然得来个例子才好:
上面是我自己总结的,可能直接看不是很能理解,贴心的用下面一个例子来进行阐述:
比如,2048,先看个位,个位置1,当前位8>1,所以左边可以从0-204,也就是205;
十位为1,当前位4>1,左边位可以从0-20全取完,右边位也可以全取完0-9(左边不会超过最大值,右边位一定可以全部取完,因此右边可以全部取完),则是21*10=210;
百位置1,当前位为0<1,则左边位只能取0-1,,不能取2,右边位可以全部取完,也就是2*100=200个;
千位置1,千位是这个数的最高位,且2>1,所以可以取1000-1999全部取完,就是1000个(若是1048,千位置1,就只能取到1000-1048);所以总数就是205+210+200+1000=1615;可以经过代码进行验证。