求0到数字n中的所有数字中某一个数字k出现的总次数
今天在leetcode上面遇到了一道题:
编写一个方法,计算从 0 到 n (含 n) 中数字 2 出现的次数。
这道题最好的解法是动态规划。分析如下:设dp[i]标志这个数字前i位中出现了2的次数,那么我们需要求的是dp[i]和的dp[i - 1]的关系。比如说一个数字2849,那么dp[2]就表示0~49中出现2的数量,dp[3]就表示0~849中出现2的数量,dp[4]就表示0~2849中出现2的数量。分析如下:
因为我们要求的是2出现的次数,那么根据第i位的数字,我们可以分类讨论:
1. 第i位是0
例如:n = 102, 分析dp[2]和dp[1]的关系,即dp(02)与dp(2) (02就是2,两者的结果是相同的,但是0又是不可或缺的)
第i位是0,该位取值范围只有这一种可能,2的数量也不可能增加,由此可得
dp[02] = dp[2]
2. 第i位是1
例如:n = 178,分析dp[3]和dp[2]的关系,即dp(178)与dp(78)(括号就表示range(0~178),实际上的dp[3]和dp[2]的关系)第3位是1,该位可能取0,1两种情况:
dp[3] = 当第3位是0,1-2位取00~99时2的次数 + 当第3位是1, 1-2位取00~78时2的次数
dp[3] = dp(99) + dp[2]
dp(178) = dp(99) + dp(78)
3. 第i位是2
例如:n = 233, 分析dp[3]和dp[2]的关系,即dp(233)与dp(33)
dp[3] = 第3位取0-1,1-2位取00~99时2的次数 + 第3位是2,1-2位取00~33时2在1-2位出现的次数 + 第3位是2,1-2位取00~33时2在第3位出现的次数.
dp[3] = 2 * dp(99) + dp[2] + 34(实际上是33 + 1)
dp(233) = 2 * dp(99) + dp(33) + 34
4 第i位大于2
以 n = 478为例,分析dp[3]和dp[2]的关系,即dp(478)与dp(78)
dp[3] = 第3位取0-3,1-2位取00-99时2出现在1-2位的次数 + 第3位取4,1-2位取00-78时2的次数 + 第3位取2,1-2位取00-99时2出现在第3位的次数
dp[3] = 4 * dp(99) + dp[2] + 100
总结来看,一个数字n,假设第i位为k, 那么dp[i] = k * dp(99) + dp[i - 1] + n % pow(10, i - 1) + 1(如果k==2) + pow(10, i -1)(如果k > 2)。
所以我们存两种东西:一种是真正的dp[i][0]表示前i位数字包含2的数量,第二种是dp[i][1]表示99...(一共i个9)...99包含的2的数量,也就是dp(99...(一共i个9)...99).
代码如下:
class Solution {
public:int numberOf2sInRange(int n) {int digit = getdigit(n);vector<vector<int>> dp(digit + 1, vector<int>(2, 0));//dp[i][0]表示从一共i位数字情况下出现2的个数,di[i][1]表示99...9一共i个9的情况2的数量dp[1][0] = (n % 10 <= 1) ? 0 : 1;dp[1][1] = 1;for (int i = 2; i <= digit; i++){int k = getk(n, i);int cnt = k * dp[i - 1][1] + dp[i - 1][0];if (k == 2){cnt += (n % (int)pow(10, i - 1)) + 1;}else if (k > 2){cnt += (int)pow(10, i - 1);}dp[i][0] = cnt;//try{dp[i][1] = 10 * dp[i - 1][1] + (int)pow(10, i - 1);//}//catch(exception& e){//}}return dp[digit][0];}//获得n有多少位数int getdigit(int n){int cnt = 0;while (n > 0){n /= 10;cnt++;}return cnt;}//获得数字n 从右边第k位置的数字是多少int getk(int n, int k){for (int i = 1; i < k; i++) n /= 10;return n % 10;}
};
求0到数字n中的所有数字中某一个数字k出现的总次数相关推荐
- java替换最后一个字符_Excel公式技巧23: 同时定位字符串中的第一个和最后一个数字...
学习Excel技术,关注微信公众号: excelperfect 在很多情况下,我们都面临着需要确定字符串中第一个和最后一个数字的位置的问题,这可能是为了提取包围在这两个边界内的子字符串.然而,通常的公 ...
- 有什么计算机可以拆分数字,一招教你在Excel中将一个数字拆分为多个数字之和...
一招教你在Excel中将一个数字拆分为多个数字之和 腾讯视频/爱奇艺/优酷/外卖 充值4折起 相信很多小伙伴在日常办公中都会用到Excel,在其中如何才能将一个数字拆分为多个数字之和呢?方法很简单,下 ...
- java数字计算结果_Java编写程序之输入一个数字实现该数字阶乘的计算
需求说明: 编写Java程序,输入一个数字,实现该数字阶乘的计算.一个数字的阶乘是所有小于及等于该数的正整数的积,自然数n的阶乘写作n! .例如,5的阶乘等于1*2*3*4*5,表示为5! = 120 ...
- 重集合中找出最相近的一个数字
1.网友提供代码 1 private static decimal getNear(List<decimal> num, decimal target) 2 { 3 List<dec ...
- python中的输出list中元素方法_python 输出所有列表元素的乘积
def multiply_list(items): tot = 1 for x in items: tot *= x return tot print(multiply_list([1,2,-8])) ...
- 汇编: mul乘法指令(字乘法结果在dx:ax中,8位乘法:一个乘数默认放在al中)
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/m0_37564426/article/ ...
- python怎么输入一个数字并调用_Python3 实例(一)
原标题:Python3 实例(一) Python Hello World 实例 以下实例为学习Python的第一个实例,即如何输出"Hello World!": 实例 # -*- ...
- 从控制台输入一个数字表示某个班学生人数,然后创建一个表示该班级所有学生名字的字符串数组,并使用控制台输入学生名字赋值给数组的每一个元素,最后输出所有学生姓名。
Java控制台输入字符存储在数组中 题目:** 从控制台输入一个数字表示某个班学生人数,然后创建一个表示该班级所有学生名字的字符串数组,并使用控制台输入学生名字赋值给数组的每一个元素,最后输出所有学生 ...
- python数字判断规则_判断Python输入是否为数字、字符(包括正则表达式)-阿里云开发者社区...
当键入字符串时候,我们自己就可以判断了! 一:我们在程序把输入的数字当字符串处理 import re print("我现在要写一个文件数字猜游戏数字游戏:") temp=input ...
最新文章
- [tool] AI视频翻译 解决英文视频字幕问题(类似youtube自动生成字幕)
- 解决ajax获取不到按钮的id
- 【论文解读】目标检测一卷到底之后,终于有人为它挖了个新坑|CVPR2021 Oral
- red hat 6 安装php,Red hat linux服务器简明安装手册(OpenSSL+Mysql+Apache2+PHP)
- 【C】C语言结构体指针的语法
- php滴滴平台接口,图片服务API文档
- 狼抓兔子(HYSBZ-1001)
- 寒假集训日志(二)——最小生成树,拓扑排序,欧拉回路,连通路
- 解决 【git checkout -b dev origin/dev】报错的问题
- jQuery基础 - 选择器
- LQ-1600K打印机色带传动故障分析
- 迅捷PDF编辑器调整PDF文件页面图文教程
- 跨专业考研渣硕是如何拿到BAT、TWH等研发offer的!
- 用两个小例子来解释单例模式中的“双重锁定”
- Web安全-ReDos正则表达式的拒绝服务攻击
- WordPress整合ckplayer X3视频播放器插件
- 电感的能量储存在哪里-深度解析(4)
- 基于Python语言量化金融分析师AQF实训项目
- Java搭建订单状态机模型
- 全同态加密(FHE)设计思路
热门文章
- 0基础学python做什么工作好-零基础学Python,越早明白这些,越快找到好工作!...
- 零基础学python pdf-笔记《零基础入门学习Python(第2版)》PDF+课件+代码分析
- python基础教程菜鸟教程-终于懂得python入门菜鸟教程
- python怎么读取txt文件-Python笔记(读取txt文件中的数据)
- python入门基础知识实例-Python入门,原来如此简单!
- 零基础学python图文版-给伸手党的福利:Python 新手入门引导
- 语音识别几成标配,哈弗F7的智能语音系统有何不同?
- 林斌宣布好消息!语音识别大佬、Kaldi之父加盟小米
- 大学计算机文档基本操作实验的效果,上海工程技术大学计算机实验报告5
- mysql索引 倒排表_mysql倒排的优化