阿里面试 8-28 全排列去重问题
先看 剑指offer 全排列去重问题的问题
27 字符串的排列
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则按字典序打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
DFS进行递归+回溯法解
import java.util.*;
public class Solution {
StringBuffer strbuffer=new StringBuffer();
TreeSet<String> treeSet=new TreeSet<String>();
boolean[] visit;//回溯标记,判断是否访问过
public ArrayList<String> Permutation(String str) {
ArrayList<String> arraylist=new ArrayList<String>();
if(str.equals("")||str==null) return arraylist;
//排序 按照字母排序
char[] strs=str.toCharArray();
Arrays.sort(strs);
visit=new boolean[str.length()];
dfs(strs,strs.length);//深度优先遍历
arraylist.addAll(treeSet);
return arraylist;
}
public void dfs(char[] chars,int len){
if(strbuffer.length()==len){
treeSet.add(strbuffer.toString());
return;
}
for(int i=0;i<chars.length;i++){
if(visit[i]==false){
visit[i]=true;
strbuffer.append(chars[i]);
dfs(chars,len);
visit[i]=false;
strbuffer.deleteCharAt(strbuffer.length()-1);
}
}
}
}
数字的全排列
输入两个数 322 2
第一个数代表需要全排列的数字322,去掉全排列后以0开头的数字,并输出有几个数可以把2整除
输出 2
一、String转为int
int i=Integer.parseInt(string);
int i=Integer.valueOf(s);
二、int转为String
String s = String.valueOf(i);
String s = Integer.toString(i);
String s = “”+ i;
import java.util.Iterator;
import java.util.Scanner;
import java.util.TreeSet;
public class Main {
static StringBuffer strbuffer=new StringBuffer();
static TreeSet<String> treeSet=new TreeSet<String>();
static boolean[] visit;//回溯标记,判断是否访问过
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);//输入
int n=sc.nextInt();//获取第一个数
int m=sc.nextInt();//获取第二个数
String str=n+"";//数字转成字符串
if(str==null||str.equals("")) return;
visit=new boolean[str.length()];
dfs(str,str.length());//深度优先遍历
Iterator<String> it=treeSet.iterator();//迭代器
int count=0;//计数
while(it.hasNext()){
String s=it.next();
if(s.charAt(0)!='0'){ //去掉0开头的
int num=Integer.valueOf(s);
if(num%m==0){ //是否整除m
count++;
}
}
}
System.out.println(count);
}
public static void dfs(String str,int len){
if(strbuffer.length()==len){//递归终止条件
treeSet.add(strbuffer.toString());//加入treeset
return;
}
for(int i=0;i<str.length();i++){
if(visit[i]==false){//判断是否访问
visit[i]=true;//设置已访问
strbuffer.append(str.charAt(i));//加入到字符串中
dfs(str,len);//继续递归
visit[i]=false;//回溯 释放已访问,表示没有访问
strbuffer.deleteCharAt(strbuffer.length()-1);//移除刚刚的加入的字符
}
}
}
}