You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift 4中用前置非0值填充数组内0元素的实现问题

解决Swift数组中0替换为前一个非0值的问题

我来帮你搞定这个需求!你想要把数组里的0元素替换成最近的前一个非0值,这个功能用正向遍历的方式实现最直观,而且代码也很简洁。

方案一:正向遍历+记录最近非0值

这个思路很简单:遍历数组的时候,记住最近遇到的非0值,碰到0就用这个值来替换它。

func fillZeroesWithPreviousNonZero(_ dataArray: [Int]) -> [Int] {
    var filledArray = [Int]()
    var lastValidValue: Int?
    
    for number in dataArray {
        if number != 0 {
            // 更新最近的非0值,同时加入结果数组
            lastValidValue = number
            filledArray.append(number)
        } else {
            // 用最近的非0值填充,如果没有(比如第一个元素是0)就保留0
            filledArray.append(lastValidValue ?? number)
        }
    }
    
    return filledArray
}

// 测试你的示例数组
let originalArray = [70, 75, 0, 0, 0, 87, 90, 85, 0]
let result = fillZeroesWithPreviousNonZero(originalArray)
print(result) // 输出: [70, 75, 75, 75, 75, 87, 90, 85, 85]

方案二:用reduce(into:)简化代码

如果你喜欢更简洁的写法,可以用Swift的reduce方法来一步完成,逻辑和上面是一样的:

func fillZeroesWithPreviousNonZero(_ dataArray: [Int]) -> [Int] {
    return dataArray.reduce(into: [Int]()) { result, current in
        if current != 0 {
            result.append(current)
        } else {
            // 直接取结果数组的最后一个元素(也就是最近的非0值)来填充
            result.append(result.last ?? current)
        }
    }
}

额外说明

  • 如果你的数组第一个元素可能是0,上面的代码会保留这个0(因为还没有遇到任何非0值)。如果需要处理这种特殊情况(比如用后面的第一个非0值填充前面的0),那逻辑需要调整,但根据你的示例需求,这个方案完全匹配。
  • 你之前尝试反向遍历的思路其实也能实现,但需要额外处理顺序问题,正向遍历显然更直接,也更容易理解和维护。

内容的提问来源于stack exchange,提问作者qazzu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:13:54