题目二:图书排列
思路:定义一个方法swap用于交换元素,isNear函数用于判断是否有相邻的数据,true表示没有。接着在getNum方法中,进行全排列,每次全排列的结果都判断一下是否有相邻的数据,如果没有num++。遍历数组,找到start和end间的全排序,为了保证每个元素都能在第一个位置,利用一个循环将start和i位置进行交换,确定完第一个后,接着找start+1和end间的全排序,每次进行后都需要再次进行交换,以便复原数据。
代码:
public class Main {
public static int num=0;
public static void main(String[] args) {
int[] nums= {1,2,3,4,5,6,7,8,9,10};
getNum(nums, 0, nums.length-1);
System.out.println(num);
}
public static void getNum(int[] nums,int start,int end) {
if(start==end) {
if(isNear(nums)) {
num++;
}
}
for(int i=start;i<=end;i++) {
swap(nums,i,start);
getNum(nums, start+1, end);
swap(nums, i, start);
}
}
public static void swap(int[] nums,int i,int j) {
int temp=nums[i];
nums[i]=nums[j];
nums[j]=temp;
}
//判断是否有相邻的,true表示没有,false表示有
public static boolean isNear(int[] nums) {
boolean flag=true;
for(int i=0;i<nums.length-1;i++) {
if(Math.abs(nums[i]-nums[i+1])==1) {
flag=false;
break;
}
}
return flag;
}
}
运行成功截图: