我今天被问到一个有趣的面试问题。假设你有前n个整数A(例如13425)和另一个排列B(例如43125)的排列。我们必须从第一个排列移动到第二个排列,只能通过将索引1到n-1的值与索引0处的值进行交换。
换句话说,我们可以将序列13425中的索引0和1交换为31425.但我们不能在序列13425中交换索引2和3以产生13245.
最后,在这些交换之后,我们必须进行排列B.任何人都可以提出一个运算时间比O(n ^ 2)更好的算法吗?
答案 0 :(得分:0)
是的,存在O(N)解决方案,这里是java实现:
private static void swap(int[] idx, char[] c, int i) {
idx[c[i]-'0'] = 0;
idx[c[0]-'0'] = i;
char tc = c[0];
c[0] = c[i];
c[i] = tc;
}
public static void permutation(final String from, final String to) {
final int[] idx = new int[10];
final char[] c1 = from.toCharArray();
final char[] c2 = to.toCharArray();
for (int i = 0; i < c1.length; i++) {
idx[c1[i] - '0'] = i;
}
for (int i=(c1.length-1); i>=0; i--) {
if (c2[i] != c1[i]) {
final int charIdx = idx[c2[i]-'0'];
if (charIdx != 0) {
// move char to index 0
swap(idx, c1, charIdx);
}
// move char from 0 to i;
swap(idx, c1, i);
}
}
}