package com.interview.number; import java.util.Arrays; import java.util.LinkedList; import java.util.Queue; /** * http://www.geeksforgeeks.org/find-the-largest-number-multiple-of-3/ */ public class LargestMultipleOf3inArray { public void swap(int input[],int i, int j){ int temp = input[i]; input[i] = input[j]; input[j] = temp; } private void reverse(int input[]){ for(int i=0; i < input.length/2; i++){ swap(input,i, input.length-1-i); } } public int[] largestMultiple(int input[]){ Arrays.sort(input); int output[]; Queue<Integer> q0 = new LinkedList<Integer>(); Queue<Integer> q1 = new LinkedList<Integer>(); Queue<Integer> q2 = new LinkedList<Integer>(); int sum = 0; for(int i=0; i < input.length; i++){ if(input[i] % 3 == 0){ q0.add(input[i]); } if(input[i] % 3 == 1){ q1.add(input[i]); } if(input[i] % 3 == 2){ q2.add(input[i]); } sum += input[i]; } if(sum % 3 == 0){ output = new int[input.length]; for(int i=0; i < input.length; i++){ output[input.length-1-i] = input[i]; } return output; } else if(sum % 3 == 1){ int len = input.length; if(q1.size() > 0){ q1.poll(); len--; }else if (q2.size() > 1){ q2.poll(); q2.poll(); len -= 2; }else{ return null; } output = new int[len]; int i=0; while(q0.size() > 0){ output[i] = q0.poll(); i++; } while(q1.size() > 0){ output[i] = q1.poll(); i++; } while(q2.size() > 0){ output[i] = q2.poll(); i++; } Arrays.sort(output); reverse(output); }else{ int len = input.length; if(q2.size() > 0){ q2.poll(); len--; }else if(q1.size() > 1){ q1.poll(); q1.poll(); len -= 2; }else{ return null; } output = new int[len]; int i=0; while(q0.size() > 0){ output[i] = q0.poll(); i++; } while(q1.size() > 0){ output[i] = q1.poll(); i++; } while(q2.size() > 0){ output[i] = q2.poll(); i++; } Arrays.sort(output); reverse(output); } return output; } public static void main(String args[]){ int input[] = {8,9,0,2,2,2}; LargestMultipleOf3inArray lma = new LargestMultipleOf3inArray(); int output[] = lma.largestMultiple(input); for(int a : output){ System.out.print(a + " "); } } }