【每日一题/数学模拟题/进位算术】1073. 负二进制数相加

news2025/5/13 6:28:40

⭐️前面的话⭐️

本篇文章介绍【1073. 负二进制数相加】题解,算法标签:【数学】,【思维】,【模拟算术】,展示语言c++/java。

📒博客主页:未见花闻的博客主页
🎉欢迎关注🔎点赞👍收藏⭐️留言📝
📌本文由未见花闻原创,CSDN首发!
📆首发时间:🌴2022年5月18日(于19日补发)🌴
✉️坚持和努力一定能换来诗与远方!
💭推荐书籍:📚《算法》,📚《算法导论》
💬参考在线编程网站:🌐牛客网🌐力扣
博主的码云gitee,平常博主写的程序代码都在里面。
博主的github,平常博主写的程序代码都在里面。
🍭作者水平很有限,如果发现错误,一定要及时告知作者哦!感谢感谢!


📌导航小助手📌

  • ⭐️1073. 负二进制数相加⭐️
    • 🔐题目详情
    • 💡解题思路
    • 🔑源代码
  • 🌱总结


封面


⭐️1073. 负二进制数相加⭐️

🔐题目详情

1073. 负二进制数相加

难度中等

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

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

返回相同表示形式的 arr1arr2 相加的结果。两数的表示形式为:不含前导零、由若干 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] 都是 01
  • arr1arr2 都没有前导0

💡解题思路

解题思路

思路1:最简单的方案就是,将数转换为十进制,进行计算后,将得到的结果转换为二级制数组,但是数组长度最大为 1000 1000 1000,必然会爆int,因此该方案不可取。

思路2:模拟加减计算,我们可以先将两个数组对应相加,得到一个新数组,新数组长度大于原来俩数组中最大长度 10 10 10个大小肯定够了,进位也不可能进10位。

加减计算后,由于原来数组只有01,进行加法后,可能取值为0,1,-1,因为是基础权重是负数,由于相邻的俩位,是少乘以一个负数的关系,所以相邻位正负号一定相反,所以当需要进位时,其实就是在前一位减去对应的进位权重即可,如当前位为2,则可进位,进位本质上就是加上 2 × ( − 2 ) x = − ( − 2 ) x + 1 2 \times(-2)^{x}=-(-2)^{x+1} 2×(2)x=(2)x+1,即在前一位需要减去1,由于“减位”机制的存在,数组取值可能还会出现-1

那如果当前位取值为-1时,如何处理呢?其实我们不难列出如下一个等式:
( − 1 ) × ( − 2 ) x = ( − 2 ) x + ( − 2 ) x + 1 (-1) \times(-2)^{x}=(-2)^{x}+(-2)^{x+1} (1)×(2)x=(2)x+(2)x+1
因此我们只需将该位处理成 1 1 1,前一位加上 1 1 1即可。在这里会将前一位加上 1 1 1,因此数组可能取值又多了3

综上所述,数组取值可能为-1,0,1,2,3,处理情况如下:

  • 数组元素大于1,将前一位减去1,当前位取2的模。
  • 数组元素为10,无需处理。
  • 数组元素为-1,将当前位处理为1,前一位加1

🔑源代码

C++代码:

class Solution 
{
public:
    vector<int> addNegabinary(vector<int>& arr1, vector<int>& arr2) 
    {
        //第一步,统一调整数组,使得第一个数组长度更加大
        int size1 = arr1.size();
        int size2 = arr2.size();
    
        if (size2 > size1) 
        {
            vector<int> tmp(arr1);
            arr1 = arr2;
            arr2 = tmp;
        } 
        size1 = arr1.size();
        size2 = arr2.size();
        //第二步,进行两个数组的加减法
        int cur1 = size1 - 1;
        int cur2 = size2 - 1;
        vector<int> sum(size1 + 10);
        int i = sum.size() - 1;
        while (cur2 >= 0) sum[i--] = arr1[cur1--] + arr2[cur2--];
        //处理剩余数字
        while (cur1 >= 0) sum[i--] = arr1[cur1--];
        //第三步,调整非法数字,由于初始数组值为0或1,进行加减法进行借位运算,最大值为3,最小值为-1
        i = sum.size() - 1;
        while (i >= 0) 
        {
            if (sum[i] >= 2) 
            {
                //情况1,数值大于2,因为前一位符号相反,所以等价前位减去对应借位数
                sum[i - 1] -= sum[i] / 2;
                sum[i] = sum[i] % 2;
            } else if (sum[i] == -1) 
            {
                //情况2,数值为-1,借位造成,可以将当前位设置为1,前位加1等价解决
                sum[i - 1] += 1;
                sum[i] = 1;
            }
            i--;
        }

        // 去除前导0,但是至少保留一位
        if (sum[0] != 0) return sum;
        else 
        {
            //最终长度
            int finalLen = sum.size() - 1;
            //与sum数组长度差值(前导0个数)
            int k = 1;

            //求前导0个数,并求对应结果数组长度
            int j = 1;
            while (j < sum.size() && sum[j] == 0) 
            {
                j++;
                finalLen--;
                k++;
            }
            if (finalLen <= 0) finalLen = 1;

            vector<int> ans(finalLen);
            //拷贝数组
            for (j = 0; j < finalLen && j + k < sum.size(); j++) 
            {
                ans[j] = sum[j + k];
            }
            return ans;
        }
    }
};

Java代码:

class Solution {
    public int[] addNegabinary(int[] arr1, int[] arr2) {
        //使得第一个数组长度更长,如果短,则交换
        int len1 = arr1.length;
        int len2 = arr2.length;
        if (len2 > len1) {
            int[] tmp = arr1;
            arr1 = arr2;
            arr2 = tmp;
        }
        len1 = arr1.length;
        len2 = arr2.length;

        //首先进行对应位的加减法
        int cur1 = len1 - 1;
        int cur2 = len2 - 1;
        int[] sum = new int[len1 + 10];
        int i = sum.length - 1;
        //两个数组的加减法
        while (cur2 >= 0) {
            sum[i--] = arr1[cur1--] + arr2[cur2--];
        }
        while (cur1 >= 0) {
            sum[i--] = arr1[cur1--];
        }
        // 处理非0非1的数,最极限情况进2位
        i = sum.length - 1;
        while (i >= 0) {
            if (sum[i] > 1) {
                sum[i - 1] -= sum[i] / 2;
                sum[i] = sum[i] % 2;
            } else if (sum[i] == -1) {
                sum[i] = 1;
                sum[i - 1] += 1;
            }
            i--;
        }

        //处理前导0,最少留一个
        if (sum[0] != 0) return sum;
        else {
            int finalLen = sum.length - 1;
            int k = 1;
            int j = 1;
            //处理后续前导0
            while (j < sum.length && sum[j] == 0) {
                finalLen--;
                k++;
                j++;
            }
            //保证最少有一个前导0
            if (finalLen == 0) finalLen = 1;
            int[] ans = new int[finalLen];
            for (j = 0; j < finalLen && j + k < sum.length; j++) {
                ans[j] = sum[j + k];
            }
            return ans;
        }
    }
}

🌱总结

进位规律探索,进位模拟。


觉得文章写得不错的老铁们,点赞评论关注走一波!谢谢啦!

1-99

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

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

相关文章

代码随想录训练营Day38| 理论基础 509. 斐波那契数 70. 爬楼梯 746. 使用最小花费爬楼梯

目录 学习目标 学习内容 理论基础 509. 斐波那契数 70. 爬楼梯 746. 使用最小花费爬楼梯 学习目标 理论基础 509. 斐波那契数 70. 爬楼梯 746. 使用最小花费爬楼梯 学习内容 理论基础 problems/动态规划理论基础.md programmercarl/leetcode-master&#xff08;代码随…

C++的list使用

list 1.list的介绍和使用1.1. list介绍1.2. list的使用1.2.1 list的构造1.2.2. list iterator的使用1.2.3. list capacity1.2.4 list element access1.2.5 list modifiers1.2.6 list的迭代器失效 1.list的介绍和使用 1.1. list介绍 list是可以在常数范围内在任意位置进行插入…

chatgpt赋能Python-python2的n次方

Python2中实现n次方的方法 Python是一种非常受欢迎的编程语言&#xff0c;其简单易学的特性吸引了大量的开发者前来学习和使用。在Python2中&#xff0c;实现n次方有多种方法&#xff0c;下面就给大家介绍一些。 方法一&#xff1a;使用运算符 在Python2中&#xff0c;可以使…

不重启Linux修改主机名,以CentOS 7举例

在 Linux 中&#xff0c;可以通过修改主机名配置文件的方式更改主机名&#xff0c;不需要重启机器即可立即生效。 下面介绍一下具体步骤&#xff1a; 1、查看原始主机名 比如我的主机名叫small-black 2、使用命令行修改主机名 2.1 修改主机名 首先&#xff0c;使用以下命…

2023年的深度学习入门指南(14) - 不能只关注模型代码

2023年的深度学习入门指南(14) - 不能只关注模型代码 最近&#xff0c;有一张大模型的发展树非常流行&#xff1a; 这个图是相当不错的&#xff0c;对于加深对于Transformer模型编码器、解码器作用的理解&#xff0c;模型的开源和闭源情况等等都相当有帮助&#xff0c;大家使…

尝试Google Bard并对比OpenAI ChatGPT,一个擅长创造性,一个擅长事实查询?

文章目录 尝试Google Bard并对比OpenAI ChatGPT&#xff0c;一个擅长创造性&#xff0c;一个擅长事实查询&#xff1f;Google Bard 的自我介绍Google Bard 暂时不支持中文Google Bard除了支持英语外&#xff0c;还支持日语Google Bard和OpenAI ChatGPT的对比Google Bard的回答O…

音乐宿主软件排行榜前十名,音乐宿主要买正版吗

随着电子音乐的不断发展&#xff0c;一些电子音乐爱好者开始尝试自己编写电子音乐。而编写电子音乐必不可少的一点就是需要一款非常好用的音乐宿主软件&#xff0c;那么今天我们就来说一说音乐宿主软件排行榜前十名以及音乐宿主软件要买正版吗这两个问题。 一、音乐宿主软件排…

数组【C语言】

目录 一维数组的创建和初始化 数组创建 数组的初始化 一维数组的使用 一维数组在内存中的存储 二维数组的创建与初始化 二维数组的创建 二维数组的初始化 二维数组的使用 二维数组在内存中的存储 数组越界 数组名作为函数参数 数组名 一维数组的创建和初始化 数组…

chatgpt赋能Python-python3_8降级3_6

Python3.8降级3.6&#xff0c;你需要知道的一切 在Python语言的世界中&#xff0c;每一个版本带来了新的变化和功能。但是在某些情况下&#xff0c;汲取早期版本的优点也是很必要的。Python3.8之前的版本当中&#xff0c;Python3.6是广泛使用的版本&#xff0c;因为它包含了许…

t检验是基于t分布的

例&#xff1a;鸢尾花的平均花瓣长度为3.5cm&#xff0c;这种说法正确吗&#xff1f; 可以根据假设检验的步骤&#xff0c;进行解决。 /设置原假设与备择假设&#xff1a; 原假设&#xff1a;μ μ0 3.5cm&#xff08;说法正确&#xff09; 备择假设&#xff1a;μ ≠ μ0 ≠…

chatgpt赋能Python-python3_8怎么安装matplotlib

Python3.8怎么安装Matplotlib Matplotlib是一个非常流行的Python可视化库&#xff0c;它可以用来创建各种类型的图形&#xff0c;包括线图、散点图、直方图、饼图和热图等等。在本文中&#xff0c;我们将介绍如何在Python3.8中安装Matplotlib&#xff0c;以及如何使用它来绘制…

chatgpt赋能Python-python3_9_0怎么安装

Python3.9.0的安装指南 Python作为目前世界上使用最广泛的编程语言之一&#xff0c;在数据科学、人工智能、Web开发等领域都有着广泛的应用。而今年10月5日&#xff0c;Python官方发布了最新的稳定版本——Python3.9.0。本文将提供一份简明的Python3.9.0安装指南。 准备工作 …

C++模板类与继承

目录 分类 一、模板类不继承 &#xff08;1&#xff09;代码 &#xff08;2&#xff09;分析 &#xff08;3&#xff09;运行结果 二、模板类继承普通类 &#xff08;1&#xff09;代码 &#xff08;2&#xff09;分析 &#xff08;3&#xff09;运行结果 三、普通类继…

【TCP协议】TCP的运输连接管理-三次握手四次挥手

TCP 的运输连接管理 TCP 是面向连接的协议&#xff0c;运输连接是用来传送 TCP 报文的&#xff0c;TCP 的运输连接的建立和释放是每一次面向连接的通信中必不可少的过程。因此&#xff0c;运输连接就有三个阶段&#xff0c;即&#xff1a;连接建立、数据传输、连接释放。 TCP…

chatgpt赋能Python-python3_6_6怎么用

Python3.6.6的基本介绍 1. Python3的发展历程 自1991年Guido van Rossum创造了Python language以来&#xff0c;Python一直在不断发展和改进。Python3是Python中的最新版本&#xff0c;它对Python2进行了重大升级。Python3.6.6是Python3的一个稳定版本&#xff0c;其中包含了…

chatgpt赋能Python-python3_4安装numpy

Python3.4安装Numpy的SEO指南 Numpy是Python科学计算库之一&#xff0c;它提供了强大的支持&#xff0c;使您可以使用Python进行数学和科学计算。Numpy的安装是许多Python开发者必须掌握的技能&#xff0c;因为它是许多其他库的先决条件。在本SEO指南中&#xff0c;我们将介绍…

MATLAB信号处理:滤波器设计、频域分析和数字信号处理的应用和优化

章节一&#xff1a;引言 在现代科技领域中&#xff0c;信号处理起着至关重要的作用。它涵盖了从音频和图像处理到通信和生物医学工程等众多领域。MATLAB作为一种强大的数值计算软件&#xff0c;为信号处理提供了丰富的工具和函数&#xff0c;使得信号处理任务更加高效和可靠。…

chatgpt赋能Python-python3_6怎么下载

Python3.6如何下载&#xff1a;完全指南 Python 3.6是一种非常强大的编程语言&#xff0c;被广泛应用于各种应用程序和领域。如果你还没有安装Python 3.6&#xff0c;那么你已经错过了很多有趣的功能和工具。本文将向你介绍如何在各种操作系统上下载Python 3.6&#xff0c;无论…

在Vue项目中vue-quill-editor的安装与使用【详细图解+过程+包含图片的缩放拖拽】

Quill 官网&#xff1a;https://quilljs.com// 一、Quill的安装与使用&#xff08;初级&#xff09; 1、下载安装 npm install vue-quill-editor --save这里建议使用管理员命令窗口的形式&#xff0c;找到自己的项目&#xff0c;如下图所示。然后进行安装&#xff08;目的&a…

RBTree改造,并模拟实现setmap

目录 RBTree改造 给红黑树增加迭代器 前置 前置-- RBT细节改造 模拟set 模拟map RBTree改造 给红黑树增加迭代器 前置 前置的作用是找下一个较大的节点。 假如我们it指向的是5&#xff0c;it则是将it指向6。加入it指向的是7&#xff0c;则it则是将it指向8。 也就是说…