leetcode 357. Count Numbers with Unique Digits
来源:互联网 发布:7英寸windows平板 编辑:程序博客网 时间:2024/06/15 09:35
Given a non-negative integer n, count all numbers with unique digits, x, where 0 ≤ x < 10n.
Example:
Given n = 2, return 91. (The answer should be the total numbers in the range of 0 ≤ x < 100, excluding [11,22,33,44,55,66,77,88,99]
)
package leetcode;public class Count_Numbers_with_Unique_Digits_357 {public int countNumbersWithUniqueDigits(int n) {if(n==0){return 1;}int result=0;while(n>1){int product=9;//积int multiplier=9;//乘数for(int i=1;i<n;i++){product=product*multiplier;multiplier--;}result+=product;n--;}result+=10;//加上0~9return result;}public static void main(String[] args) {// TODO Auto-generated method stubCount_Numbers_with_Unique_Digits_357 c=new Count_Numbers_with_Unique_Digits_357();System.out.println(c.countNumbersWithUniqueDigits(2));}}大神跟我想法一样,道出了tricks.
This is a digit combination problem. Can be solved in at most 10 loops.
When n == 0, return 1. I got this answer from the test case.
When n == 1, _ can put 10 digit in the only position. [0, ... , 10]. Answer is 10.
When n == 2, _ _ first digit has 9 choices [1, ..., 9], second one has 9 choices excluding the already chosen one. So totally 9 * 9 = 81. answer should be 10 + 81 = 91
When n == 3, _ _ _ total choice is 9 * 9 * 8 = 684. answer is 10 + 81 + 648 = 739
When n == 4, _ _ _ _ total choice is 9 * 9 * 8 * 7.
...
When n == 10, _ _ _ _ _ _ _ _ _ _ total choice is 9 * 9 * 8 * 7 * 6 * 5 * 4 * 3 * 2 * 1
When n == 11, _ _ _ _ _ _ _ _ _ _ _ total choice is 9 * 9 * 8 * 7 * 6 * 5 * 4 * 3 * 2 * 1 * 0 = 0
When n ==12,n==13,n==14 ........ total choice is 0
any number with length > 10 couldn't be unique digits number.
The problem is asking for numbers from 0 to 10^n. Hence return f(1) + f(2) + .. + f(n)
public static int countNumbersWithUniqueDigits(int n) { if (n == 0) { return 1; } int ans = 10, base = 9; for (int i = 2; i <= n && i <= 10; i++) { base = base * (9 - i + 2); ans += base; } return ans;}也有非常老实的不用tricks的大神,使用Backtracking方法来递归进行:
public class Solution {public static int countNumbersWithUniqueDigits(int n) {if (n > 10) {return countNumbersWithUniqueDigits(10);}int count = 1; // x == 0long max = (long) Math.pow(10, n);boolean[] used = new boolean[10];for (int i = 1; i < 10; i++) {used[i] = true;count += search(i, max, used);used[i] = false;}return count;}private static int search(long prev, long max, boolean[] used) {int count = 0;if (prev < max) {count += 1;} else {return count;}for (int i = 0; i < 10; i++) {if (!used[i]) {used[i] = true;long cur = 10 * prev + i;count += search(cur, max, used);used[i] = false;}}return count;}}
- 【LeetCode】357. Count Numbers with Unique Digits
- LeetCode 357. Count Numbers with Unique Digits
- [leetcode] 357. Count Numbers with Unique Digits
- 【LeetCode】357. Count Numbers with Unique Digits
- leetcode 357. Count Numbers with Unique Digits
- leetcode 357. Count Numbers with Unique Digits
- leetcode.357. Count Numbers with Unique Digits
- LeetCode:357. Count Numbers with Unique Digits
- 【leetcode】357. Count Numbers with Unique Digits
- [leetcode] 357. Count Numbers with Unique Digits
- 357.[LeetCode]Count Numbers with Unique Digits
- [LeetCode]357. Count Numbers with Unique Digits
- LeetCode 357. Count Numbers with Unique Digits
- leetcode-357. Count Numbers with Unique Digits
- LeetCode 357. Count Numbers with Unique Digits
- [leetcode] 357. Count Numbers with Unique Digits
- Leetcode 357. Count Numbers with Unique Digits
- LeetCode 357. Count Numbers with Unique Digits
- c#中string与String的区别
- Java多线程之使用执行器(Executors)(Thinking in Java)
- Java SE基础知识
- faster-rcnn介绍
- 对SPEA算法的一些总结
- leetcode 357. Count Numbers with Unique Digits
- 关于ios 三方库文件冲突解决方案
- Mat对象的使用及注意事项
- Spark Streaming 实战案例(四) Spark Streaming 缓存、Checkpoint机制
- Jedis的多种使用方式
- POJ 1321-棋盘问题(A)
- iOS函数响应式编程应用研究
- Windows x64内核中修改进程入口点
- 【Django】使用ImageField