今日头条面试算法题——全排列

记一次亲身经历今日头条面试题。

题目描述:给定一个数字,按照原有数字中的各个位上面的数字进行组合,求出比原有数字大的数中最小的数。例如:1234 -> 1243 ,1243 ->1324 ,1324 -> 1342。

解题思路:
1.先将原有数字中的个,十,百,千…位上面的数字取出来,并进行全排列。
2.将全排列得到的数字再进行可以得到由原来数字组合组成的所有的数字。
3.将第二部得到的数字排序,找出题目要求的数。

代码如下:

public class test{
public static int a[] = new int[10];
public static int q = 0;
public static int x[] = new int[30];

public static void main(String args[]) {
	int an = 8734;
	int ans = an;
	int i = 0;
	while(true) {				//求出给定的数字中的个,十,百,千,各个位上的数,并放到数组中
		if (an>10) {
			a[i] = an%10;
			an /= 10;
		}else {
			a[i] = an;
			break;
		}
		i++;
	}
	pailie(0,i);
	search(ans);
	System.out.println(Arrays.toString(x));
}
public static void pailie(int i,int j) {		//全排列算法,对个,十,百,千位上面的数字全排列
	if (i == j) {
		int e = 0;
		for (int m = 0;m<=j;m++) {
			x[q] += a[m]*Math.pow(10,e++);		//对全排列之后每种的情况放到运算之后得到对应的数字放到x[]数组中
		}
		q++;
	}else {
		for (int p = i;p<=j;p++) {
			swap(p,i);
			pailie(i+1,j);
			swap(p,i);
		}
	}
}
public static void swap(int i,int j) {
	int z = a[i];
	a[i] = a[j];
	a[j] = z;
}
public static void search(int ans) {		//对x[]数组中的数字进行直接排序
	for (int i = 0;ix[j]) {
				int x1 = x[i];
				x[i] = x[j];
				x[j] = x1;
			}
		}
	}
	for(int h = 0;hans) {
			System.out.println(x[h]);
			break;
		}
	}
}

}

你可能感兴趣的:(今日头条面试算法题——全排列)