缺失的第一个正数-面试热题 100?-Lua 中文代码解题第5题

本文介绍了如何使用Lua编程语言解决一个面试常见问题,即在一个给定的数组中,找到第一个未被赋值的正整数的位置。通过遍历数组并交换元素来调整,找出第一个元素值与其索引不匹配的位置。
摘要由CSDN通过智能技术生成

缺失的第一个正数-面试热题 100?-Lua 中文代码解题第5题

解题思路: 

  1. 遍历数组并尝试将元素放入正确的位置: 遍历输入数组 nums,对于每个元素 nums[i]:

    • 如果 nums[i] 是一个正整数,并且它的值小于或等于数组的长度(即在有效范围内),则检查对应下标的值 nums[nums[i]] 是否与 nums[i] 相等。
      • 如果不相等,说明 nums[i] 的位置不是其应该在的位置。此时交换 nums[i] 和 nums[nums[i]] 的值,试图将 nums[i] 放到它应该在的位置上(nums[nums[i]] 应该为 i)。
  2. 寻找未出现的最小正整数: 再次遍历数组 nums,由于前面的操作,数组中下标 i 与值 nums[i] 不匹配的位置(nums[i] 不等于 i)表示原数组中数值为 i 的元素没有出现过。因此,我们只需找到第一个这样的位置 i,返回 i 作为结果。

通过这个方法,可以在遍历一次数组的基础上完成题目要求的任务,虽然在极端情况下时间复杂度可能退化,但在大多数情况下可以实现 O(n) 的平均时间复杂度,并且只使用了常数级别的额外空间。

中文代码 -- 无注释版
函数 缺少的首个正数(输入数组)
    局部 n = #输入数组
    因为 i = 1, n 做
        当 输入数组[i] > 0 与 输入数组[i] <= n 与 输入数组[输入数组[i]] ~= 输入数组[i] 做
            局部 临时数 = 输入数组[i]
            输入数组[i] = 输入数组[临时数]
            输入数组[临时数] = 临时数
        结束
    结束

    因为 i = 1, n 做
        如果 输入数组[i] ~= i 即
            返回 i
        结束
    结束
    返回 n + 1
结束
中文代码 -- 带注释的如下:
-- 缺少的首个正数函数
-- 参数:输入数组,一个包含任意整数的数组
-- 返回值:一个整数,表示输入数组中缺失的首个正数
函数 缺少的首个正数(输入数组)
    局部 n = #输入数组  -- 输入数组的长度

    -- 将输入数组中每个元素替换为该元素所指向的索引上对应的值(如果该值是有效的)
    因为 i = 1, n 做
        当 输入数组[i] > 0 与 输入数组[i] <= n 与 输入数组[输入数组[i]] ~= 输入数组[i] 做
            局部 临时数 = 输入数组[i]
            输入数组[i] = 输入数组[临时数]
            输入数组[临时数] = 临时数
        结束
    结束

    -- 查找缺失的首个正数
    -- 如果输入数组中的元素不等于其对应的索引值,则返回该索引
    因为 i = 1, n 做
        如果 输入数组[i] ~= i 即
            返回 i
        结束
    结束
    -- 如果没有找到缺失的正数,则返回数组长度加一
    返回 n + 1
结束
这段代码运行后将会输出:
-- 测试用例
局部 输入数组1 = {1, 2, 0}
输出(缺少的首个正数(输入数组1))  -- 输出:3

局部 输入数组2 = {3, 4, -1, 1}
输出(缺少的首个正数(输入数组2))  -- 输出:2

局部 输入数组3 = {7, 8, 9, 11, 12}
输出(缺少的首个正数(输入数组3))  -- 输出:1

  • 12
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值