leetcode 443: String Compression,357: Count Numbers with Unique Digits
class Solution { public: int compress(vector<char>& chars) { int cur=0; //记录新数组中元素的位置 for(int i=0, j=0; i<chars.size(); i=j){ while(j<chars.size() && chars[i]==chars[j]) j++; chars[cur++] = chars[i]; //当chars中某个元素只有一个时,退出while循环 if(j-i == 1) continue; for(char c : to_string(j-i)) chars[cur++] = c; } return cur; } };
题意:输入一个非负整数n,寻找[ 0, 10^n) 中 各位上都不相同的数字的总个数。
思路:找规律,发现当前状态(假如是n位数)依赖于前一状态(n-1位)的值再加上f(n)=9*9*8*...*(11-n) (累加个数为n个)。
也就是当第首位为0时,计算剩余位各不相同的个数;和当首位不为0时,有9种可能,第二位(从左数)可以为0,不能和首位相同,有9种可能,第三位可以为0,不能和前两位相同,有8种可能,以此类推。。。
class Solution { public: int countNumbersWithUniqueDigits(int n) { if(n==0) return 1; int res=10; int cnt = 9; for(int i=2; i<=n; i++){ cnt *= (11-i); res+=cnt; } return res; } };