【问题标题】:public func for Array Balancing Point in Swift 3Swift 3 中数组平衡点的公共函数
【发布时间】:2018-01-27 02:59:00
【问题描述】:

我能够使用 Swift 3 Playgrounds 找到数组的平衡点。现在,我正在尝试创建一个方法(func),它将遍历数组并应用我的代码。这是我来自 Swift 3 Playgrounds 的代码:

import Foundation

let myArray = [1, 2, 5, 8, 4, 4]
let divSum = myArray.reduce(0, {$0 + $1}) / 2
print (divSum)
var myBalancePoint = Int()

if myArray[0] + myArray[1] >= divSum {
    myBalancePoint = myArray[1]
} else {
    if myArray[0] + myArray[1] + myArray[2] >= divSum {
        myBalancePoint = myArray[2]
    } else {
        if myArray[0] + myArray[1] + myArray[2] + myArray[3] >= divSum {
            myBalancePoint = myArray[3]
        } else {
            if myArray[0] + myArray[1] + myArray[2] + myArray[3] + myArray[4] >= divSum {
                myBalancePoint = myArray[4]
            } else {
                if myArray[0] + myArray[1] + myArray[2] + myArray[3] + myArray[4] + myArray[5] >= divSum {
                    myBalancePoint = myArray[5]
                }
            }
        }
    }
}
print (myBalancePoint)

【问题讨论】:

  • 平衡点是数组元素还是元素的index
  • 在 Swift 3 Playgrounds 中,我上面的代码打印出平衡点 8。8 是数组索引 [4] 的值或元素。请记住,在 Swift 中,索引从索引 [0] 开始。换句话说,myArray 有六个索引或索引。
  • 您能否添加您对“平衡点”的精确定义?为什么您的代码打印 5 作为 [1, 2, 5, 1, 4, 4] 的平衡点? [1, 2, 3, 4] 的预期输出是什么,为什么?数字可以是零还是负数? –(感谢您的提醒,但我碰巧知道 Swift 索引是如何工作的 :)
  • 平衡点是索引的整数值,其左侧的索引整数值之和等于其右侧的整数值之和。 [1, 2, 3, 4] 没有平衡点。 [1, 2, 5, 1, 4, 4] 将 5 显示为平衡点,因为数组的除和 (divSum) 为 8.5,即 Double。请记住,我将数组的总和除以 2。Swift 将数组的除和从 8.5 的双倍向下舍入到 8,因为我们正在处理 Ints。
  • 因为 Swift 将 8.5 的 double 向下舍入为 8 的 Int,因此数组的总和表示为 16。平衡点位于 myArray 的第三个索引中,其值为 Integer 5 . Integer 5 的值是正确的,因为 16 / 2 = 8。如果你添加 myArray 的前三个索引,你会得到 8。

标签: arrays swift methods swift-playground


【解决方案1】:

这是一个可能的实现:

func balancePoint(of a: [Int]) -> Int? {
    var leftSum = 0
    var rightSum = a.reduce(0, +)
    for (idx, elem) in a.enumerated() {
        rightSum -= elem
        if leftSum == rightSum {
            return idx
        }
        leftSum += elem
    }
    return nil
}

例子:

let myArray = [1, 2, 5, 8, 4, 4]
if let bp = balancePoint(of: myArray) {
    print("Balance point index:", bp, "Value:", myArray[bp])
} else {
    print("No balance point")
}

输出:

平衡点指数:3 值:8

它是如何工作的?

    var leftSum = 0
    var rightSum = a.reduce(0, +)

分别是当前元素左侧和右侧所有元素的当前总和。

    for (idx, elem) in a.enumerated() {

遍历数组,将idx设置为当前索引 和elem 到当前数组元素。

        rightSum -= elem
        if leftSum == rightSum {
            return idx
        }
        leftSum += elem

首先从正确的和中减去当前元素。 如果左右和相等,那么我们找到了平衡点。 否则为下一次迭代更新左和并继续。

    }
    return nil

没有找到平衡点:返回nil

【讨论】:

  • 谢谢。您的代码似乎在 Playgrounds 中运行,但出现以下错误:“使用未解析的标识符 'balancePoint'。我正在尝试解决该错误。有什么建议吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-08
  • 2023-03-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多