排列的面试题

1.给定一个由字母和数字组成的字符串,打印所有可能的排列情况。
例如给定"abb",所有排列为"abb",“bab”,“bba”,注意:只有3种输出。
请设计一个函数,完成此功能。(语言不限)

package com.example.demo;
    
    import java.util.ArrayList;
    import java.util.TreeSet;
    
    public class First {
    	public ArrayList<String> Permutation(String str) {
            ArrayList<String> result = new ArrayList<String>();//根据返回类型需要
           if(str==null||str.length()==0){
               return result;
           }
           char[] chars = str.toCharArray();
           TreeSet<String> res = new TreeSet<String>(); //用于排序输出
           getResult(chars,0,str.length()-1,res);
           result.addAll(res) ;//添加到ArrayList
           return result ;
       }
       //获取得到的数组结果
       public void getResult(char[] chars,int start,int end,TreeSet<String> res){
           if(start==end){
               res.add(String.valueOf(chars));
           }else{
               for(int i=start;i<=end;i++){
                   swap(chars,start,i);//换一位
                   getResult(chars,start+1,end,res);//递归
                   swap(chars,start,i);//换回来,保证下次换位是正确的
               }
           }
       }
       //冒泡排序
       public void bubbleSort(char[] chars,int start){
       	int i,j;
       	for(i=start;i<chars.length;i++){
       		for(j=i+1;i<chars.length;j++){
       			if(chars[i]>chars[j]){
       				swap(chars,chars[i],chars[j]);
       			}
       		}
       	}
       }
       //交换两个数之间的位置
       public void swap(char[] chars,int a,int b){
           if(a==b){//因为会出现原位置与原位置交换,直接空即可
    
           }else{
               char temp = chars[a];
               chars[a]=chars[b];
               chars[b]=temp;
           }
       }
       //测试
       public static void main(String[] args){
       	String str="1323";
       	First s=new First();
       	ArrayList<String> list=new ArrayList<>();
       	list=s.Permutation(str);
      	    for(String str1:list){
      		   System.out.println(str1);
       	}
       }
    }

2.给定任意一个自然数,获取它重新排列后,下一个比它大的自然数,要求时间复杂度O(n)。例如:
    给定1233,它的下一个是1323;
    给定1323,它的下一个是1332;
    给定876,它的下一个不存在;
    请设计一个函数,完成此功能。(语言不限)
package com.example.demo;
    
    import java.util.ArrayList;
    import java.util.Scanner;
    
    public class Second{
    	//打印对应的数
    	 public String printNext(String strYuan,ArrayList<String> list){
    	    	String s="不存在";
    	    	long lx=Long.parseLong(strYuan);
    	    	for(String str:list){
    	    		long l=Long.parseLong(str);
    	    		if(l>lx){
    	    		    s=l+"";
    	    		    return s;   
    	    		}
    	    	}
    			return s;
    	    }
    	public static void main(String[] args){
         First s=new First();
         Second se=new Second();
         Scanner sc=new Scanner(System.in);
         String str=sc.nextLine();
      	 ArrayList<String> list=new ArrayList<>();
     	 list=s.Permutation(str);
      	 String s1=se.printNext(str, list);
      	 System.out.println("下一个数是:"+s1);
    	 }
    }

这两道题考察的是基本的数学知识排列,以及程序的继承关系。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值