概述
233. 数字 1 的个数 - 力扣(LeetCode)
一、题目
给定一个整数 n
,计算所有小于等于 n
的非负整数中数字 1
出现的个数。
示例 1:
输入:n = 13 输出:6
示例 2:
输入:n = 0 输出:0
提示:
0 <= n <= 109
二、代码
class Solution {
public int countDigitOne(int n) {
// 如果n小于1,直接返回0
if (n < 1) {
return 0;
}
// 得到n的位数,例如n -> 13625,numLen = 5位数
int numLen = getNumLength(n);
// 如果n只有一位,那么直接返回1
if (numLen == 1) {
return 1;
}
// 例子
// n 13625
// temp 10000
//
// n 7872328738273
// temp 1000000000000
int temp = (int) Math.pow(10, numLen - 1);
// n的最高位是多少
int first = n / temp;
// n除了最高位以外,剩下数是多少
int restNum = n % temp;
// 计算restNum ~ n 范围上出现1的总次数
// 最高位能提供多少个1
int firstCnt = first == 1 ? restNum + 1 : temp;
// 除了最高位的其他位一共能提供多少个1
int restCnt = first == 1 ? (numLen - 1) * (temp / 10) : first * (numLen - 1) * (temp / 10);
// 返回1出现的总次数,1 ~ restNum范围继续向下递归
return firstCnt + restCnt + countDigitOne(restNum);
}
public int getNumLength(int num) {
int len = 0;
while (num != 0) {
num /= 10;
len++;
}
return len;
}
}
三、解题思路
这道题去每一位单独计算,分别求出来每一位能提供的1的个数即可。
最后
以上就是烂漫胡萝卜为你收集整理的【LeetCode】数字 1 的个数 [H](动态规划)一、题目二、代码三、解题思路 的全部内容,希望文章能够帮你解决【LeetCode】数字 1 的个数 [H](动态规划)一、题目二、代码三、解题思路 所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复