leetcode_357 Count Numbers with Unique Digits
2016-06-20 10:02
483 查看
题意分析:给定非负的整数n,求在0<=x<10^n中,有多少每个位上的数字互不相同的数?如n=2时,范围为[0,100],共有91个数(除了11,22,33,44,55,66,77,88,99)。
解题思路:
统计规律如下:
根据以上分析,便可编写程序实现。
C++实现
Java实现
参考文献
https://www.hrwhisper.me/leetcode-count-numbers-unique-digits/
解题思路:
统计规律如下:
i = 1时,10个 i = 2时,10个 + 9*9个 i = 3时,10个 + 9*9个 + 9*9*8个 i = 4时,10个 + 9*9个 + 9*9*8个 + 9*9*8*7个 ...... i = n时,10个 + 9*9个 + 9*9*8个 + 9*9*8*7个 + ... + 9*9*8*7*...*(9-i+2)
根据以上分析,便可编写程序实现。
C++实现
// 直接求解实现 int countNumbersWithUniqueDigits1(int n) { if (n == 0) return 1; int result = 10; if (n == 1) return result; int temp = 9; for (int i = 2; i <= n; i++) { temp = temp * (9 - i + 2); result += temp; } return result; } // 利用额外数据进行实现(类似动态规划思想) int countNumbersWithUniqueDigits(int n) { n = min(n, 10); int *p = new int[n+1]; for (int i = 0; i <= n; i++) { p[i] = 9; } p[0] = 1; for (int i = 2; i <= n; i++) { for (int x = 9; x >= 9 - i + 2; x--) { p[i] *= x; } } int result = 0; for (int i = 0; i <= n; i++) result += p[i]; return result; }
Java实现
// 直接实现 public int countNumbersWithUniqueDigits(int n) { if (n == 0) return 1; if (n == 1) return 10; int result = 10; int temp = 9; for (int i = 2; i <= n; i++) { temp *= (9 - i + 2); result += temp; } return result; } // 利用额外数据进行实现(类似动态规划思想) public int countNumbersWithUniqueDigits(int n) { if (n == 0) return 1; if (n == 1) return 10; int [] p = new int[n + 1]; for (int i = 0; i <= n; i++) p[i] = 9; int result = 0; p[0] = 1; for (int i = 2; i <= n; i++) { for (int x = 9; x >= 9 - i + 2; x--) { p[i] *= x; } } for (int i = 0; i <= n; i++) { result += p[i]; } return result; }
参考文献
https://www.hrwhisper.me/leetcode-count-numbers-unique-digits/
相关文章推荐
- leetcode 179 Largest Number
- leetcode 24 Swap Nodes in Pairs
- leetcode 2 Add Two Numbers 方法1
- leetcode 2 Add Two Numbers 方法2
- leetcode----Longest Substring Without Repeating Characters
- [LeetCode]47 Permutations II
- [LeetCode]65 Valid Number
- [LeetCode]123 Best Time to Buy and Sell Stock III
- [LeetCode] String Reorder Distance Apart
- [LeetCode] Sliding Window Maximum
- [LeetCode] Find the k-th Smallest Element in the Union of Two Sorted Arrays
- [LeetCode] Determine If Two Rectangles Overlap
- [LeetCode] A Distance Maximizing Problem
- leetcode_linearList
- leetcode_linearList02
- 021-Merge Two Sorted Lists(合并两个排好序的单链表);leetcode
- LeetCode[Day 1] Two Sum 题解
- LeetCode[Day 2] Median of Two Sorted Arrays 题解
- LeetCode[Day 3] Longest Substring Without... 题解
- LeetCode [Day 4] Add Two Numbers 题解