排列序号

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

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

import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;

/**
 * 给出一个不含重复数字的排列,求这些数字的所有排列按字典序排序后该排列的编号。其中,编号从1开始。
样例
例如,排列 [1,2,4] 是第 1 个排列。
 * 
 * @author Dell
 *
 */
public class Test197 {
   public static void backtracking(int[] a,int k,List<Integer> list,List<List<Integer>> result)
   {
         if(k<0||a.length==0)
        	 return;
         if(k==a.length)
         result.add(new ArrayList<>(list));
         else
         {
        	 for(int i=0;i<a.length;i++)
        	 {
        		 if(list.contains(a[i])) continue;
        		 list.add(a[i]);
        		 backtracking(a,k+1,list,result);
        		 list.remove(list.size()-1);
        	 }
 
         }
   }
   
   public static long permutationIndex(int[] a)
   {       if(a.length==0)
	        return 0;
	       if(a.length==1)
	    	  return 1;
	     long sum=0;
	    for(int i=0;i<a.length-1;i++)
	    {
	    	int[] temp=Arrays.copyOfRange(a, i, a.length);
	    	Arrays.sort(temp);
	    	int x=find(temp,a[i]);
	    	//int dup=cishu(a,i);
	    	sum=sum+(x*f(a.length-1-i));
	    }
	    return sum+1;  
   }
  /* public static int cishu(int[] a, int i)
   {
	     int count=0;
	     for(int j=0;j<i;j++)
	     {
	    	 if(a[j]==a[i])
	    	 {
	    		 count++;
	    	 }
	     }
	    return count; 
	   
   }*/
   public static int find(int[] b ,int target)
   {       int index=-1;
	   for(int i=0;i<b.length;i++)
	   {
		   if(b[i]==target)
		   {  
			   index=i;
			   break;
		   }
	   }
	   return index;
   }
   public static long f(int n)
   {
	   if(n==0||n==1)
		   return 1;
	   else
		   return n*f(n-1);
   }
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		int n=sc.nextInt();
		int[] a=new int[n];
		for(int i=0;i<a.length;i++)
		{
			a[i]=sc.nextInt();
		}
		/*List<Integer> target=new ArrayList<>();*/
		/*for(int i=0;i<a.length;i++)
		{
			target.add(a[i]);
		}*/
		/*  Arrays.sort(a);
		List<Integer> list=new ArrayList<>();
		List<List<Integer>> result=new ArrayList<>();
		backtracking(a,0,list,result);
         for(int i=0;i<result.size();i++)
         {        int j;
        	 for(j=0;j<result.get(i).size();j++)
        	 {
        		 if(result.get(i).get(j)!=target.get(j))
        			 break; 
        	 }
        	 if(j>=result.get(i).size())
        	 {
        		 System.out.println(i+1);
        		 break;
        	 }
         }*/
		System.out.println(permutationIndex(a));
	}

}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值