当前位置: 代码迷 >> Java相关 >> 豪杰会挑战之回文数—题目解析
  详细解决方案

豪杰会挑战之回文数—题目解析

热度:35   发布时间:2016-04-22 20:51:12.0
英雄会挑战之回文数—题目解析
本帖最后由 AA5279AA 于 2014-01-06 19:14:36 编辑
题目详情

如果一个数正着读和反着读一样大,则这个数叫做回文数,例如121是回文数,123454321是回文数。


现给定一个正整数x,输出一个回文数y,要求y > x,并且组成x的所有数字之和与组成y的所有数字之和相等,以及y > x。

x在10^1000以内,因为数字较大,我们用字符串作为输入和输出。

如果无解,请输出Impossible。如果有多个y,输出最小的那个。


例如:

输入919,输出14941

输入1,输出Impossible 
代码如下:
随笔写的,所以代码结构显得有点乱。
代码复杂程度为O(n);级别的。
本地运算时间不到1毫秒。
结果提交程序显示:

啥也不说了。好在不是图你们的那些奖品,要不非得气死。

package com;

public class Test {
public static String palindrom(String a) {
String result = "";
char[] ch = a.toCharArray();
int num = 0;
for (int i : ch) {
num += (i - 48);
}
if (num == 1) {
result = "Impossible";
return result;
}
switch (ch.length) {
case 2:
if (num % 2 == 0) {
// 首先判断2位的长度是否可以
if (num >= (ch[0] - 47) * 2) {
result = num / 2 + "" + num / 2;
} else {
int i = (num - 9) / 2;
i = (i <= 0) ? 1 : i;
result = i + "" + (num - 2 * i) + "" + i;
}
} else {
int i = (num - 9) / 2;
i = (i <= 0) ? 1 : i++;
result = i + "" + (num - 2 * i) + "" + i;
}
break;
case 3:
if (!(ch.length == 1 || ch.length == 2 || ch[0] - 48 == 9)) {

int i = ch[0] - 47;
int ii = num - 2 * i;
if (ii >= 0 && ii < 10) {
result = i + "" + ii + "" + i;
return result;
}
}
if (num % 2 == 0) {
int i = num - 18;

i = (i <= 0) ? 2 : i;
System.out.println("i:" + i);
int ii = (num - 2) / 2;
switch (i / 2) {
case 1:
result = "1" + ii + "" + ii + "" + "1";
break;
case 2:
result = "2" + ii + "" + ii + "" + "2";
break;
case 3:
result = "3" + ii + "" + ii + "" + "3";
break;
default:
result = "4" + ii + "" + ii + "" + "4";
break;
}
} else {
int i = (num - 11) / 2;

int ii = (i <= 0) ? 0 : i;

int iii = num - 2 - (2 * ii);
switch (i / 2) {
case 1:
result = "1" + ii + "" + iii + "" + ii + "" + "1";
break;
case 2:
result = "1" + ii + "" + iii + "" + ii + "" + "1";
break;
case 3:
result = "1" + ii + "" + iii + "" + ii + "" + "1";
break;
case 4:
result = "1" + ii + "" + iii + "" + ii + "" + "1";
break;
case 5:
result = "1" + ii + "" + iii + "" + ii + "" + "1";
break;
case 6:
result = "1" + ii + "" + iii + "" + ii + "" + "1";
break;
case 7:
result = "1" + ii + "" + iii + "" + ii + "" + "1";
break;
case 8:
result = "1" + ii + "" + iii + "" + ii + "" + "1";
break;
default:
result = "1" + ii + "" + iii + "" + ii + "" + "1";
break;
}
}
break;
default:
break;
}

return result;
}

// start 提示:自动阅卷起始唯一标识,请勿删除或增加。
public static void main(String args[]) {
System.out.println(palindrom("999"));
}
// end //提示:自动阅卷结束唯一标识,请勿删除或增加。
}

------解决思路----------------------
貌似程序有些小BUG!
输入66 打印1101  输入77 打印2102

------解决思路----------------------
这个题我也做了,我自己跑最大数据1s完成,提交他总说超过3S
------解决思路----------------------
引用:
Quote: 引用:

貌似程序有些小BUG!
输入66 打印1101  输入77 打印2102

没有办法修改原帖了。。
思路没错,敲代码的时候想错了
第28行
 i = (i <= 0) ? 1 : i++;
改成
 i = (i <= 0) ? 1 : i+1;
就可以了。。。

还是不行!
需要改23行
i = (i <= 0) ? 1 : i;
改成
i = (i <= 0) ? 1 : i+1;
才行!
------解决思路----------------------
感觉这个程序问题挺多,随便测了一个        System.out.println(palindrom("991231232343453451231242345911"));
没有输出结果
  相关解决方案