zoukankan      html  css  js  c++  java
  • 1073. 负二进制数相加

    题面:

    给出基数为 -2 的两个数 arr1 和 arr2,返回两数相加的结果。

    数字以 数组形式 给出:数组由若干 0 和 1 组成,按最高有效位到最低有效位的顺序排列。例如,arr = [1,1,0,1] 表示数字 (-2)^3 + (-2)^2 + (-2)^0 = -3。数组形式 的数字也同样不含前导零:以 arr 为例,这意味着要么 arr == [0],要么 arr[0] == 1。

    返回相同表示形式的 arr1 和 arr2 相加的结果。两数的表示形式为:不含前导零、由若干 0 和 1 组成的数组。

    示例:

    输入:arr1 = [1,1,1,1,1], arr2 = [1,0,1]
    输出:[1,0,0,0,0]
    解释:arr1 表示 11,arr2 表示 5,输出表示 16 。
     

    提示:

    1 <= arr1.length <= 1000
    1 <= arr2.length <= 1000
    arr1 和 arr2 都不含前导零
    arr1[i] 为 0 或 1
    arr2[i] 为 0 或 1

    题解:

    模拟(0(n))

    与基数为2的二进制不一样的是,进位是高位减一;

    因此此时应该检查数位上是否出现了-1,如果出现了,高位加1将当前位变为1

    最后除去前导0

    代码:

    class Solution {
    public:
        vector<int> addNegabinary(vector<int>& arr1, vector<int>& arr2) {
            reverse(arr1.begin(),arr1.end());
            reverse(arr2.begin(),arr2.end());
            int n=arr1.size(),m=arr2.size();
            if(n<m)
                arr1.resize(m);
            else
                arr2.resize(n);
            n=max(n,m);
            vector<int>res(n+2,0);
            for(int i=0;i<n;i++)
            {
                res[i]+=arr1[i]+arr2[i];
                res[i+1]-=res[i]/2;
                res[i]%=2;
            }
            for(int i=0;i<n+1;i++)
            {
                if(res[i]<0)
                {
                    res[i]+=2;
                    res[i+1]++;
                }
                res[i+1]-=res[i]/2;
                res[i]%=2;
            }
            n+=2;
            while(n>1&&res[n-1]==0)
                n--;
            res.resize(n);
            reverse(res.begin(),res.end());
            return res;
        }
    };
  • 相关阅读:
    DAO模式多表联查
    使用ADO.NET访问数据库
    连接查询和分组查询
    模糊查询和聚合函数
    poj 1220 NUMBER BASE CONVERSION
    poj 1964 City Game
    Odd number problem
    POJ 2983 M × N Puzzle
    L O V E
    【Mybatis】【3】处理大于号小于号及其他特殊字符
  • 原文地址:https://www.cnblogs.com/flyljz/p/11684884.html
Copyright © 2011-2022 走看看