У меня предположительно есть 9-секундное ограничение по времени, но когда я запускаю 2 числа с цифрами, близкими к одному миллиону, в NetBeans, для вывода требуется 5 секунд.Мой метод isPalindrome сравнивает симметричные цифры (1-я и последняя, 2-я и 2-я последняя и т. Д.) И редактирует число в соответствии со следующими правилами:
- Если цифра слева (1-я цифра, 2-яцифра и т. д.) больше, чем цифра справа (последняя цифра, 2-я последняя цифра и т. д.), чтобы цифра справа соответствовала цифре слева (9113 ---> 9119)
- Если цифра слева меньше цифры справа, сделайте так, чтобы цифра справа совпадала с цифрой слева, но увеличьте значения цифр рядом с цифрой справа (3987 --->3993 или 8999 ---> 9008 или 7899 ---> 7907)
Я держу свой номер в этих правилах, пока не найду палиндром.
Подводя итог моему вопросу (ам)): Почему я получаю ошибку превышения лимита времени, когда в NetBeans моя программа запускается в заданный период времени?
открытый класс SPOJ5 {
/**
* @param args the command line arguments
*/
private static final String counter = "01234567890";
public static void main(String[] args) {
int t;
BigInteger addNum;
List<BigInteger> k = new ArrayList();
Scanner in = new Scanner(System.in);
do {
try {
t = Integer.parseInt(in.next());
} catch (Exception e) {
t = 2;
}
} while (t < 0);
do {
try {
addNum = new BigInteger(in.next());
addNum = addNum.add(BigInteger.ONE);
if (digitCount(addNum) < 999999) {
k.add(addNum);
}
} catch (Exception e) {
k.add(BigInteger.valueOf(9).pow(100));
}
t--;
} while (t > 0);
for (BigInteger num : k) {
int digits = digitCount(num);
int middleNum;
int count = 0;
StringBuilder number = new StringBuilder(num.toString());
if (digits % 2 == 0) {
middleNum = digits / 2;
number = new StringBuilder(num.toString());
number = isPalindrome(number, digits - 1, count, middleNum);
} else {
middleNum = digits / 2;
number = isPalindrome(number, digits - 1, count, middleNum + 1);
}
System.out.println(number);
}
}
public static StringBuilder isPalindrome(StringBuilder number, int lastDigitIndex, int firstDigitIndex, int middleNum) {
while (lastDigitIndex >= middleNum) {
if (number.charAt(firstDigitIndex) != number.charAt(lastDigitIndex)) {
if (counter.indexOf(number.charAt(firstDigitIndex)) > counter.indexOf(number.charAt(lastDigitIndex))) {
number.replace(lastDigitIndex, lastDigitIndex + 1, Character.toString(number.charAt(firstDigitIndex)));
firstDigitIndex++;
lastDigitIndex--;
} else {
number.replace(lastDigitIndex, lastDigitIndex + 1, Character.toString(number.charAt(firstDigitIndex)));
do {
number.replace(lastDigitIndex - 1, lastDigitIndex, Character.toString(counter.charAt(counter.indexOf(number.charAt(lastDigitIndex - 1)) + 1)));
lastDigitIndex--;
} while ((Character.toString(counter.charAt(counter.indexOf(number.charAt(lastDigitIndex)))).equals("0")));
lastDigitIndex = number.length() - 1;
firstDigitIndex = 0;
}
} else {
firstDigitIndex++;
lastDigitIndex--;
}
}
return number;
}
public static int digitCount(BigInteger bi) {
String s = bi.toString();
return s.length();
}
}