Amazon Interview Question
Software Engineer / DevelopersTeam: Retail
Country: India
Interview Type: In-Person
How about this input?
{'b,'a','a','a'}
it seems to me that you will swap 'b' once for each 'a' - 3 times
I agree with that comment. I would also say that the conditions are conflicting:
2) Every element may repeat minimum 5 times [...]
3) 'a' can be swapped only 1 time [...]
I don't see how one can swap 'a' only one time if there are five randomly given 'a' instance.
Relaxing the number of swap constraint, the above solution is great.
Code on java....
public class ArrangeColors {
public static void main(String []args){
char color[] = {'a','b','c','d'};
char arr[] = {'b','b','c','a','c','a','a','a','d','d','d','c','d','b','a','a','b','b','c','d'};
System.out.println("Before Swapping");
printArray(arr);
arr = sortArray(arr,color);
System.out.println("After Swapping");
printArray(arr);
}
private static char[] sortArray(char[] arr,char[] color){
int lastSwapIndex = 0;
for(int i= 0 ;i<color.length;i++){
int pivot = color[i];
int j = arr.length-1;
while(lastSwapIndex<=j){
if(arr[j]==pivot){
if(arr[lastSwapIndex]!=pivot){
swap(lastSwapIndex, j, arr);
lastSwapIndex += 1;
}
else{
while(lastSwapIndex<arr.length && arr[lastSwapIndex]==pivot){
lastSwapIndex += 1;
}
if(lastSwapIndex<=j){
swap(lastSwapIndex, j, arr);
lastSwapIndex += 1;
}
}
}
j--;
}
}
return arr;
}
private static void swap(int swapIndex,int j,char[] arr){
char temp = arr[swapIndex];
arr[swapIndex] = arr[j];
arr[j]=temp;
}
private static void printArray(char[] arr){
for(int i=0;i<arr.length;i++)
System.out.print(arr[i]+",");
System.out.println();
}
}
1st time, swap all 'a' s to their positions. 2nd, swap 'b's .... So each ‘a’ makes one swap, each ‘b’ makes at most 2 swaps, and so on . This will take O(n^2) time
char[] sort(char[] color, char[] arr) {
int temp;
int ae=0;
int as=0;
int root=0;
while(root <arr.length) {
if(arr[ae]==color[as]){
temp=arr[ae];
arr[ae]=arr[as];
arr[as]=temp;
as++;
}
ae++;
}
root++;
ae=as;
return arr[];
}
Code In 'C'
#include<stdio.h>
char color[] = {'a', 'b', 'c', 'd', 'e', 'f', 'g'};
char arr[] = {'f', 'a', 'b', 'b', 'a', 'a', 'a','c','g','e'};
int length = sizeof(color)/sizeof(char);
int alength = sizeof(arr)/sizeof(char);
void sortArr()
{
int i ,j;
printf("\ncolor len:%d arr len:%d\n",length,alength);
int lastSwapIndex = 0;
for (i = 0;i<length; i++) {
char pivot = color[i];
for (j=0; j<alength; j++) {
if (pivot==arr[j]) {
arr[j] = arr[lastSwapIndex];
arr[lastSwapIndex ] = pivot;
lastSwapIndex++;
}
}
}
}
int main()
{
int i,j;
printf("Color arr===>\n");
for(i = 0; i<length;i++)
printf("%c ",color[i]);
printf("\n\nArr ===>\n");
for(i = 0;i<alength;i++)
printf("%c ",arr[i]);
sortArr();
printf("\n\nAfter Color arr===>\n");
for(i = 0; i<length;i++)
printf("%c ",color[i]);
printf("\n\nAfter Arr ===>\n");
for(i = 0;i<alength;i++)
printf("%c ",arr[i]);
printf("\n====END====\n\n");
}
OUTPUT::::
Color arr===>
a b c d e f g
Arr ===>
f a b b a a a c g e
color len:7 arr len:10
After Color arr===>
a b c d e f g
After Arr ===>
a a a a b b c e f g
====END====
#include <iostream>
#include <string>
#define LENGTH(chars) sizeof(chars)/sizeof(char)
using namespace std;
int main(int argc,char* argv[]){
char color[]={'a','b','c','d','e','f','g','h'};
char arr[]={'b','a','a','a','b','c','g','h','g','b'};
int targetIndex=0;
int colorIndex=0;
while(targetIndex<LENGTH(arr)&&colorIndex<LENGTH(color)){
int i=LENGTH(arr)-1;
while(i>=targetIndex){
if(arr[i]==color[colorIndex]){
if(arr[i]!=arr[targetIndex]){
cout<<"Swap:"<<arr[i]<<"("<<i<<") and "<<arr[targetIndex]<<"("<<targetIndex<<")"<<endl;
char temp=arr[targetIndex];
arr[targetIndex]=arr[i];
arr[i]=temp;
--i;
}
++targetIndex;
}
else --i;
}
++colorIndex;
}
for(int i=0;i<LENGTH(arr);++i){
cout<<arr[i]<<" ";
}
cout<<endl;
}
- Radim Pavlicek February 10, 2013