通过交换第一个整数在置换之间移动的算法

时间:2017-04-24 23:28:47

标签: algorithm sorting

我今天被问到一个有趣的面试问题。假设你有前n个整数A(例如13425)和另一个排列B(例如43125)的排列。我们必须从第一个排列移动到第二个排列,只能通过将索引1到n-1的值与索引0处的值进行交换。

换句话说,我们可以将序列13425中的索引0和1交换为31425.但我们不能在序列13425中交换索引2和3以产生13245.

最后,在这些交换之后,我们必须进行排列B.任何人都可以提出一个运算时间比O(n ^ 2)更好的算法吗?

1 个答案:

答案 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);
        }
    }
}