给定一个非负整数 n,计算各位数字都不同的数字 x 的个数,其中 0 ≤ x < 10n。
示例:
给定 n = 2,返回 91。(答案应该是除[11,22,33,44,55,66,77,88,99]外,0 ≤ x < 100 间的所有数字)
一道简单的数数问题,没去想简单的方法,直接枚举判断是否符合条件。
这里判断的时候用到了set判断是否有重复元素。细节见代码:
class Solution { public: int countNumbersWithUniqueDigits(int n) { if (n == 0) { return 1; } if (n == 1) { return 10; } set<int> res; int result = 11; int end = 1; int t = 0; bool flag = false; while (t < n) { end *= 10; t++; } int start = 0; for (int i = 11; i < end; i++) { flag = false; start = i; res.clear(); while (start > 0) { int temp = start % 10; start = start / 10; if (res.find(temp) != res.end()) { flag = true; break; } else { res.insert(temp); } } if (!flag) { result++; } } return result; } };人如其码,是的很挫的一段代码,虽然能够跑通,但是在n=7时提示超时,没办法只能找规律进行改进。用到组合数的思想,每增加一个位置,可选择的数字就少一个。
class Solution { public: int countNumbersWithUniqueDigits(int n) { if (n == 0) { return 1; } int result = 10; int count = 9; for (int i = 1; i < n;i++) { result += count*(10 - i); count *= (10 - i); } return result; } };