zoukankan      html  css  js  c++  java
  • 排列的学习(java)

    1.无重复排列

    2.有重复排列

    3,下一个排列

    package 生成排列;
    
    
    public class Main {
        static int count=0;
        //a中保存原来的排列,lev表示选定第几个数,len是长度
        public static  void swap(int a[],int lev,int i)
        {
            int temp=a[lev];
            a[lev]=a[i];
            a[i]=temp;
            
            
        }
        public static  void swap(char a[],int lev,int i)
        {
            char temp=a[lev];
            a[lev]=a[i];
            a[i]=temp;
            
            
        }
    
        
        public static void reverse(char c[],int low,int high)
        {
            int l=low;
            int h=high;
            while(l<h)
            {
                swap(c,l,high);
                l++;
                h--;
                
            }
            
            
            
        }
        //利用交换法,获得排列
        public static void  perm(int a[],int lev,int len)
        {
            if(lev==len)
            {
                for(int i=0;i<len;i++)
                {
                    System.out.print(a[i]);
                    
                }
                
                count++;
            }
            else
            {
                for(int i=lev;i<len;i++)
                {
                    swap(a,lev,i);
                    perm(a,lev+1,len);
                    swap(a,lev,i);
                    
                
                    
                    
                    
                    
                }
                
                
                
            }
            
            
            
            
        }
        //带有重复数字的排列
        
        public static void perm2(int a[],int lev)
        {
            if(lev==a.length)
            {
                for(int i=0;i<a.length;i++)
                {
                    System.out.print(a[i]);
                    
                }
                System.out.println();
                count++;
            }
            else
            {
                boolean tf=true;
                for(int j=lev;j<a.length;j++)
                {
                    //对于重复的数据不再交换
                    for(int k=lev;k<j;k++)
                    {
                        if(a[k]==a[j])
                        {
                            tf=false;
                            break;
                        }
                    }
                    
                    if(tf)
                    {
                    swap(a,lev,j);
                    perm2(a, lev+1);
                    swap(a,lev,j);
                    }
                    
                    
                    
                }
                
                
            }
            
            
            
        }
    
        
     //下一个排列 STl
        public static boolean nextPerm(char c[]) //输入原始序列
        {
        
            //找到替换点
            int i=c.length -2;
            while(i>=0&&c[i]>=c[i+1])
            {
                i--;
            }
            if(i<0) //说明是最后一个数,翻转后
            {
                reverse(c,0,c.length-1);
                return false;
                
            }
            else
            {
            //否则的话,找到替换点
            //从右边开始找到第一个大于c[i]的位置
            int j=c.length-1;
            while(c[j]<=c[i])
            {
                j--;
                
            }
            //交换两个值
            swap(c,i,j);
            
            reverse(c,i+1,c.length -1);
            return true;
            
            }
            
            
            
            
            
            
            
            
            
        }
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            int a[]={1,1,1,1,1};
            perm2(a,0);
            System.out.println(count);
            char c[]="1234".toCharArray();
            int count=1;
        /*    while(nextPerm(c))
            {
                
                System.out.println(c);
                count++;
            }
            System.out.println(count);*/
    
        }
            
    
    }
  • 相关阅读:
    Android WelcomeActivity 启动画更换网络图片
    Android 手机号码格式验证
    Android 身份证号码查询、手机号码查询、天气查询
    Android Http请求框架一:Get 和 Post 请求
    自定义带进度条的WebView , 增加获取web标题和url 回掉
    JavaScript之正則表達式入门
    Spring之WEB模块
    【VBA研究】浮点数计算总是有误差的
    CSDN日报20170403 ——《该不该离职?它说了算!》
    怎样清除浏览器缓存?
  • 原文地址:https://www.cnblogs.com/hansongjiang/p/3794534.html
Copyright © 2011-2022 走看看