字节三面编程题——大于n的最小回文数
字节三面的题:输入一个数n,求大于n的最小回文数,即该数反转等于其本身
刷过300多道LeetCode,没见过但是很容易有思路,题本身只能算中等,这题需要字符串和数字间来回转换、翻转,但是Java的字符串处理真的太麻烦,StringBuffer的reverse方法即便不返回赋值,也会导致翻转字符串,因为这个导致我一直没有debug成功,这里记录一下
详细面经可见牛客:https://www.nowcoder.com/discuss/857144
分情况只需要考虑n的位数是奇数还是偶数就可以,思路就是分别取出前半部分、后半部分,然后比较大小,前半部分大于后半部分的话前半部分直接翻转拼接,否则前半部分先+1再翻转拼接即可
public int helper(int n){
StringBuffer sb = new StringBuffer(String.valueOf(n));
int digit = sb.length();
boolean flag = digit % 2 == 1;
int pre, tail;
if(flag){
pre = Integer.parseInt(sb.substring(0, digit / 2 + 1));
tail = Integer.parseInt(sb.reverse().substring(0, digit / 2 + 1));
}else{
pre = Integer.parseInt(sb.substring(0, digit / 2));
tail = Integer.parseInt(sb.reverse().substring(0, digit / 2));
}
StringBuilder ans = new StringBuilder(), preReverse = new StringBuilder(String.valueOf(pre)).reverse();
if(pre <= tail || Integer.parseInt(preReverse.toString()) <= tail ){
int len1 = String.valueOf(pre).length();
pre++;
int len2 = String.valueOf(pre).length();
if(len2 > len1) {
if(flag){
pre /= 10;
}
flag = !flag;
}
}
ans.append(pre);
//此处不能直接ans.append(ans.reverse())会导致ans整个翻转,需要临时变量temp
StringBuilder temp = new StringBuilder(String.valueOf(pre)).reverse();
ans.append(temp);
if(flag) ans.deleteCharAt(digit / 2);
return Integer.parseInt(ans.toString());
}
一开始没有加临时变量temp存储翻转的字符串,面试没法debug看变量一直没想明白,吃了Java的亏,如果python的话其实很快就做出来了
版权声明:本文为DarkJon原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
THE END