题目:排列序号

给出一个不含重复数字的排列,求这些数字的所有排列按字典序排序后该排列的编号。其中,编号从1开始。

您在真实的面试中是否遇到过这个题?
Yes
哪家公司问你的这个题? Airbnb Alibaba Amazon Apple Baidu Bloomberg Cisco Dropbox Ebay Facebook Google Hulu Intel Linkedin Microsoft NetEase Nvidia Oracle Pinterest Snapchat Tencent Twitter Uber Xiaomi Yahoo Yelp Zenefits
感谢您的反馈
样例

例如,排列[1,2,4]是第1个排列。

相关题目 Expand         




count = a(n-1)!+b(n-2)!+......
a,b..代表第i位的实际位置

public class Solution {
    /**
     * @param A an integer array
     * @return a long integer
     */
    public long permutationIndex(int[] A) {
        // Write your code here
        if(null==A||0==A.length){
               return 1;
          }
          long res = 1;
          for(int i=0;i<A.length-1;i++){
               res +=findPos(A, i)*muti(A.length-1-i);
          }
          return res;
     }
     public int findPos(int[] A,int s){
          int pos = 0;//表示第几大
          for(int i=s+1;i<A.length;i++){
               if(A[i]<A[s]){
                    pos++;
               }
          }
          return pos;
     }
     public long  muti(int n){
          long  mu = 1;
          for(int i=n;i>1;i--){
               mu *=i;
          }
          return mu;
    
    }
}

  


字典排序(不包含重复数字)
    public   void   swap( int   l ,   int   r , int []   A ) {
              int   tmp   =   A [   l ];
              A [   l ] =   A [   r ];
              A [   r ] =   tmp ;
     }

      /*
      * 将所有的排列保存在list中 利用交换的思想,
      * 先,求所有可能出现在第一个位置的字符,
      *
      * 其次,把第一个字符和其后面的字符一一交换。如下图所示,分别把第一个字符a和后面的b、c等字符交换的情形。
      *
      * 接着,固定第一个字符,求后面所有字符的排列。这个时候我们仍把后面的所有字符分成两部分:后面字符的第一个字符,以及这个字符之后的所有字符。
      * 然后把第一个字符逐一和它后面的字符交换
      */
      public   void   allPermutation(   int []   A ,ArrayList<   int []>   allList , int   s   , int   e   ){
      if ( s == e ){
              int []   tmp   =   new   int [   A .   length ];
              for (   int   i =0;   i <   A .   length ;   i ++){
                   tmp [   i ] =   A [   i ];
           }
              allList .add(   tmp );
     } else {
              for (   int   i =   s ;   i <=   e ;   i ++){
                swap(   s ,   i ,   A );
                allPermutation(   A ,   allList ,   s +1,   e   );
                swap(   s ,   i ,   A );
           }
     }
    }





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值