力扣357(java)-统计各位数字都不同的数字个数(中等)
题目:
给你一个整数 n ,统计并返回各位数字都不同的数字 x 的个数,其中 0 <= x < 10n 。
示例 1:
输入:n = 2
输出:91
解释:答案应为除去 11、22、33、44、55、66、77、88、99 外,在 0 ≤ x < 100 范围内的所有数字。
示例 2:
输入:n = 0
输出:1
提示:
- 0 <= n <= 8
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/count-numbers-with-unique-digits
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路:【数学思维】
当n == 0时,10n == 1,满足条件的数字只有0,即为1个,f(0) = 1;
当n == 1时,10n == 10,满足条件的数字有0~9,即共10个,f(1) = 10;
当n == 2时,10n == 100,满足条件的数字分为两部分,一部分是n == 1时的10个数字,一部分是两位数的数字,相当于第一位数字在1~9(不能为前导零)中任取一个,第二个数字只能取与第一个数字不相同的其他9个数字;例如第一个数字取3,第二个数字只能取除3以外的数字。即为30,31,32,34,35,36,37,38,39,新增 9*9个数字,即 f(2) = f(1) + 9 * 9;
当n == 3时,10n == 1000,满足条件的数字分为三部分,一部分是n == 1时的10个数字,一部分是两位数的数字,就是9*9,一部分是三位数,只是第三位数可取的只能有8个即新增9*9*8,即 f(3) = f(1)+9*9+9*9*8=f(2)+9*9*8;
当n==4时,与n==3同理, f(4) = f(1)+9*9+9*9*8+9*9*8*7=f(3)+9*9*8*7;
根据规律,推导出通式:
f(n)= f(n-1)+[f(n-1)-f(n-2)]*[10-(n-1)]
推导草稿:

代码:
1 class Solution {
2 public int countNumbersWithUniqueDigits(int n) {
3 if(n == 0) return 1;
4 int[] f = new int[n+1];
5 f[0] = 1;
6 f[1] = 10;
7 for(int i = 2; i <= n; i++){
8 f[i] = f[i-1] +(f[i-1] - f[i-2]) * (10-(i-1));
9 }
10 return f[n];
11 }
12 }

力扣357(java)-统计各位数字都不同的数字个数(中等)的更多相关文章
- LeetCode-357 统计各位数字都不同的数字个数
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/count-numbers-with-unique-digits 题目描述 给你一个整数 n ,统 ...
- java统计英文字母、空格、数字和其它字符的数目
package tes; import java.util.Scanner; //java统计英文字母,空格,数字和其它字符的数目 public class ZiFuTongJi { public s ...
- 力扣——single number (只出现一次的数字) python实现
题目描述: 中文: 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次.找出那个只出现了一次的元素. 说明: 你的算法应该具有线性时间复杂度. 你可以不使用额外空间来实现吗? 英 ...
- 刷题-力扣-剑指 Offer 15. 二进制中1的个数
剑指 Offer 15. 二进制中1的个数 题目链接 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/er-jin-zhi-zhong-1de- ...
- 力扣Leetcode 1248. 统计「优美子数组」
统计「优美子数组」 给你一个整数数组 nums 和一个整数 k. 如果某个 连续 子数组中恰好有 k 个奇数数字,我们就认为这个子数组是「优美子数组」. 请返回这个数组中「优美子数组」的数目. 示例 ...
- Java 统计整数二进制中1的个数
package cookie; public class CountBinary_1 { public static void main(String[] args) { System.out.pri ...
- 力扣Leetcode 面试题56 - I. 数组中数字出现的次数
面试题56 - I. 数组中数字出现的次数 一个整型数组 nums 里除两个数字之外,其他数字都出现了两次.请写程序找出这两个只出现一次的数字.要求时间复杂度是O(n),空间复杂度是O(1). 示例 ...
- JAVA 统计字符串中中文,英文,数字,空格的个数
面试题:输入一行字符,分别统计出其中英文字母.中文字符.空格.数字和其它字符的个数 可以根据各种字符在Unicode字符编码表中的区间来进行判断,如数字为'0'~'9'之间,英文字母为'a'~'z'或 ...
- Java经典案例之-“统计英文字母、空格、数字和其它字符的个数”
/** * 描述:输入一行字符串,并且统计出其中英文字母.空格.数字和其它字符的个数. * 分析:利用for语句,条件为输入的字符不为 '\n ' * 作者:徐守威 */ package com.xu ...
- JAVA 统计字符串中中文,英文,数字,空格,特殊字符的个数
引言 可以根据各种字符在Unicode字符编码表中的区间来进行判断,如数字为'0'~'9'之间,英文字母为'a'~'z'或'A'~'Z'等,Java判断一个字符串是否有中文是利用Unicode编码来判 ...
随机推荐
- DRC音频处理算法原理解析及仿真结果
一 概念: 在声学领域中,DRC(Dynamic range compression) 一般用来动态调整音频输出幅值,在音量大时压制音量在某一范围内,在音量小时适当提升音量.通常用于控制音频输出功率, ...
- day18--Java集合01
Java集合01 1.什么是集合? 前面我们保存数据使用的是数组,数组有不足的地方,我们来分析一下: 长度开始时必须指定,而且一但指定不能更改 保存的必须是同一类型的元素 使用数组进行增加/删除元素的 ...
- @Autowired和@Resource整理
参考,欢迎点击原文:https://www.ixigua.com/6991282608663593508?id=6945836219422999079&logTag=944f6616c791c ...
- python读取文本多行合并一行
# 需要合并的行数 col = 4 # 创建新文件 nf = open("*.txt", "w+") # 读取初始文件 with open("*.tx ...
- Qt HTTP网络相关GET,POST(HTTP 模拟POST 表单(multipartform)最简单和正式的方法)
PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明 本文作为本人csdn blog的主站的备份.(Bl ...
- Django:Could not find backend 'django_redis.cache.RedisCache': cannot import name 'six'
1.报错内容: django.core.cache.backends.base.InvalidCacheBackendError: Could not find backend 'django_red ...
- 【LeetCode刷题】744. 寻找比目标字母大的最小字母
744. 寻找比目标字母大的最小字母(点击跳转LeetCode) 给你一个排序后的字符列表 letters ,列表中只包含小写英文字母.另给出一个目标字母 target,请你寻找在这一有序列表里比目标 ...
- [Git]入门及其常用命令
[版权声明]未经博主同意,谢绝转载!(请尊重原创,博主保留追究权) https://www.cnblogs.com/cnb-yuchen/p/17993832 出自[进步*于辰的博客] Git 的难点 ...
- Linux服务器部署Web版VSCode,在window下使用浏览器在linux环境下编写代码
最近尝试了一下在Linux服务器上部署VSCode,也就是code-server,然后在windows电脑上通过浏览器访问打开在线编辑器编写代码,以下记录一下部署过程. 1.在linux服务器上安装c ...
- java基础 韩顺平老师的 面向对象(高级) 自己记的部分笔记
373,类变量引出 代码就提到了问题分析里的3点 package com.hspedu.static_; public class ChildGame { public static void mai ...