1、利用HashSet的性质,元素不重复
package test03;
import java.util.Arrays;
import java.util.HashSet;
public class test09 {
private static HashSet<String>set=new HashSet<String>();
public static void main(String[] args) {
int [] array={1, 2, 2};
permutation(array, 0);
for (String str : set) {
System.out.println(str);
}
}
/* [1, 2, 3]
* [1, 3, 2]
* [2, 1, 3]
* [2, 3, 1]
* [3, 2, 1]
* [3, 1, 2]
1、将当前元素与后面位置的每个元素依此交换
2、交换后取后一个位置的元素为当前元素的位置,再执行1
3、当当前位置是最后一个元素的位置则输出
*/
public static void permutation(int[] array,int start){
if(start==array.length-1){//表示只有一个字符,返回
set.add(Arrays.toString(array));
}else{
for(int i=start;i<array.length;i++){
swap(array, start,i);//当前位置元素与后面位置的元素依次替换
permutation(array, start+1);
swap(array,start,i);//将位置换回来,继续做下一个排列
}
}
}
public static void swap(int [] array,int s,int i){
int temp=array[s];
array[s]=array[i];
array[i]=temp;
}
}
2、遍历加if判断条件
package test03;
import java.util.Arrays;
import java.util.HashSet;
public class test10 {
public static void main(String[] args) {
int [] array={1, 2, 2};
permutation(array, 0);
}
/* [1, 2, 3]
* [1, 3, 2]
* [2, 1, 3]
* [2, 3, 1]
* [3, 2, 1]
* [3, 1, 2]
1、将当前元素与后面位置的每个元素依此交换
2、交换后取后一个位置的元素为当前元素的位置,再执行1
3、当当前位置是最后一个元素的位置则输出
*/
public static void permutation(int[] array,int start){
if(start==array.length-1){//表示只有一个字符,返回
System.out.println(Arrays.toString(array));
}else{
for(int i=start;i<array.length;i++){
if(isSwap(array, start, i)){
swap(array, start,i);//当前位置元素与后面位置的元素依次替换
permutation(array, start+1);
swap(array,start,i);//将位置换回来,继续做下一个排列
}
}
}
}
public static void swap(int [] array,int s,int i){
int temp=array[s];
array[s]=array[i];
array[i]=temp;
}
//判断[begin,end)中是否有与end的相等
public static boolean isSwap(int [] array,int begin,int end ){
for(int i=begin;i<end;i++){
if(array[i]==array[end]){
return false;
}
}
return true;
}
}