67.二进制求和

难度:简单

题目描述:
 

给你两个二进制字符串,返回它们的和(用二进制表示)。

输入为非空字符串且只包含数字10


示例 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 }
View Code

 

方法二:
 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 }
View Code

 

 
 

补充知识:

 
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
 
posted @ 2020-06-23 22:40  FenixG  阅读(328)  评论(0编辑  收藏  举报