1073. Adding Two Negabinary Numbers

本文介绍了一种解决LeetCode上Adding Two Negabinary Numbers问题的方法,详细解释了如何处理负二进制数的进位问题,给出了具体的示例和代码实现。

1073. Adding Two Negabinary Numbers


Given two numbers arr1 and arr2 in base -2, return the result of adding them together.

Each number is given in array format: as an array of 0s and 1s, from most significant bit to least significant bit. For example, arr = [1,1,0,1] represents the number (-2)^3 + (-2)^2 + (-2)^0 = -3. A number arr in array format is also guaranteed to have no leading zeros: either arr == [0] or arr[0] == 1.

Return the result of adding arr1 and arr2 in the same format: as an array of 0s and 1s with no leading zeros.

Example 1:

Input: arr1 = [1,1,1,1,1], arr2 = [1,0,1]
Output: [1,0,0,0,0]
Explanation: arr1 represents 11, arr2 represents 5, the output represents 16.

Note:

  1. 1 <= arr1.length <= 1000
  2. 1 <= arr2.length <= 1000
  3. arr1 and arr2 have no leading zeros
  4. arr1[i] is 0 or 1
  5. arr2[i] is 0 or 1

方法1:

discussion: https://leetcode.com/problems/adding-two-negabinary-numbers/discuss/303795/C%2B%2B-From-Wikipedia

思路:

先讲一个栗子:
arr1 = [1,1,1,1,1]
arr2 = [1,0,1]
每一位对应的是(-2)^4 + (-2) ^3 + (-2)^2 + (-2) ^1 + (-2) ^0。从最后一位开始 1 + 1 = 2, 向前进位,但是由于下一位代表的是-1,所以carry = -1,下一位的和1 + 0 - 1 = 0,carry 恢复0。继续往前1 + 1 = 2,carry = -1,往前1 - 1= 0, carry = 0。最后一位1 + 0 + 0 = 1,carry = 0,结束。

也就是说,每一次向上进位,由于相邻位符号相反,需要进-1而不是1。而当前位也因为后面可能进位-1,0,1,而出现-1,0,1,2。2的情况下进位-1,-1的情况下怎么表示?举例来讲[1, 0, 1] + [1, 0, 1] = [ ,-1, 0],也就是 2, 可以拆成2 = 4 + (-2) = [1, 1, 0],对比-2 = [1, 0]。所以当sum = - 1,本位 =1 ,进位carry = 1。最后,由于存在-1,有可能本来是1的高位被清零。所以最后还要将高位0清除,比如下面的栗子。

Input:
[1]
[1,1]
Output:
[0,0]
Expected:
[0]

易错点:

  1. 小技巧:for loop继续遍历结束或者carry != 0。但是要小心n1 - i 和 n2 - i 变成负数。
  2. pop前缀0。

Complexity

Time complexity: O(max(n1, n2))
Space complexity: O(max(n1, n2))

class Solution {
public:
    vector<int> addNegabinary(vector<int>& arr1, vector<int>& arr2) {
        // if (arr1.size() < arr2.size()) swap(arr1, arr2);
        int n1 = arr1.size(), n2 = arr2.size();
        int carry = 0;
        vector<int> res;
        for (int i = 0; i <= n1 || carry != 0; i++){
            int sum = ((n1 - i) < 0 ? 0 : arr1[n1 - i]) + ((n2 - i) < 0 ? 0: arr2[n2 - i]) + carry;
            res.push_back(abs(sum) % 2);
            if (sum < 0) carry = 1;
            else if (sum > 1) carry = -1;
            else carry = 0;
        }
        while (res.size() > 1 && res.back() == 0) res.pop_back();
        reverse(res.begin(), res.end());
        return res;
    }
};
<think> 嗯,用户询问关于GRUB配置文件生成过程中出现的'Generating grub configuration file ... Adding boot menu entry for UEFI Firmware Settings ... done'这条信息的含义。从提供的多个引用来看,这个问题涉及Linux系统的启动管理流程。 用户可能是Linux系统管理员或普通用户遇到了启动菜单问题。引用[1][2][3][5]都提到了类似的流程:修改GRUB配置后需要执行grub2-mkconfig或update-grub命令重新生成配置文件。特别注意到引用[1]和[3]明确显示了这条信息出现在命令执行过程中。 这条信息实际包含两个关键部分:第一部分"Generating grub configuration file..."表明系统正在扫描所有可用内核和操作系统;第二部分"Adding boot menu entry for UEFI Firm件 Settings"则是专为UEFI系统添加的特殊功能项——允许用户不进入操作系统直接访问固件设置界面。引用[5]提到这个功能依赖主板固件实现。 值得注意的是引用[4]展示了完整的grub.cfg生成过程,结尾同样出现"...done"的完成提示。这说明该操作是标准流程而非错误信息。用户如果看到这条消息,实际表明GRUB配置更新成功完成了两件事:重建主配置文件+添加UEFI设置入口。 考虑到用户可能担心这是异常提示,我需要强调这是正常操作反馈。同时提醒用户注意引用[2]指出的关键细节:UEFI和BIOS模式对应的配置文件路径不同,这个差异可能导致配置更新无效。 </think> 这条信息表示在重新生成GRUB配置文件时,成功添加了**访问UEFI固件设置界面**的启动菜单项。以下是详细解读: 1. **`Generating grub configuration file ...`** 表示系统正在执行 `grub2-mkconfig` 或 `update-grub` 命令,扫描当前系统中的内核、操作系统和其他启动项,**重新生成GRUB的主配置文件**(通常是 `/boot/grub2/grub.cfg` 或 `/boot/efi/EFI/[发行版名]/grub.cfg`)。 2. **`Adding boot menu entry for UEFI Firmware Settings ... done`** * **核心功能**:自动在GRUB启动菜单中添加一个特殊条目,允许用户**直接进入主板的UEFI设置界面**(类似传统BIOS设置)。 * **触发条件**:系统检测到当前以 **UEFI模式启动**(非传统BIOS模式)时自动添加此选项[^1][^5]。 * **用户价值**:无需在开机时按特定热键(如F2、Del等,不同主板差异大),直接从启动菜单一键进入固件设置,极大提升便利性[^1][^3]。 * **显示效果**:在GRUB菜单中通常会显示为 `UEFI Firmware Settings` 或 `System Setup` 等类似条目。 **执行后的典型GRUB菜单结构示例**: ``` Ubuntu Advanced options for Ubuntu Windows Boot Manager (on /dev/sdaX) **UEFI Firmware Settings** <-- 新添加的条目 ``` 选择此条目将直接重启并进入主板UEFI设置界面。 --- **关键补充说明**: 1. **路径差异**:UEFI模式下配置文件路径通常为 `/boot/efi/EFI/[发行版名]/grub.cfg`(如引用[2][4][5]),而BIOS模式为 `/boot/grub2/grub.cfg`[^2]。 2. **命令等效性**:`sudo update-grub`(Ubuntu/Debian系)与 `sudo grub2-mkconfig -o /目标路径/grub.cfg`(RHEL/CentOS系)作用相同[^3][^5]。 3. **依赖关系**:该功能需主板固件支持UEFI标准接口(EFI_OS_INDICATIONS_START_FIRMWARE),现代主板普遍支持[^1][^5]。 --- **相关问题** 1. 如何区分系统是以UEFI模式还是传统BIOS模式启动? 2. 手动添加自定义启动菜单项到GRUB的步骤是什么? 3. 为什么有时执行 `grub2-mkconfig` 后Windows启动项会消失?如何解决? 4. GRUB_TIMEOUT和GRUB_TIMEOUT_STYLE参数的具体作用是什么?[^3] [^1]: GRUB配置重建命令的输出信息 [^2]: UEFI与BIOS模式下配置文件的路径差异 [^3]: GRUB默认配置修改与更新流程 [^4]: GRUB配置生成后的环境文件内容 [^5]: GRUB自动检测Windows启动项的实现机制
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值