I'm new to SPOJ and I have some questions concerning Java.
Days ago I ACed a problem but I decided to submit another code and in the new code I put all the output to a StringBuilder and print the StringBuilder in the end of the program, instead of using System.out.println for each test case. By doing this I thought I may save some time.
But the problem is that SPOJ kept giving me wrong answer. And the only change I made is replaced several System.out.println with one System.out.print(StringBuilder).
And I'm sure I added all the line separator the problem requires.
Any one know any possible solution?
Here is my code and the problem id is 5
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
public class Main {
/**
* 5. The Next Palindrome
*
* @param args
*/
public static void main(String[] args) {
// String str = "9899";
// System.out.println(getNextPalin(str));
doFunc();
}
private static void doFunc() {
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(
System.in));
String str = reader.readLine();
int count = Integer.valueOf(str);
List<String> list = new ArrayList<String>();
for (int i = 0; i < count; ++i) {
str = reader.readLine();
list.add(str);
}
reader.close();
String ls = System.getProperty("line.separator");
StringBuilder sb = new StringBuilder();
for (String s : list) {
sb.append(getNextPalin(s) + ls);
}
System.out.print(sb);
} catch (NumberFormatException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
private static String getNextPalin(String str) {
char[] buffer = str.toCharArray();
if (buffer.length == 1) {
if (buffer[0] == '9') {
return "11";
} else {
return String.valueOf(buffer[0] + 1);
}
}
boolean allNine = true;
for (char c : buffer) {
if (c != '9') {
allNine = false;
break;
}
}
if (allNine) {
char[] r = new char[buffer.length + 1];
r[0] = '1';
r[r.length - 1] = '1';
for (int i = 1; i < r.length - 1; ++i) {
r[i] = '0';
}
return String.valueOf(r);
}
int rightPointer = str.length() - 1;
int leftPointer = 0;
boolean needsUp = false;
boolean equalOK = false;
while (rightPointer > leftPointer) {
char rightChar = buffer[rightPointer];
char leftChar = buffer[leftPointer];
buffer[rightPointer--] = buffer[leftPointer++];
if (rightChar == leftChar) {
if (!equalOK) {
needsUp = true;
}
} else if (rightChar < leftChar) {
// This means direct change.
// buffer[rightPointer] = buffer[leftPointer];
needsUp = false;
equalOK = true;
} else {
needsUp = true;
}
}
if (needsUp) {
if (rightPointer < leftPointer) {
++rightPointer;
--leftPointer;
}
while (buffer[leftPointer] == '9') {
buffer[leftPointer] = '0';
buffer[rightPointer] = '0';
if (leftPointer > 0) {
--leftPointer;
++rightPointer;
}
}
// Just raise.
buffer[leftPointer] += 1;
if (leftPointer != rightPointer) {
buffer[rightPointer] += 1;
}
}
return String.valueOf(buffer);
}
}