首页 > 其他分享 >leetcode-67. 二进制求和

leetcode-67. 二进制求和

时间:2022-11-02 19:11:07浏览次数:84  
标签:tmp 二进制 sum unshift add let result 67 leetcode

题目描述

给你两个二进制字符串 a 和 b ,以二进制字符串的形式返回它们的和。

示例

输入:a = "11", b = "1"
输出:"100"

思路分析

我们可以先将其转化为整数,相加之后再转为二进制,但是这样的处理方式不能过掉全部样例。字符串的长度可能非常长,int类型会超出限制,因此如果使用js时可以考虑转化为bigInt类型的,再进行相加。
另一种方法,也就是遍历字符串的每一项,对进位进行处理,这种方法是比较使用大多数相加类型案例的。
对于相加,我们可以使用位运算符,关于位运算符的使用我们可以参考下图:
image

image

参考代码

//方法一:
var addBinary = function(a, b) {
    let result = []
    let curry = 0
   
    let len = Math.max(a.length,b.length)
    a = a.padStart(len,'0')
    b = b.padStart(len,'0')
    for(let i = len -1; i>= 0; i --) {
        let aAt = a.charAt(i)===''?0 :Number(a.charAt(i))
        let bAt = b.charAt(i)===''?0:Number(b.charAt(i))
        let tmp = aAt + bAt + curry
        if(tmp == 3 || tmp == 2) {
            curry = 1
            tmp == 3 ? result.unshift(1) : result.unshift(0)
        }else if(tmp == 1 || tmp == 0) {
            curry = 0
            tmp == 1 ? result.unshift(1) :result.unshift(0)
        }
    }
    if(curry==1) result.unshift(1)
    return result.join('')
};
//方法二:
var addBinary = function(a, b) {
    let add = 0
    let sum = []
    for(let i = a.length -1, j = b.length -1; i >= 0 || j >= 0; i--, j--) {
        let num1 = +a[i] || 0
        let num2 = +b[j] || 0
        sum.unshift(num1 ^ num2 ^ add)
        add = num1 + num2 + add > 1 ? 1 : 0
        
    }
    if (add === 1) sum.unshift(1)
    return sum.join('')
};

//方法三:
function addBinary(a: string, b: string): string {
    let add = 0;
    let sum = [];

    for (let i = a.length - 1, j = b.length - 1; i >= 0 || j >= 0; i--, j--) {
        // 位数不够,默认为 0
        let num1 = +a[i] || 0;
        let num2 = +b[j] || 0;

        // 两数相同异或为0,0与任意数字异或为数字本身
        sum.unshift(num1 ^ num2 ^ add);
        add = num1 + num2 + add > 1 ? 1 : 0;
    }

    if (add === 1) sum.unshift(1);

    return sum.join('');
};

//方法四:
//转化位bigint类型
var addBinary = function(a, b) {
    var a = '0b' + a;
    var b = '0b' + b;
    var sum = BigInt(a) + BigInt(b);
    return sum.toString(2);
};

标签:tmp,二进制,sum,unshift,add,let,result,67,leetcode
From: https://www.cnblogs.com/zx529/p/16852064.html

相关文章

  • leetcode股票系列问题
    本文整合了一些大佬的文章加上自己的一些认识,供自己复习转载:https://leetcode.cn/problems/best-time-to-buy-and-sell-stock/solutions/8753/yi-ge-fang-fa-tuan-mie-6-d......
  • LeetCode刷题第一周
    数组:内存空间连续,数据类型统一,下标从0开始二分查找704classSolution{publicintsearch(int[]nums,inttarget){//方法一:暴力解法//for......
  • leetcode110-平衡二叉树
    110.平衡二叉树这道题很容易联想到 104.二叉树的最大深度 的做法。一开始做的时候就知道可以用递归,但是又想到了左右子树的高度相差不大于1,但是子树的子树相差大于1......
  • leetcode222-完全二叉树的节点个数
    222.完全二叉树的节点个数这道题如果要最快,就要充分利用完全二叉树的性质。甚至还有二分查找法,还没怎么认真看利用树的深度判断是否为完全二叉树。若是,直接公式得出节......
  • leetcode-461.汉明距离
    461.汉明距离publicinthammingDistance(intx,inty){intz=x^y;//上下俩数都一样为0,不一样为1,得到一个整体intres=0;//当z......
  • J - Just Arrange the Icons CodeForces - 1267J (思维+暴力)
    题意n个软件,每个软件都有种类,而屏幕有容量s(自己决定),有两个限制:一个屏幕只能放s-1或者s个软件一个屏幕上只能防同种的软件求最小的屏幕数。思路枚举s代......
  • 2067. 走方格
    2067.走方格-AcWing题库第一眼就是暴搜2333结果显而易见,卡数据了,9/10,最后一个过不了DFS:#include<iostream>#include<cstring>#include<algorithm>usingnamespace......
  • [leetcode] The Skyline Problem
      classSolution{publicList<int[]>getSkyline(int[][]buildings){List<int[]>res=newArrayList<>();List<int[]>height=newAr......
  • LeetCode刷题记录.Day3
    长度最小的子数组题目链接209.长度最小的子数组-力扣(LeetCode)看似很简单。看完滑动窗口法的时候觉得很容易理解,时间复杂度O(n)的推导也理解。无非就是两个指针,因为题......
  • leetcode-2423-easy
    RemoveLetterToEqualizeFrequencyYouaregivena0-indexedstringword,consistingoflowercaseEnglishletters.Youneedtoselectoneindexandremovethe......