【问题标题】:Swift - Distribute an input integer equally to an array of positive & negative numbersSwift - 将输入整数平均分配给正负数数组
【发布时间】:2025-11-26 00:30:01
【问题描述】:

如何从输入整数生成一个由正数和负数组成的均匀分布数组?
对于不均匀整数,数组必须包含 0 作为“中间”。
对于偶数,数组不能包含 0,而是有 0.5 个步长,例如-0.5 和 0.5。
输入整数不能为负数或 0。因此可以忽略这些输入。

例子:

Input : Output
Int 1 = [0]
Int 2 = [-0.5, 0.5]
Int 3 = [-1, 0, 1]
Int 4 = [-1.5, -0.5, 0.5, 1.5]
Int 5 = [-2, -1, 0, 1, 2]
Int 6 = [-2.5, -1.5, -0.5, 0.5, 1.5, 2.5]
and so on...

有没有一种聪明的方法可以做到这一点,或者它是 for 循环和 if/else 语句的级联?

【问题讨论】:

  • 查找stride

标签: arrays swift integer


【解决方案1】:

尝试使用stride(from:through:by:)

  1. 请注意,所需输出数组中的最后一个元素 (end) 始终为 (input - 1) * 0.5。 (您也可以对第一个元素执行此操作,但只需翻转符号)
  2. 对于stridefrom,只需翻转end的符号即可
let inputs = [1, 2, 3, 4, 5, 6]
inputs.forEach { input in
    let end = Double(input - 1) * 0.5 /// 1.
    let output = Array(stride(from: -end, through: end, by: 1)) /// 2.
    print("Input: \(input), Output: \(output)")
}

输入:1,输出:[-0.0]
输入:2,输出:[-0.5, 0.5]
输入:3,输出:[-1.0, 0.0, 1.0]
输入:4,输出:[-1.5, -0.5, 0.5, 1.5]
输入:5,输出:[-2.0, -1.0, 0.0, 1.0, 2.0]
输入:6,输出:[-2.5, -1.5, -0.5, 0.5, 1.5, 2.5]

【讨论】:

  • 这缺少从偶数输入的输出中排除 0 的要求(一个简单的过滤器应该可以完成这项工作)。
  • 这是我一直在寻找的聪明方法。感谢您指出!按预期工作,可以轻松调整。
  • 通常浮点数应该用作循环变量,因为可能存在舍入错误。它在这里工作是因为 0.5 可以精确地表示为二进制浮点数。 – 或者,let output = stride(from: 1 - input, through: input - 1, by: 2).map { Double($0)/2 } 使用基于整数的循环。
  • @MartinR 谢谢,学到了一些新东西。一如既往的惊人单线。
【解决方案2】:

模式似乎是:

Array((1...1).map { Double($0) - (2 * 0.5) })

Array((1...2).map { Double($0) - (3 * 0.5) })

Array((1...3).map { Double($0) - (4 * 0.5) })

一般:

func f(_ n: Int) -> [Double] {
    (1...n).map { Double($0) - (Double(n + 1) / 2.0) }
}

【讨论】:

  • 漂亮的解决方案并按预期工作。我会接受 aheze 的解决方案,因为其他有类似问题的人可能会发现他的答案更容易适应。不过,起首!