青训营X豆包MarsCode 55.二进制之和 | 豆包MarsCode AI 刷题

63 阅读3分钟

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

代码:

public class Main {
	public static String solution(String binary1, String binary2) {
		// Please write your code here
		int i = 0;
		int sum = 0;
		int strLen1 = binary1.length();
		int strLen2 = binary2.length();
		String ret = new String("");

		while(strLen1 > 0 || strLen2 > 0){
			int digit1 = (strLen1 > 0) ? (binary1.charAt(strLen1 - 1) - '0') : 0;
			int digit2 = (strLen2 > 0) ? (binary2.charAt(strLen2 - 1) - '0') : 0;
			
			sum += (digit1 + digit2) * (0x01 << i);
			i++;
			
			if(strLen1 > 0) strLen1--;
			if(strLen2 > 0) strLen2--;
		}
		
		// Convert sum to decimal string
		ret = Integer.toString(sum);

		return ret;
	}

	public static void main(String[] args) {
		// You can add more test cases here
		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"));
	}
}
    

解析: 首先是变量初始化: i 用于记录当前处理的二进制位的位置权重,初始化为0。 sum 用于累加二进制转换为十进制后的数值,初始化为0。 strLen1 和 strLen2 分别获取输入的两个二进制字符串 binary1 和 binary2 的长度。 ret 用于存储最终要返回的十进制求和结果字符串,初始化为空字符串。

循环处理二进制位: 通过一个 while 循环,只要 strLen1 大于0或者 strLen2 大于0,就继续循环。在循环内: 首先获取当前要处理的两个二进制字符串的最后一位数字(如果字符串还有剩余位的话),通过将字符减去 '0' 的ASCII码值来转换为对应的整数值,分别存储在 digit1 和 digit2 中。例如,字符 '1' 减去 '0' 得到整数值1。 然后将这两个二进制位对应的十进制值相加,并乘以当前位置权重(通过 (0x01 << i) 来实现,即2的 i 次方),累加到 sum 中。这里利用了二进制位权展开的原理来将二进制转换为十进制。 接着将 i 自增1,准备处理下一位的权重。 最后,如果对应的二进制字符串还有剩余位,就将其长度减1,以便在下一次循环中处理下一位。 转换为十进制字符串并返回: 循环结束后,通过 Integer.toString(sum) 将累加得到的十进制和 sum 转换为字符串形式,存储到 ret 中,并作为函数的结果返回。

在 main 方法中,主要是对 solution 方法进行了一些简单的测试。通过调用 solution 方法传入不同的二进制字符串对,并使用 System.out.println 输出比较结果,判断 solution 方法返回的结果是否与预期的十进制求和结果相等。例如: System.out.println(solution("101", "110").equals("11")); 是测试二进制字符串 "101" 和 "110" 相加的结果是否等于十进制的 "11" 。 其他类似的测试语句也是为了验证 solution 方法在不同输入情况下的正确性。