package com.interview.string;
/**
* http://www.geeksforgeeks.org/an-in-place-algorithm-for-string-transformation/
*/
public class InPlaceTransformationOfString {
private void reverse(char []str, int low, int high){
while(low<high){
swap(str,low,high);
low++;
high--;
}
}
private void swap(char str[],int index1,int index2){
char temp = str[index1];
str[index1] = str[index2];
str[index2] = temp;
}
public void cycleLeaderIteration(char []str,int start,int end){
int power = 1;
int index = start,new_index;
int len = end -start +1;
char temp,temp1;
while(power < len){
index = start+power;
new_index = start;
temp = str[index];
while(new_index != power + start){
if(index % 2 == 0){
new_index = (index+start)/2;
}else{
new_index = len/2 + (index+start)/2;
}
temp1 = str[new_index];
str[new_index] = temp;
temp = temp1;
index = new_index;
}
power *= 3;
}
}
public void inPlaceTransformationImproved(char str[]){
int low=0;
int size = str.length;
while(size > 0){
int end = get3PowerK1(size);
size = size-end;
CycleLeaderIteration cli = new CycleLeaderIteration();
cli.iterate(str, low, end + low-1);
low = low+end;
}
size = str.length;
low =0;
int end = get3PowerK1(size);
while(end < str.length){
int nextEnd = get3PowerK1(str.length-end);
reverse(str,end/2,end-1);
reverse(str,end/2,end+nextEnd/2-1);
reverse(str,end/2,end/2+nextEnd/2-1);
// size = str.length - (end + nextEnd);
end = end + nextEnd;
}
}
private int get3PowerK1(int size){
int power = 1;
while((power*3 +1)<= size){
power = power*3;
}
return power+1;
}
public static void main(String args[]){
char str[] = {'a','1','b','2','c','3','d','4','e','5','f','6','g','7','h','8','i','9','j','A','k','B','l','C','m','D'};
InPlaceTransformationOfString ip = new InPlaceTransformationOfString();
ip.inPlaceTransformationImproved(str);
for(int i=0; i < str.length; i++){
System.out.print(str[i]);
}
}
}