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;
    }
};
原文地址:https://www.cnblogs.com/Bella2017/p/11109584.html