青训营 X MarsCode 技术训练营部分考核题答案(困难题)

 考核题网址:AI刷题-掘金

二进制之和(困难题)

问题描述

小U和小R喜欢探索二进制数字的奥秘。他们想找到一个方法,将两个二进制字符串相加并以十进制的形式呈现。这个过程需要注意的是,他们的二进制串可能非常长,所以常规的方法可能无法处理大数。小U和小R希望你帮助他们设计一个算法,该算法能在保证时间复杂度不超过O(n^2)的前提下,返回两个二进制字符串的十进制求和结果。

public class Main {
    public static String solution(String binary1, String binary2) {
        // 初始化进位和结果字符串
        int carry = 0;
        StringBuilder result = new StringBuilder();
        
        // 从字符串的末尾开始逐位相加
        int i = binary1.length() - 1;
        int j = binary2.length() - 1;
        
        while (i >= 0 || j >= 0 || carry > 0) {
            // 获取当前位的值,如果已经超出字符串长度则视为0
            int bit1 = (i >= 0) ? binary1.charAt(i--) - '0' : 0;
            int bit2 = (j >= 0) ? binary2.charAt(j--) - '0' : 0;
            
            // 计算当前位的和以及进位
            int sum = bit1 + bit2 + carry;
            carry = sum / 2;
            sum = sum % 2;
            
            // 将当前位的结果添加到结果字符串中
            result.append(sum);
        }
        
        // 由于是从末尾开始添加的,需要反转结果字符串
        result.reverse();
        
        // 将二进制字符串转换为十进制整数
        // 这里可以使用Java的内置方法将二进制字符串转换为十进制整数
        // 例如:Integer.parseInt(result.toString(), 2)
        // 请将结果转换为字符串并返回
        return Integer.toString(Integer.parseInt(result.toString(), 2));
    }

    public static void main(String[] args) {
        // 测试用例
        System.out.println(solution("101", "110").equals("11"));
        System.out.println(solution("111111", "10100").equals("83"));
        System.out.println(solution("111010101001001011", "100010101001").equals("242420"));
        System.out.println(solution("111010101001011", "10010101001").equals("31220"));
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值