1073. 负二进制数相加(leetcode,模拟,数学分析)-------------------c++实现

news2024/11/23 2:50:01

1073. 负二进制数相加(leetcode,模拟,数学分析)-------------------c++实现

题目表述

给出基数为 -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 组成的数组。

样例

示例 1:

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

输入:arr1 = [0], arr2 = [0]
输出:[0]
示例 3:

输入:arr1 = [0], arr2 = [1]
输出:[1]

条件

1 <= arr1.length, arr2.length <= 1000
arr1[i] 和 arr2[i] 都是 0 或 1
arr1 和 arr2 都没有前导0

思路

自己思路:
用每个位加法计算,1+1可以和-2抵消,也可以变成4+(-2),所以如果同一位相加大于等于2,就有多种情况:
1.等于2or3:
前一位-1 or 前一位和前二位都+1(3的话此位为1,2的话此位为0)
2.等于4:
前一位-2 or 前二位+1
通过模拟可以得出 单位的最大值就为4,所以无需考虑其他。

答案思路(精彩绝伦):
用一位add作为进位计数,如果进位后的下一位再次计算时加和为-1,则此位变1,然后进位计数为1.

注意点

计算分3部分组成:
1.arr1和arr2相同位数
2.处理max(arr1,arr2)的位数
3.处理多余位数
最后需要再处理前导0位。
在这里插入图片描述
第一个通过为答案解法 第二个通过为作者自己解法。

ac代码

c++:

自己思路

#include<iostream>
#include<bits/stdc++.h>
using namespace std;
class Solution {
public:
    void DealResult(vector<int> &result,int now,int sit)
    {
        if(now==1)
        result[sit]=1;
        else
        result[sit]=0;
        if(now>=2&&now<=3)
        {
            if(result[sit-1]==0)
            {result[sit-1]+=1;
             result[sit-2]+=1;
            }
            else
            result[sit-1]-=1;
            if(now==3)
            result[sit]=1;
            
        }
        if(now==4)
        {
            if(result[sit-1]==2)
            result[sit-1]-=2;
            else
            result[sit-2]+=1;
        }
    }
    vector<int> addNegabinary(vector<int>& arr1, vector<int>& arr2) {
        vector<int> result(max(arr1.size(),arr2.size())+3,0);
        int now;
       int i=arr1.size()-1,j=arr2.size()-1,k=result.size()-1;
       //deal arr1,arr2,result;
        while(i>=0&&j>=0)
        {
            now = arr1[i]+arr2[j]+result[k];
            DealResult(result,now,k);
            i--;j--;k--;
        }
        //get the bigger arr to remain
        vector<int> remain(max(i+1,j+1),0);
        int remainsit = 0;
        if(i>=0)
        {
            copy(arr1.begin(),arr1.begin()+i+1,remain.begin());
            remainsit = i;
        }
        else
        {
            copy(arr2.begin(),arr2.begin()+j+1,remain.begin());
            remainsit = j;
        }
 		//deal the remain
        while(remainsit>=0)
        {
                now=remain[remainsit]+result[k];
                DealResult(result,now,k);
                k--;remainsit--;
        }
        //deal the sit > max(arr1,arr2)
        while(k>=0)
        {
            now = result[k];
            DealResult(result,now,k);
            k--;
        }
        now = 0;
        //deal leading zeros
        while(now<result.size()-1)
        {
            if(result[now]==0)
            now++;
            else
            break;
        }
    result.erase(result.begin(),result.begin()+now);
    return result;
    }
};

int main(){
    
    Solution s;
    int a1[2]={1,1},a2[2]={1,1};
    vector<int> arr1,arr2;
    for(auto x:a1)
    arr1.push_back(x);
    for(auto x:a2)
    arr2.push_back(x);
    vector<int> result = s.addNegabinary(arr1,arr2);
    for(auto x:result)
    cout<<x<<" ";
}

c++:

答案思路

class Solution {
public:
    vector<int> addNegabinary(vector<int>& arr1, vector<int>& arr2) {
        int i=arr1.size()-1,j=arr2.size()-1;
        vector<int> ans;
        int add=0;
        int x=0;
   
        while(i>=0||j>=0||add)
        {
            x=0;
            if(i>=0)
            x+=arr1[i--];
            if(j>=0)
            x+=arr2[j--];
            x+=add;
            if(x>=2)
            {
                ans.push_back(x-2);
                add=-1;
            }
            else if(x>=0)
            {
                ans.push_back(x);
                add=0;
            }
            else
                {
                    ans.push_back(1);
                    add=1;
                }
        }
        while (ans.size() > 1 && ans.back() == 0) {
            ans.pop_back();
        }
        reverse(ans.begin(),ans.end());
        return ans;
    }
};

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/adding-two-negabinary-numbers/
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/540051.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Kubernetes1.26.3 高可用集群

Kubernetes1.26.3 高可用集群 0、服务器信息 服务器为腾讯云服务器&#xff08;按需计费&#xff0c;按流量计费&#xff0c;并且将IP转换为弹性IP&#xff0c;使用结束可关机仅收取硬盘等固定资源费用&#xff09; 服务器名称IP描述组件信息Kubernetes1124.223.218.159maste…

Matlab如何调用外部函数/工具包,如何将新函数加到默认函数库中

自从开始制作、分享工具包&#xff0c;我被问到最多的一个问题是&#xff1a; “XXX工具包怎么用&#xff1f;” 而我给出的回答通常是&#xff1a; “放在你代码文件夹&#xff0c;当函数调用。” 什么意思呢&#xff1f; 方法1 比如在名为“1”的文件夹中放着我们想要运…

TreeSet源码分析

概述 TreeSet &#xff0c;基于 TreeSet 的 Set 实现类。在业务中&#xff0c;如果我们有排重 排序的需求&#xff0c;一般会考虑使用 TreeSet #TreeSet的继承关系 TreeSet的内部属性 m 的 key &#xff0c;存储 HashSet 的每个 key 。 map 的 value &#xff0c;因为 TreeSe…

DJ5-3 多路访问链路和协议

目录 一、网络链路 二、广播信道要解决问题 三、多路访问协议 1、基本介绍 2、多路访问协议的类型&#xff08;3&#xff09; 四、信道划分协议 1、时分多路访问 TDMA 2、频分多路访问 FDMA 3、码分多路访问 CDMA&#xff08;略&#xff09; 五、随机访问协议 1、纯…

基于AD96808 FMC 模块,支持8 路14-bit、500MSPS/1GSPS/1.25GSPSADC 采集功能

板卡概述 FMC-XM148 是一款基于VITA57.4 标准的JESD204B 接口FMC 子卡模块&#xff0c;该模块可以实现8 路14-bit、500MSPS/1GSPS/1.25GSPSADC 采集功能。该板卡ADC 器件采用ADI 公司的AD9680 芯片,全功率-3dB 模拟输入带宽可达2GHz。该ADC 与FPGA 的主机接口通过16 通道的高速…

ThingsBoard自定义分发节点duplicate to related

------------------------------------内容仅博主所有,订阅者请勿泄露,感谢--------------------- 1、概述 大家好,我又更新干货了,还是那句话,我绝不像某些博主“拿我格子衫”分享那些照抄官网翻译的东西来骗订阅,我觉得那是浪费时间,要搞就搞干货,今天给大家分享Th…

高端制造业国产化是未来高质量发展的必经之路

在当前全球经济的大背景下&#xff0c;高端制造业已成为各国竞争的焦点。中国作为世界第二大经济体&#xff0c;也在高端制造业领域发挥着越来越重要的作用。然而&#xff0c;我们必须清醒地认识到&#xff0c;目前我国高端制造业的发展还面临着一些困难和挑战&#xff0c;其中…

国产高性能DSP音频处理芯片的工作原理以及应用领域

DSP芯片是数字信号处理器的简称&#xff0c;它是一种专门用于数字信号处理的微处理器&#xff0c;它可以对数字信号进行高速运算和处理。DSP是一类嵌入式通用可编程微处理器&#xff0c;主要用于实现对信号的采集、识别、变换、增强、控制等算法处理&#xff0c;是各类嵌入式系…

ChatGPT 高效对话-学习使用提示语Prompts​

我们整理了一些可以帮助你学习如何使用ChatGPT的资源&#xff0c;包括吴恩达教授最新推出的官方ChatGPT提示词工程师课程的中文B站视频资源&#xff0c;一些插件、使用ChatGPT的标准范式等。 我们将这些所有的相关网址收录到 webhub123 ChatGPT 高效对话-学习使用提示语Promp…

【LeetCode】326. 3 的幂

326. 3 的幂&#xff08;简单&#xff09; 方法一&#xff1a;试除法 思路 我们可以先进行特殊点判断&#xff0c;n < 0 的数都不可能是 3 的幂次方。接着&#xff0c;当 n > 0 且 n 能被 3 整除 时&#xff0c;我们对其整除 3 &#xff0c;直到该条件不满足&#xff…

MyBatis之缓存机制

缓存即为存在内存中的临时数据.将用户经常查询的数据存放在缓存(内存)中,用户去查询数据就不用去每次去数据库中查询,而是去缓存中查询,从而提高了查询的效率,解决了高并发系统的性能问题.MyBatis提供了两种缓存机制&#xff1a;一级缓存&#xff08;本地&#xff09;和二级缓存…

thinkphp6 消息队列think-queue(完整版)

1.安装队列依赖 如果是在Linux上&#xff0c;进入thinkphp项目的think文件所在目录&#xff0c;执行安装命令 composer require topthink/think-queue 2.修改queue的配置文件&#xff0c;文件位置config/queue.php(安装成功后自动生成) <?php return [default >…

Python实现ACO蚁群优化算法优化循环神经网络回归模型(LSTM回归算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 蚁群优化算法(Ant Colony Optimization, ACO)是一种源于大自然生物世界的新的仿生进化算法&#xff0c…

Layui layer 弹出层的使用【笔记】

Layui layer 弹出层的使用 首先&#xff0c;为了方便直接通过在线cdn引入对应的css和js <!-- 引入 layui.css --> <link href"//unpkg.com/layui2.8.0/dist/css/layui.css" rel"stylesheet"> <!-- 引入 layui.js --> <script src&…

来自非985211的普通本科的Android面试题分享【网络安全】

文中附有详细的面试真题目&#xff0c;文末有我当时刷的面试真题还有一些对我帮助良多的复习资料&#xff0c;特别有用&#xff0c;希望也可以帮大家顺利上岸&#xff0c;顺便攒攒人品&#xff01; 个人的基本情况 本人出生在一个普通家庭&#xff0c;自身学历很一般&#xff…

现在的00后,真是卷死了呀,辞职信已经写好了·····

都说00后躺平了&#xff0c;但是有一说一&#xff0c;该卷的还是卷。这不&#xff0c;三月份春招我们公司来了个00后&#xff0c;工作没两年&#xff0c;跳槽到我们公司起薪23K&#xff0c;都快接近我了。 后来才知道人家是个卷王&#xff0c;从早干到晚就差搬张床到工位睡觉了…

【taro react】---- 解决开发环境微信小程序由于主包体积过大不能预览问题

1. 开发环境代码包大小 注意:可以看到此时主包加分包将近 5MB,上传预览将会超出限制!!! 2. 预览结果 报错:代码包大小超过限制,主包资源近3MB,限制最大2MB!!! 3. 解决办法 使用webpack的压缩插件,在开发环境编译的时候进行压缩;进行分包处理,同时依赖也进行分包处…

冲刺618:新品变爆品,品牌如何提炼差异化卖点?

纵观2023年品牌生态&#xff0c;大牌强势、新锐崛起。618大促将至&#xff0c;当前市场营销内容同质化严重&#xff0c;如何占领用户心智&#xff0c;成为品牌营销的“考题”之一。千瓜&#xff5c;谦果营销 结合小红书品牌推广实操经验&#xff0c;沉淀总结品牌差异化卖点提炼…

OpenText Exceed TurboX 桌面虚拟化解决方案整合数据中心、提供高端图形显示

突出特点 2D 和 3D 图形应用程序的卓越性能远程访问&#xff1b; 全球团队的强大协作&#xff1b; 高级安全和集中管理&#xff1b; 从 MicrosoftWindows、Mac、Linux 或 iPad 远程访问。 企业正在寻求整合数据中心&#xff0c;达到减少 IT 支出并提高中央可管理性的目的。 同…

决策反馈均衡器介绍

参考链接&#xff1a;https://www.163.com/dy/article/GK6BBSEB0531PW97.html https://zhuanlan.zhihu.com/p/477141677 DFE全称为Decision Feedback Equalizer&#xff0c;即决策反馈均衡器。它是一种电信通信系统中常用的均衡器&#xff0c;在接收信号端实现等化器、滤波器和…