package com.anuragkapur.misc; import java.util.Stack; /** * @author anuragkapur */ public class ReverseMultiplesOf3 { /** * Running time: O(2n) * Space complexity: O(n) * * @param str * @return */ public String reverse(String str) { char charsOfStr[] = str.toCharArray(); Stack<Character> stack = new Stack<>(); // first iteration to populate stack for(char ch : charsOfStr) { if(ch >='0' && ch<='9') { if(ch % 3 == 0) { stack.push(ch); } } } // reverse multiples of 3 for(int i=0; i<charsOfStr.length; i++) { if(charsOfStr[i] >='0' && charsOfStr[i]<='9') { if(charsOfStr[i] % 3 == 0) { charsOfStr[i] = stack.pop(); } } } return new String(charsOfStr); } /** * Running time: O(n) * Space complexity: O(1) * * @param str * @return */ public String reverse1(String str) { char chars[] = str.toCharArray(); int forward = 0; int backward = chars.length - 1; boolean forwardReady = false; boolean backwardReady = false; while (forward < backward) { if (forwardReady && backwardReady) { char temp = chars[forward]; chars[forward] = chars[backward]; chars[backward] = temp; forwardReady = false; backwardReady = false; forward ++; backward --; continue; } if (Character.isDigit(chars[forward]) && Character.getNumericValue(chars[forward]) % 3 == 0) { forwardReady = true; } else { forward ++; } if (Character.isDigit(chars[backward]) && Character.getNumericValue(chars[backward]) % 3 == 0) { backwardReady = true; } else { backward --; } } return new String(chars); } }