华为OD机试真题 - N进制减法

    static char[] map = new char[35];
    public static void main(String[] args) {
        for (int i = 0; i < map.length; i++) {
            if (i < 10)
                map[i] = (char) ('0' + i);
            else
                map[i] = (char) ('a' + i - 10);
        }
        Scanner inputScanner = new Scanner(System.in);

        int base = inputScanner.nextInt();
        String num1 = inputScanner.next(); // 被减数
        String num2 = inputScanner.next(); // 减数
        StringBuilder num1Builder = new StringBuilder(num1);
        StringBuilder num2Builder = new StringBuilder(num2);
        if (num1Builder.length() > num2Builder.length()) {
            System.out.print(0 + &quot; &quot;);
            System.out.print(getResult(num1Builder, num2Builder, base));
        } else if (num1Builder.length() < num2Builder.length()) {
            System.out.print(1 + &quot; &quot;);
            System.out.println(getResult(num2Builder, num1Builder, base));
        } else {
            for (int i = 0; i < num1Builder.length(); i++) {
                if (num1Builder.charAt(i) > num2Builder.charAt(i)) {
                    System.out.print(0 + &quot; &quot;);
                    System.out.print(getResult(num1Builder, num2Builder, base));
                    break;
                } else if (num1Builder.charAt(i) < num2Builder.charAt(i)){
                    System.out.print(1 + &quot; &quot;);
                    System.out.println(getResult(num2Builder, num1Builder, base));
                    break;
                }
                if (num1Builder.length() - 1 == i) {
                    System.out.print(0 + &quot; &quot;);
                    System.out.print(0);
                }
            }

        }
    }

    public static String getResult(StringBuilder num1Builder, StringBuilder num2Builder, int base) {
        StringBuilder ans = new StringBuilder();
        num1Builder.reverse();
        num2Builder.reverse();
        for (int i = 0; i < num1Builder.length(); i++) {
            if (i >= num2Builder.length()) {
                ans.append(num1Builder.substring(i, num1Builder.length()));
                break;
            }

            char num1 = num1Builder.charAt(i);
            char num2 = num2Builder.charAt(i);
            if (num1 >= num2)
                ans.append(map[num1 - num2]);
            else {
                backtrack(num1Builder, 1 , i, base);
                ans.append(map[num1 + base - num2]);
            }
        }
        return ans.reverse().toString();
    }

    public static void backtrack(StringBuilder num1Builder, int index, int i, int base) {
        if (num1Builder.charAt(i + index) != '0') {
            char ch = num1Builder.charAt(i + index);
            num1Builder.delete(i + index, i + index + 1);
            num1Builder.insert(i + index, (char)(ch - 1));
        } else {
            backtrack(num1Builder, index + 1 , i, base);
            num1Builder.delete(i + index, i + index + 1);
            num1Builder.insert(i + index, (char)(base - 1));
        }
    }
全部评论

相关推荐

Mush3r:1. 项目包装一下,比如说“跟某某电网/企业合作,已经实际交付”之类的,这样别人就觉得你至少是个实际的项目不是个玩具项目; 2. 对于 axios 这种工具,不要写“利用”,别人觉得是就是在调包,没什么技术含量,要写“重新封装”,可能实际上就是封装了一些 url 前缀之类的,但是听起来就更高级一点; 3. 结合缓存实现用户登陆,你作为前端是如何实现的?如何鉴权?token 过期如何设置?如何保证非登录用户不能访问页面/请求拦截器?一个都写没,前面这些都是面试会问的问题,但是面试官看了你这句话可能也不知道该问什么; 4. 利用 Vue3,通过 。。。 组件库,又是调包,这种没什么工作量,就是拿过来用一用的就不要往详情里写了,开头总结的时候提一嘴就行了; 后面小程序不怎么懂,不评价了
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务