• 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
     
  • 相关阅读:
    创业感言:我的个性,我的情绪,我的表情(转)
    创业难,发掘机会更难:发掘创业良机的七种方式
    我也想有个梦想
    打造你想要的形象,帮助你树立神奇的领导魅力
    游窦圌山有感
    态度决定你的人生高度
    磨练召唤成功的力量,善于从损失中看到价值
    赚钱八大定律成就你的富翁梦
    增强你的大脑——20个不该忽视的记忆窍门
    无言的爱
  • 原文地址:https://www.cnblogs.com/fenixG/p/13184982.html
Copyright © 2020-2023  润新知