字节三面编程题——大于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
< <上一篇
下一篇>>