给你一个小于 60 位的整数 p ,求大于 p 的最小的数 p1 ,使得 p1 中包含数 2333 。

哈哈,没事瞎写写算法,忘大家来修复呀。
题目:给你一个小于 60 位的整数 p ,求大于 p 的最小的数 p1 ,使得 p1 中包含数 2333

public class Test {

    public static void main(String[] args) {
        System.out.println(test("1999999999999"));
    }

    /**
     * 给你一个小于 60 位的整数 p ,求大于 p 的最小的数 p1 ,使得 p1 中包含数 2333 。
     * <p>
     * 10000000023339
     * 10000000022333
     * <p>
     * 1000233399999
     * 1000300002333
     * 1233329923339
     */
    static final String keys = "2333";

    private static String test(String data) {
        int length = data.length();
        if (length < keys.length()) {
            return keys;
        }

        //本身就有2333
        if (data.contains(keys)) {
            String head = data.split(keys)[0];
            String end = data.split(keys)[1];
            //在中间某个位置
            //存在多个2333
            if (data.split(keys).length > 2) {
                return bigDataAdd(data, "1");
            }
            //存在一个2333
            if (end.length() != 0) {
                int endNum = Integer.parseInt(data.substring(length - 1, length));
                //有进位发生
                if (endNum == 9) {
                    return head + "3" + getZeroNumber(end) + keys;
                } else {
                    //没有发生进位
                    return bigDataAdd(data, "1");
                }
            }
        }
        //本身没有2333
        String head = data.substring(0, data.length() - keys.length());
        String end = data.substring(data.length() - keys.length(), data.length());
        //后四位大于keys
        if (Integer.parseInt(end) > Integer.parseInt(keys)) {
            return bigDataAdd(head, "1") + keys;
        }
        return data.substring(0, data.length() - keys.length()) + keys;
    }

    public static String getZeroNumber(String keys) {
        StringBuilder builder = new StringBuilder();
        for (int i = 0; i < keys.length() - 1; i++) {
            builder.append("0");
        }
        return builder.toString();
    }

    private static String bigDataAdd(String keys, String add) {
        //被加数
        char[] a = new StringBuilder(keys).reverse().toString().toCharArray();
        //加数
        char[] b = new StringBuilder(add).reverse().toString().toCharArray();

        int lenA = a.length;
        int lenB = b.length;
        int maxlen = lenA > lenB ? lenA : lenB;
        int[] result = new int[maxlen + 1];
        for (int i = 0; i < maxlen + 1; i++) {
            int aint = i < lenA ? (a[i] - '0') : 0;
            int bint = i < lenB ? (b[i] - '0') : 0;
            result[i] = aint + bint;
        }
        for (int i = 0; i < result.length; i++) {
            if (result[i] >= 10) {
                result[i + 1] += result[i] / 10;
                result[i] %= 10;
            }
        }
        StringBuilder sb = new StringBuilder();
        if (result[maxlen] != 0) {
            sb.append(result[maxlen]);
        }
        for (int i = maxlen - 1; i >= 0; i--) {
            sb.append(result[i]);
        }
        return sb.toString();
    }
    }
阅读更多

扫码向博主提问

twjitm

非学,无以致疑;非问,无以广识
  • 擅长领域:
  • java
  • spring
  • mybatis
  • hibernate
  • javaweb
去开通我的Chat快问
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/baidu_23086307/article/details/81559785
个人分类: 算法人生
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭