给定回文字符串求严格小于它的最大回文数的代码修复
问题说明
给定表示回文数字N的字符串S,需要找出严格小于N的最大回文数字。现有求解代码在部分测试用例下返回错误结果,需要修正代码问题。
现有代码如下:
string nextSmallerPalindrome(string &s) { int n = s.length(); string ans = ""; if(n == 1) { s[0]--; return s; } if(s == "11") { return "9"; } // 处理奇数长度场景 if(n % 2 != 0) { int idx = n / 2; int diff = 0; if(s[idx] == '0') { s[idx] = '9'; diff = 1; } else { s[idx]--; } idx--; while(idx >= 0 && diff == 1) { if(s[idx] == '0') { s[idx] = '9'; idx--; } else { s[idx]--; diff = 0; break; } } int i = 0; while(i < n && s[i] == '0') { i++; } for(; i < n; i++) { ans = ans + s[i]; } int new_n = ans.length(); int j = 0; int k = new_n - 1; while(j < k) { if(ans[j] == ans[k]) { j++; k--; } else { ans[k] = ans[j]; j++; k--; } } return ans; } else // 处理偶数长度场景 { int idx = n / 2 - 1; int diff = 0; if(s[idx] == '0') { s[idx] = '9'; diff = 1; } else { s[idx]--; } idx--; while(idx >= 0 && diff == 1) { if(s[idx] == '0') { s[idx] = '9'; idx--; } else { s[idx]--; diff = 0; break; } } int i = 0; while(i < n && s[i] == '0') // 忽略字符串前导零 { i++; } for(; i < n; i++) // 忽略前导零后将字符串内容存入新字符串ans { ans = ans + s[i]; } int new_n = ans.length(); int j = 0; int k = new_n - 1; while(j < k) // 校验并将后半段替换为前半段的镜像 { if(ans[j] == ans[k]) { j++; k--; } else { ans[k] = ans[j]; j++; k--; } } return ans; } }
输入格式
- 输入第一行包含整数
T,表示测试用例数量 - 每个测试用例仅一行,为待求更小回文数的字符串
S
测试用例
19 7 77 101 1001 1221 144441 3444444443 57855875 10000001 11 1 111 101 1001 11011 1110111 1190911 20002 10011001
内容的提问来源于stack exchange,提问作者Vishal Kumar
相关产品推荐
相关产品推荐

