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);
}
}
这两道题考察的是基本的数学知识排列,以及程序的继承关系。