permutation 问题小结——康托展开

昨天做百度的校招笔试题,又碰到了类似于permutation的题目,求其在其序列中是第几小的,这类题目和leetcode上的题目类似

Permutations:输出所有的序列组合,这里其实可以用库函数中的next_permutation()

PermutationsII:同上,只是序列中有重复的数字,注意标记即可

Permutation Sequence:根据k,输出当前序列的第k大的数


百度题,就是利用康托展开求解,当前数是第几大的,而且还比Permutation Sequence简单,不需要判断当前数是否重复使用。

#include 

using namespace std;

const int SIZE=12;
int hash(char *s,int * fac,int len)
{

    int res=0;
    for(int i = 0; i < len; i++)
    {
        int cnt = 0;
        for(int j = i + 1; j < len ; j++)
        if(s[j] < s[i])
            cnt++;

        res += fac[len-i-1]*cnt;
    }
    return res;
}
int main()
{

    //freopen("in.txt","r",stdin);

    int n;
    int res;
    char s[15];
    cin >> n;

    int fac[SIZE];
    fac[0] = 1;
    for(int i = 1; i < SIZE; ++i) 
       fac[i] = i*fac[i-1];

    int res=0;
    for(int i = 0; i < len; i++)
    {
        int cnt = 0;
        for(int j = i + 1; j < SIZE ; j++)
        if(s[j] < s[i])
            cnt++;

        res += fac[SIZE-i-1]*cnt;
    }

    cout << res +1 << endl;
    return 0;
}
 
  

你可能感兴趣的:(随笔)