网易互娱笔试题(2021春招)

(网易互娱笔试题(一))

一.题目描述:

输入一个正整数A(可以是非常大),输出一个大于A的下一个回文数
例如:
输入:233
输出:242
解释: 回文数指的是:将A的各位数字反向排列所得自然数A’与A相等,则称A为一回文数,比如:像1221、23432、9999等都是回文数,而1234、5689等就不是回文数。

二.解决方案:

  • 首先分析,由于输入的数可以是非常大,因此采用int,long类型来承载输入的数据可能会超出类型数值的最大范围,所以本人理解是:可以采用数组的结构来存储输入的数的每一位值。

  • 采用分多种情况讨论的方法:
    a.如果数A的length长度为奇数:
    1.当length等于1时,如果A=9,则输出:11,否则输出A=A+1;
    2.当length>1时:
    若A为回文数,取前length/2+1位数(注意:包括中位数),
    再将取出来的数加1,根据数的对称性,得到输出的结果,
    注意这里要考虑多种情况:
    比如:

     输入:12921,先取出129,再加1,得到130,以4为对称轴,得到
     最终的输出为:13031。
     输入:99999,先取999,再加1,得到1000,此时数的长度发生变,
     此时的输出为:100001。
    

    若A不是回文数,此时应该从中位数开始,向左右两边同时进行查找,直到找到第一个不相等的数为止(一定是可以找到的,因为不是回文数):

    1.假设左边的小于右边的数,比如:12831,找到第二位的数2小于第四位的
    数3,此时按前面的加1处理(取前半截数值加1,再构造新的回文数)
    这里就是:128+1=129,输出:12921;
    2.假设左边的大于右边的数,比如:15821,找到的第二位数5大于第四位
    数2,则直接按照前半截数,进行新的回文数的构造,就是:158,输出:
    15851。   
    其他例子:输入:99928,输出:99999
    

    b.如果数A的length长度为偶数:
    思路和为奇数差不多:
    1.当length为0时,输出为空
    2.当length>0时:
    若A为回文数或前半截找到的数小时,则截取前半截数(前length/2位数),加1后
    用于构造新的回文数:

      比如:9999,截取99,加1等于100,输出的回文数为:10001,如果
      用数组来存储数的每一位的话,需要在原来的基础上重新构造一个容
      量+1的数组。
      1298,截取12,加1等于13,输出的回文数为:1331。
    

    若A不为回文数,且前半截找到的数大于后半截找到的数时,则直接用前
    半截的数构造回文数,并输出,例如:
    输入:9982,输出为9999

三.java代码实现及部分解释

import java.util.Scanner;


public class Main {
   
   
    public static void main(String[] args) {
   
   
        Scanner scanner = new Scanner(System.in);
        String input = scanner.nextLine();
        int[] result = result(input);
        StringBuffer stringBuffer=new StringBuffer();
        for (int res:result){
   
   
            stringBuffer.append(res);
        }
        System.out.println(stringBuffer.toString());
    }
    //todo:输入数的字符串类型,比如:"23446",输出大于该数的下一个回文数(即最小的那个)的按位存储的数组,如:[2,3,5,3,2]
    public static int[] result(String str){
   
   
        int len = str.length();
        int[] start = new int[len];
        int index1=0;
        String[] split = str.split("");
        for (String s:split){
   
   
            start[index1]=Integer.parseInt(s);
            index1++;
        }
        if (len%2
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值