大家觉得写还可以,可以点赞、收藏、关注一下吧!
也可以到我的个人博客参观一下,估计近几年都会一直更新!和我做个朋友吧!https://motongxue.cn
233. 数字 1 的个数
给定一个整数 n,计算所有小于等于 n 的非负整数中数字 1 出现的个数。
示例:
输入: 13
输出: 6
解释: 数字 1 出现在以下数字中: 1, 10, 11, 12, 13 。
代码
暴力解法
/*
* @Author: motongxue
* @Date: 2020-07-31 17:05:57
* @LastEditors: motongxue
* @LastEditTime: 2020-08-03 17:17:35
* @Blog: https://motongxue.cn
* @Description: file content
*/
public int countDigitOne(int n) {
int num = 0;
for (int i = 1; i <= n; i++) {
int temp = i;
while (temp > 0) {
if (temp % 10 == 1) {
num++;
}
temp /= 10;
}
}
return num;
}
暴力解法提交结果
数位DP解法
/*
* @Author: motongxue
* @Date: 2020-07-31 17:05:57
* @LastEditors: motongxue
* @LastEditTime: 2020-08-03 17:17:35
* @Blog: https://motongxue.cn
* @Description: file content
*/
class Solution {
int[][] f = new int[20][20];
int[] num = new int[20];
int x=1;
int solve(int n) {
int index = 0;
while (n != 0) {
num[++index] = n % 10;
n /= 10;
}
return dfs(index, 1, 0);
}
int dfs(int index, int limit, int sum) {
if (index == 0)
return sum;
if (limit == 0 && f[index][sum] != 0)
return f[index][sum];
int res = 0;
int up = limit == 0 ? 9 :num[index] ;
for (int i = 0; i <= up; i++) {
res += dfs(index - 1, (limit != 0 && (i == up)) ? 1 : 0, sum + ((i == x) ? 1 : 0));
}
if (limit == 0)
f[index][sum] = res;
return res;
}
public int countDigitOne(int n) {
if(n==0)return 0;
return solve(n);
}
}
数位DP提交结果
2020年8月3日更
大家觉得写还可以,可以点赞、收藏、关注一下吧!
也可以到我的个人博客参观一下,估计近几年都会一直更新!和我做个朋友吧!https://motongxue.cn