Some one posted this interview question asked by Google.
#include <vector>
#include <string>
#include <iostream>
using namespace std;
// array permutation according to the given permutation
/*
Given permutation {3, 2, 1, 0}, the array is [a, b, c, d];
the array will output as [d, c, b, a];
*/
// if we can change the permutation array.
void applyPermutation(vector<char>& array, vector<int>& perm) {
if(array.size() <= 1) return;
int i = 0;
while(i < perm.size()) {
if(perm[i] == i) {i++;}
else {
swap(array[i], array[perm[i]]);
swap(perm[i], perm[perm[i]]);
}
}
return;
}
// if the permutation can't be changed. whenver the perm[i] is in correct position, we mark the significant bit.
void applyPermutationII(vector<char>& array, vector<int>& perm) {
if(array.size() <= 1) return;
for(int i = 0; i < array.size(); ++i) {
int next = i;
while(perm[next] >= 0) {
swap(array[i], array[perm[next]]);
int tmp = perm[next];
perm[next] -= array.size();
next = tmp;
}
}
for(int i = 0; i < perm.size(); ++i) perm[i] += array.size();
}
int main(void) {
vector<int> perm{1, 3, 2, 0};
vector<char> array{'a', 'b', 'c', 'd'};
applyPermutationII(array, perm);
for(int i = 0; i < array.size(); ++i) {
cout << array[i] << endl;
}
for(int i = 0; i < array.size(); ++i) cout << perm[i] << endl;
}