67.二进制求和
难度:简单
题目描述:
给你两个二进制字符串,返回它们的和(用二进制表示)。
输入为非空字符串且只包含数字1
和0
。
示例 1:
输入: a = "11", b = "1" 输出: "100"
示例 2:
输入: a = "1010", b = "1011" 输出: "10101"
解题思路:
方法一(朴素法)【数值精度存在问题,测试用例不能全部通过】
先将字符串a,b转化成十进制数字,求和后再转换成二进制数。
方法二:(列竖式法)
末尾对齐,逐位相加,逢二进一
注意点:
1.循环次数n应为a,b字符串较长的数字;
2.每一位的答案应该为a[i] + b[i] + carry mod 2;
3.三目运算符中 a.length()-1-i 【b.length()-1-i】 先-1是因为索引从0开始,再-i是因为先运算低位(低位对应字符串a,b中的高索引)
4. 在进行计算时直接拼接字符串,会得到一个反向字符,需要最后再进行翻转(因为新字符串res中低索引的值是数值较小的)
方法三:(位运算)
待补充....
代码:
方法一:
1 class Solution { 2 public String addBinary(String a, String b) { 3 Integer decimalNum = Integer.parseInt(a,2) + Integer.parseInt(b,2); 4 return Integer.toBinaryString(decimalNum); 5 } 6 }
方法二:
1 class Solution { 2 public String addBinary(String a, String b) { 3 StringBuilder res = new StringBuilder(); 4 int n = Math.max(a.length(),b.length()); 5 // carry 表示上一个位置的进位,初始为0 6 int carry = 0; 7 for(int i = 0; i < n; i++){ 8 // 求carry + a[i] 9 carry += i < a.length() ? (a.charAt(a.length()- 1- i) - '0') : 0; 10 // 求carry + a[i] + b[i] 11 carry += i < b.length() ? (b.charAt(b.length()- 1- i) - '0') : 0; 12 // 每一位的答案为carry + a[i] + b[i] mod 2 13 res.append((char)(carry % 2 + '0')); 14 carry /= 2; 15 } 16 // 判断最高位是否需要进1 17 if(carry > 0) 18 res.append('1'); 19 // 将res 字符串翻转 并返回String对象 20 return (res.reverse()).toString(); 21 } 22 }
补充知识:
1.方法一中用到的Integer类中的方法
序号 | 方法描述 |
1 | public static int parseInt(String s, int radix) throws NumberFormatException parseInt() 方法用于将字符串参数作为有符号的十进制整数进行解析。 如果方法有两个参数, 使用第二个参数指定的基数,将字符串参数解析为有符号的整数。 |
2 | public static String toBinaryString(int i)
以二进制(基数 2)无符号整数形式返回一个整数参数的字符串表示形式。
|
parseInt("0", 10) 返回 0
parseInt("473", 10) 返回 473
parseInt("-0", 10) 返回 0
parseInt("-FF", 16) 返回 -255
parseInt("1100110", 2) 返回 102
parseInt("2147483647", 10) 返回 2147483647
parseInt("-2147483648", 10) 返回 -2147483648
parseInt("2147483648", 10) 抛出 NumberFormatException
parseInt("99", 8) 抛出 NumberFormatException
parseInt("Kona", 10) 抛出 NumberFormatException
parseInt("Kona", 27) 返回 411787
2.三目运算符
Java 提供了一个特别的三元运算符(也叫三目运算符)经常用于取代某个类型的 if-then-else 语句。条件运算符的符号表示为“?:”,使用该运算符时需要有三个操作数,因此称其为三目运算符。使用条件运算符的一般语法结构为:
result = <expression> ? <statement1> : <statement3>;
其中,expression 是一个布尔表达式。当 expression 为真时,执行 statement1, 否则就执行 statement3。此三元运算符要求返回一个结果,因此要实现简单的二分支程序,即可使用该条件运算符。
举例:
int x = 1;
int y = 2;
int z ;
z = x<y ? x : y; // z = 1
因为x=1,y=2,使得表达式x<y成立,所以z取?之后的表达式即z=x=1;
3.字符与数字、字符串与数字之间的关系
字符与数字:
1.将char类型转换为int类型
String a = "3210";
int b = a.charAt(1) -'0'; //a.charAt(1) 是3210中左起第二个数即为2
System.out.println(b+10); //12
2.将int类型转换为char类型
(附值char变量后,输出字符编码表中对应的字符,'0'的ASCII码是48)
int a = 1;
char b = (char)(a +'0');
System.out.println(); //字符1
字符串与数字:
1.数字转字符串(字符串与空字符串相加,自动转换)
int a1 = 1;
String s1 = a1 + "";
System.out.println(s1 + 2000); //12000
2.数字转字符串(利用Integer包装类的toString方法)
int a2 = 1;
String s2 = Integer.toString(a2);
System.out.println(s2 + 2345); //12345
3.数字转字符串(利用String的ValueOf方法)
int a3 = 6;
String s3 = String.valueOf(a3);
System.out.println(s3+789); //6789
4.字符串转整数(利用Integer包装类的parseInt方法进行转换)
String s4 = "12345";
int a4 = Integer.parseInt(s4);
System.out.println(a4+54321); //66666
5.字符串转小数(利用Double包装类的parseInt方法进行转换)
String s5 = "0.123";
double a5 = 0.007;
System.out.println(Double.parseDouble(s5) + a5); // 0.13