53 - II. 0~n-1中缺失的数字

本文介绍了一道编程题,要求在一个递增排序且包含唯一数字的数组中找出缺失的数字。提供了两种解决方案:暴力求解法和二分查找法。每种方法都通过了测试用例,包括示例1的[0,1,3]和示例2的[0,1,2,3,4,5,6,7,9]。解答详述了算法思路并附带了Java代码实现。

链接

https://leetcode-cn.com/problems/que-shi-de-shu-zi-lcof/
难度: #简单

题目

一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0~n-1之内。在范围0~n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字。

示例 1:

输入: [0,1,3]
输出: 2

示例 2:

输入: [0,1,2,3,4,5,6,7,9]
输出: 8

限制:1 <= 数组长度 <= 10000

代码框架

class Solution {
    public int missingNumber(int[] nums) {

    }
}

题目解析

解答思路1:
暴力解法,for循环,
查看数字是否和数组的下标相同,
如果不相同,则缺少该下标对应的数字,
如果没有找到,则缺失的一定是最后一个数字。

解答思路2:
二分查找法,while循环,
找到第一个不和数组下标相等的数字,
根据low和high计算中间的mid,
如果mid下标对应的数字和mid相等,
则缺失的数字在右边部分,
如果mid下标对应的数字和mid不相等,
则需要进一步确定是否是第一个不相等的数字,
如果mid==0,则左边没有数字了,可以确定缺失的数字,
如果mid-1下标对应的数字和mid相等,也可以确实缺失的数字,
否则缺失的数据在左边部分。

测试用例

package edu.yuwen.sowrd.num53_II.solution;

import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;

import edu.yuwen.sowrd.num53_II.sol2.Solution;

public class SolutionTest {
    /**
     * 输入: [0,1,3]
     * 输出: 2
     */
    @Test
    public void testCase1() {
        Solution solution = new Solution();

        int[] nums = { 0, 1, 3 };
        int number = solution.missingNumber(nums);
        Assertions.assertEquals(2, number);
    }

    /**
     * 输入: [0,1,2,3,4,5,6,7,9]
     * 输出: 8
     */
    @Test
    public void testCase2() {
        Solution solution = new Solution();

        int[] nums = { 0, 1, 2, 3, 4, 5, 6, 7, 9 };
        int number = solution.missingNumber(nums);
        Assertions.assertEquals(8, number);
    }

    /**
     * 输入: [0]
     * 输出: 1
     */
    @Test
    public void testCase3() {
        Solution solution = new Solution();

        int[] nums = { 0 };
        int number = solution.missingNumber(nums);
        Assertions.assertEquals(1, number);
    }
}

解答1

package edu.yuwen.sowrd.num53_II.sol1;

public class Solution {
    public int missingNumber(int[] nums) {
        for (int i = 0; i < nums.length; i++) {
            if (nums[i] != i) {
                return i;
            }
        }
        // 如果没有找到,则缺失的一定是最后一个数字
        return nums.length;
    }
}

解答2 推荐

package edu.yuwen.sowrd.num53_II.sol2;

public class Solution {
    public int missingNumber(int[] nums) {
        int low = 0;
        int high = nums.length - 1;
        while (low <= high) {
            int mid = (low + high) / 2;

            // 如果下标和数字相等,则缺失的数字在右边部分
            if (nums[mid] == mid) {
                low = mid + 1;
            }
            // 如果下标和数字不相等,则缺失的数字在左边部分
            if (nums[mid] != mid) {
                // 确保是第一个和下标不相等的数字
                if (mid == 0 || nums[mid - 1] == mid - 1) {
                    return mid;
                }
                high = mid - 1;
            }
        }

        // 如果没有找到,则缺失的一定是最后一个数字
        return nums.length;
    }
}
Setting up libubsan1:amd64 (10.5.0-1ubuntu1~20.04) ... dpkg: dependency problems prevent configuration of g++: g++ depends on g++-9 (>= 9.3.0-3~); however: Package g++-9 is not installed. dpkg: error processing package g++ (--configure): dependency problems - leaving unconfigured Setting up python3.8-minimal (3.8.10-0ubuntu1~20.04.18) ... Setting up libcrypt-dev:amd64 (1:4.4.10-10ubuntu4) ... dpkg: dependency problems prevent configuration of build-essential: build-essential depends on g++ (>= 4:9.2); however: Package g++ is not configured yet. dpkg: error processing package build-essential (--configure): dependency problems - leaving unconfigured Setting up libisl22:amd64 (0.22.1-1) ... Setting up python-pip-whl (20.0.2-5ubuntu1.11) ... Setting up libbinutils:amd64 (2.34-6ubuntu1.11) ... Setting up libpython3.8-stdlib:amd64 (3.8.10-0ubuntu1~20.04.18) ... Setting up libc-dev-bin (2.31-0ubuntu9.18) ... Setting up python3.8 (3.8.10-0ubuntu1~20.04.18) ... Setting up libalgorithm-diff-xs-perl (0.04-6) ... Setting up libcc1-0:amd64 (10.5.0-1ubuntu1~20.04) ... Setting up liblsan0:amd64 (10.5.0-1ubuntu1~20.04) ... Setting up libitm1:amd64 (10.5.0-1ubuntu1~20.04) ... Setting up gcc-9-base:amd64 (9.4.0-1ubuntu1~20.04.2) ... Setting up libalgorithm-merge-perl (0.08-3) ... Setting up libtsan0:amd64 (10.5.0-1ubuntu1~20.04) ... Setting up libctf0:amd64 (2.34-6ubuntu1.11) ... Setting up libasan5:amd64 (9.4.0-1ubuntu1~20.04.2) ... Setting up libpython3.8:amd64 (3.8.10-0ubuntu1~20.04.18) ... Setting up python3-pip (20.0.2-5ubuntu1.11) ... Setting up cpp-9 (9.4.0-1ubuntu1~20.04.2) ... Setting up libc6-dev:amd64 (2.31-0ubuntu9.18) ... Setting up binutils-x86-64-linux-gnu (2.34-6ubuntu1.11) ... Setting up binutils (2.34-6ubuntu1.11) ... Setting up dpkg-dev (1.19.7ubuntu3.2) ... Setting up libgcc-9-dev:amd64 (9.4.0-1ubuntu1~20.04.2) ... Setting up libexpat1-dev:amd64 (2.2.9-1ubuntu0.8) ... Setting up libpython3.8-dev:amd64 (3.8.10-0ubuntu1~20.04.18) ... Setting up zlib1g-dev:amd64 (1:1.2.11.dfsg-2ubuntu1.5) ... Setting up cpp (4:9.3.0-1ubuntu2) ... Setting up gcc-9 (9.4.0-1ubuntu1~20.04.2) ... Setting up libpython3-dev:amd64 (3.8.2-0ubuntu2) ... Setting up libstdc++-9-dev:amd64 (9.4.0-1ubuntu1~20.04.2) ... Setting up gcc (4:9.3.0-1ubuntu2) ... Setting up python3.8-dev (3.8.10-0ubuntu1~20.04.18) ... Setting up python3-dev (3.8.2-0ubuntu2) ... Processing triggers for libc-bin (2.31-0ubuntu9.9) ... /sbin/ldconfig.real: /usr/lib/wsl/lib/libcuda.so.1 is not a symbolic link Processing triggers for man-db (2.9.1-1) ... Processing triggers for mime-support (3.64ubuntu1) ... Errors were encountered while processing: g++ build-essential
11-23
<think> 我们面对的是在Ubuntu 20.04系统中安装软件时出现的依赖问题,具体是g++依赖g++-9未安装,而build-essential又依赖g++未配置。根据引用[1]和引用[2]的建议,我们可以通过安装build-essential元包来同时解决gcc和g++的安装问题,但这里出现了循环依赖问题。我们可以尝试以下步骤: ### 解决方法 #### 1. **更新软件包列表并修复损坏的包** 首先确保系统是最新的,并尝试修复损坏的包: ```bash sudo apt update sudo apt --fix-broken install ``` 如果上述命令无法解决问题,我们可能需要手动处理依赖关系。 #### 2. **单独安装g++-9** 由于错误提示中提到了g++-9,我们可以尝试单独安装它: ```bash sudo apt install g++-9 ``` 如果这个步骤失败,我们可以使用`aptitude`工具,它能够提供更智能的依赖解决方案(引用[1]): ```bash sudo apt install aptitude sudo aptitude install g++-9 ``` 在`aptitude`的交互界面中,它会给出解决方案,通常我们选择第一个方案(按数字1),如果第一个方案不可行,它会继续给出其他方案,直到出现一个可以接受的方案(可能会提示降级或删除一些冲突的包,请仔细阅读)。 #### 3. **安装g++和build-essential** 在成功安装g++-9后,我们可以安装g++(它实际上是一个指向g++-9的符号链接): ```bash sudo apt install g++ ``` 然后安装build-essential: ```bash sudo apt install build-essential ``` #### 4. **使用aptitude安装build-essential(推荐方法)** 如果上述步骤仍然失败,我们可以直接使用`aptitude`来安装build-essential,因为它能更好地处理复杂的依赖关系(引用[1]): ```bash sudo aptitude install build-essential ``` 在交互过程中,`aptitude`可能会提供多个解决方案,选择接受安装所需依赖并可能删除冲突包的方案。注意:在删除包时,确保不会移除系统关键包。 #### 5. **手动配置未配置的包** 如果dpkg报告有未配置的包,可以尝试: ```bash sudo dpkg --configure -a ``` #### 6. **清除并重建dpkg状态(谨慎操作)** 如果问题依旧,可以尝试清除dpkg的状态文件(注意:这可能会使系统处于不可预测的状态,慎用): ```bash sudo mv /var/lib/dpkg/info /var/lib/dpkg/info_old sudo mkdir /var/lib/dpkg/info sudo apt update sudo apt -f install sudo mv /var/lib/dpkg/info/* /var/lib/dpkg/info_old/ sudo rm -rf /var/lib/dpkg/info sudo mv /var/lib/dpkg/info_old /var/lib/dpkg/info ``` ### 注意事项 - 在执行任何操作之前,建议备份重要数据。 - 使用`aptitude`时,仔细阅读它提出的解决方案,避免接受会移除重要系统组件的方案。 - 确保系统有足够的磁盘空间(至少需要200MB以上的空闲空间)。 ### 相关问题 1. 在Ubuntu中如何彻底删除一个包及其所有依赖? 2. 如何使用aptitude解决复杂的包依赖问题? 3. 如何防止Ubuntu在更新时出现包依赖冲突? 4. 如何查看一个软件包(如g++)的依赖树? 5. 当`apt --fix-broken install`无法修复时,还有哪些方法可以尝试? 希望这些步骤能帮助你解决问题。如果问题仍然存在,请提供具体的错误信息以便进一步诊断。 </think> ### 解决 Ubuntu 20.04 安装软件时 g++ 依赖问题 以下是针对 g++-9 未安装和 build-essential 依赖未配置问题的完整解决方案: #### 1. **清理系统并更新依赖** ```bash sudo apt clean # 清理下载缓存 sudo apt autoclean # 删除旧版本缓存 sudo dpkg --configure -a # 完成未完成的配置[^1] sudo apt install -f # 修复依赖关系 sudo apt update --fix-missing # 修复缺失的索引 ``` #### 2. **安装 aptitude 解决复杂依赖** 使用 aptitude 的智能依赖解析功能(引用[1]): ```bash sudo apt install aptitude # 安装高级包管理工具 # 交互式解决依赖问题(关键步骤) sudo aptitude install g++-9 ``` 在 aptitude 的交互界面中: 1. 按 `n`(no)拒绝第一个方案 2. 继续按 `n` 直到出现 "Install build-essential" 的方案 3. 接受此方案(通常显示为方案3或4) 4. 确认安装并解决所有依赖 #### 3. **完整安装构建工具链** ```bash # 安装基础编译工具(引用[2]) sudo apt install build-essential libssl-dev # 验证安装 g++ --version # 应显示 g++ 9.x 版本 ``` #### 4. **替代方案:手动安装依赖** 如果上述步骤失败: ```bash # 强制安装 g++-9 及其依赖 sudo apt install --fix-broken gcc-9 g++-9 # 创建符号链接(若 g++ 未自动链接) sudo ln -sf /usr/bin/g++-9 /usr/bin/g++ # 安装 build-essential sudo apt install build-essential ``` #### 5. **深度修复** ```bash # 重建 dpkg 数据库 sudo mv /var/lib/dpkg/status /var/lib/dpkg/status.bak sudo apt update sudo apt install -f # 清除锁定文件 sudo rm /var/lib/dpkg/lock* sudo rm /var/cache/apt/archives/lock ``` ### 验证安装 ```bash # 检查关键组件 which g++ # 应返回 /usr/bin/g++ g++ --version # 应显示 9.x 版本 dpkg -l build-essential # 应显示 "ii" 状态 ``` ### 相关问题 1. 如何彻底卸载并重新安装 Ubuntu 的编译工具链? 2. aptitude 在解决依赖冲突时有哪些独特优势? 3. 当多个 g++ 版本共存时如何指定默认版本? 4. 如何修复因内核更新导致的库文件链接损坏问题? 5. Ubuntu 20.04 中手动编译 CMake 的完整流程是怎样的?(引用[3])
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值