求n位全排列字典排序后,给定序列的下一序列

求n位全排列字典排序后,给定序列的下一序列。

例如n=3的全排列:123,132,213,231,312,321.   给定序列213,则需要输出231

思考:按字典排序后,要输出给定序列N的下一序列,则要尽量保证前面的几位不变,变化数字的位置越靠后,则数值改变越小。

public static  int  nextArray ( int N  , int n ){
            int  a []= new int  [  n ];
            int  i =0;
            int  M =0;
            for ( int p  = n  -1; p  >=0; p  --){             //将N的各位上的数字顺序存储在a[]中
                int  A =( int ) Math.pow (10, p );
                a [  i ]=  N /  A ;
                N =  N %  A ;
                i ++;
          }
            i =  n -1;
            while ( i >0&& M ==0){
                if ( a [ i ]> a [ i -1]){               //找到要改变数字的位置
                     int  k = i -1;
                     int  temp = a [ k ];
                   java.util.Arrays.sort( a , k , n );   //从改变位起,小到大排序
                     while ( temp != a [ k ]){
                         k ++;
                   }
                     temp =  a [  k +1];
                     while ( k >= i -1){                  //找到提前的数字取出,调整序列
                         a [ k +1]= a [ k ];
                         k --;
                   }
                     a [  i -1]=  temp ;
                     int  j =0;
                     for ( i = n -1; i >=0; i --){               
                         M = M + a [ i ]*( int )(Math.pow(10, j ));
                         j ++;
                   }   
              }
                i --;
          }
            return  M  ;
     }

public static  void  printArray( int [] a ){
            for ( int i  =0; i  < a  .length; i  ++){
             System.  out .print( a [ i ]+ "\t" );
          }
     }
     
public static  void  main(String args []){
            int  X =0;
            X nextArray(23541,5);
           System.  out .print( "\n下一个数" + X );
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值