[SPOJ] PALIN – The Next Palindrome
原题: http://www.spoj.com/problems/PALIN/
题目大意: 给任意一个数, 找到比这个数大的最小的一个回文数字.
分析: 这题要考虑的情况很多, 比如例子中的808, 我们需要把0改成1, 因为如果我们改动最后的8, 前边的8也要增加, 所以改变的总量会更大, 只能改变0. 所以第一条就是, 我们要从数字的中间改. 另一个是2133变成2222. 这个改变的过程是2133->2132->2112->2222, 这里, 我们用的是meet in mid的策略, 我们要比较前边和后边的数字, 如果他们是一样的, 那么就忽略, 如果他们不一样, 前边比后边大, 就把后边改成前边的, 这样相当于增加了,所以就结束了. 如果后边大, 把前边赋值后边, 但是继续程序.最后一种情况是, 99999->100001. 我们把所有的9变成0, 然后最后的9变成1,然后前边加1.
public void solve(int testNumber, InputReader in, OutputWriter out) { int t = in.readInt(); for (int i = 0; i < t; i++) { solve(in.readLine(), out); } } public void solve(String s, OutputWriter out) { char[] str = s.trim().toCharArray(); boolean flag = false; int length = str.length; int i = 0; int j = length - 1; while (i <= j) { if (str[j] < str[i]) flag = true; str[j] = str[i]; i++; j--; } if (flag) { out.printLine(String.valueOf(str)); return; } i--; if (str[i] != '9') { str[i]++; str[length - 1 - i] = str[i]; out.printLine(String.valueOf(str)); return; } else { while (i >= 0 && str[i] == '9') { str[length - 1 - i] = '0'; str[i] = '0'; } if (i >= 0) { str[i]++; str[length - 1 - i] = str[i]; flag = true; } if (flag) { out.printLine(String.valueOf(str)); return; } out.printLine(1+String.valueOf(str)+1); return; } }
Leave A Comment