java - 为什么我的 SPOJ 经典问题 5 超过了时间限制?
问题描述
我应该有 9 秒的时间限制,但是当我在 NetBeans 上运行 2 个接近一百万位数的数字时,输出需要 5 秒。我的 isPalindrome 方法比较对称数字(第一个和最后一个,第二个和第二个最后等......)并根据以下规则编辑数字:
- 如果左边的数字(第一个数字,第二个数字等......)大于右边的数字(最后一个数字,第二个最后一个数字等......),使右边的数字与左边的数字匹配(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();
}
}
解决方案
推荐阅读
- flutter - 动画控制器不工作,为什么?
- javascript - 使用自定义管道更改 Datepicker (Angular) 中显示的日期格式
- java - 在 Activity 中将文本从 Fragment 设置为 Navigation Drawer
- java - Springboot中@PreAuthorise的Junit测试用例
- python - 如何通过按下没有硒的按钮重定向到另一个页面?
- markdown - 如何在 Markdown 中从同一位置引用 2 个(或更多)脚注
- oracle - Toad 是否可以用于 Oracle 自动会话重新连接?
- testing - TestCafe - 当测试并行运行时混淆了屏幕截图
- javascript - 如何从 JavaScript 中的 API 更新页面以进行下一次搜索?
- angular - 如何在与 y 轴平行的直线下方直接显示 Angular 中剑道图表的 x 轴标签?