输入一个整数 n ,求1~n这n个整数的十进制表示中1出现的次数。
例如,输入12,1~12这些整数中包含1 的数字有1、10、11和12,1一共出现了5次。
示例 1:
输入:n = 12
输出:5
示例 2:
输入:n = 13
输出:6
限制:
1 <= n < 2^31
解题思路:利用动态规划的思想来解决这个题
每次用 n / i并用一个变量将其存储起来,同时将它的余数存储起来,这个余数可以用来得到它离最近一个(向下取整)整除10的1的个数
class Solution { public int countDigitOne(int n) { int count = 0; for(int i = 1; i <= n; i *= 10){ //取的 n除以i 的商的整数部分 int number = n/i; //取的n除以i 的余数部分 int remainder = n%i; //取的number个位数部分 int d = number%10; //取的number 除以 10 的商的整数部分 int xyz = number/10; //计算1出现的次数 count += xyz*i; if(d > 1) count += i; if(d == 1) count += remainder+1; if(xyz == 0) break; } return count; } }
提交记录如下: