In order to improve my algorithm skills I wanted to try out some practice challenges offered by Google Code Jam 2012. I wrote the following code to solve Reverse Words challenge. I verified the output by submitting them to Google Code Jam page and there are correct.
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
/**
*
* @author Shazin Sadakath
*
*/
public class CodeJamSolution2 {
private File inFile;
private File outFile;
public static void main(String[] args) {
if(args.length < 2) {
System.out.println("Usage : java CodeJamSolution2 <In File> <Out File>");
return;
}
CodeJamSolution2 cjs2 = new CodeJamSolution2(args[0], args[1]);
cjs2.start();
}
public CodeJamSolution2(String inFile, String outFile) {
this.inFile = new File(inFile);
this.outFile = new File(outFile);
}
public void start() {
BufferedReader br = null;
BufferedWriter bw = null;
try {
br = new BufferedReader(new FileReader(inFile));
bw = new BufferedWriter(new FileWriter(outFile));
int count = Integer.parseInt(br.readLine());
String[] words = null;
for(int i=0;i<count;i++) {
words = br.readLine().split(" ");
reverse(words);
bw.write(String.format("Case #%d: %s\n", i+1, output(words)));
}
} catch(Exception e) {
e.printStackTrace();
} finally {
if(br != null) {
try {
br.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(bw != null) {
try {
bw.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
/**
* Method to reverse a word array
* works at O(N / 2)
*
* @param words
*/
public void reverse(String[] words) {
int i=0;
int j=words.length - 1;
String temp = null;
while(i < j) {
temp = words[i];
words[i] = words[j];
words[j] = temp;
i++;
j--;
}
}
/**
* method to append all the elements in the array together
*
* @param words
* @return appended words sentence
*/
private String output(String[] words) {
StringBuffer sb = new StringBuffer();
for(int i=0;i<words.length;i++) {
sb.append(words[i]);
if(i != words.length - 1) {
sb.append(" ");
}
}
return sb.toString();
}
}