Thursday, September 18, 2014

Reverse Words in a String

/*non optimized version*/
public class Solution {
public String reverseWords(String s){
   if(s.isEmpty() || s.length() < 2){
return s;
}
     
String newString = "";
while(!s.isEmpty() && s.charAt(0)==' '){
s=s.substring(1);
}

while(!s.isEmpty() && s.charAt(s.length()-1)==' '){
s=s.substring(0,s.length()-1);
}

if(s.isEmpty()){
return newString;
}

String reversedChars = reverseLetters(s);
String[] stringArray = reversedChars.split(" ++");
String temp;
for(int i=0; i<stringArray.length; i++){
   temp = reverseLetters(stringArray[i]);
if (!temp.isEmpty()){
   newString = newString + temp;
   if (i!=stringArray.length-1){
newString = newString + " ";
}
}
}

return newString;
}

private String reverseLetters(String s){
int length = s.length();
if (s.isEmpty() || length < 2){
return s;
}

String newString = "";
int idx=length-1;
newString = newString + s.substring(idx);
idx--;
while(idx>=0){
newString = newString + s.substring(idx,idx+1);
idx--;
}

return newString;
}
}

---optimized:
public class Solution {
public int evalRPN(String[] tokens){
int invalidResult = 0;
int size = tokens.length;

if(size==1 && isInteger(tokens[0])) return getInteger(tokens[0]);

if (size<2) return invalidResult;

Deque<Integer> numQ=new ArrayDeque<Integer>();
numQ.addFirst(getInteger(tokens[0]));
numQ.addFirst(getInteger(tokens[1]));
int idx = 2;
int op1;
int op2;
while(idx<tokens.length && numQ.size()>0){
   if(!isInteger(tokens[idx]) && !isSymbol(tokens[idx])){
return invalidResult;
}
if (isSymbol(tokens[idx])){
op2 = numQ.remove();
op1 = numQ.remove();
numQ.addFirst(calculate(op1, op2, tokens[idx]));
}
else {
numQ.addFirst(getInteger(tokens[idx]));
}
idx++;
}
if(numQ.size()!=1 || idx!=tokens.length) return invalidResult;
return numQ.remove();
}

private boolean isSymbol(String s){
if (s.equalsIgnoreCase("+")
||s.equalsIgnoreCase("-")
||s.equalsIgnoreCase("*")
||s.equalsIgnoreCase("/")) return true;
return false;
}

private int calculate(int op1, int op2, String op){
if(op.equalsIgnoreCase("+")){
return op1 + op2;
}
if(op.equalsIgnoreCase("-")){
return op1 - op2;
}
if(op.equalsIgnoreCase("*")){
return op1 * op2;
}
if(op.equalsIgnoreCase("/")){
if (op2 == 0) return 0;
return op1 / op2;
}
return 0;
}

private boolean isInteger(String s){
return s.matches("\\d++") || s.matches("\\+\\d++") || s.matches("-\\d++");
}

private int getInteger(String s){
int invalidValue = 0;
if (s.matches("\\d++")) return Integer.valueOf(s);
if (s.matches("\\+\\d++"))return Integer.valueOf(s.substring(1));
if (s.matches("-\\d++")) return Integer.valueOf(s.substring(1))*(-1);
return invalidValue;
}
}

No comments:

Post a Comment