为什么这个嵌套for循环得到一个空值?

时间:2017-10-22 15:40:12

标签: swift

func twoSum(_ nums: [Int], _ target: Int) -> [Int] {
var num1: Int = 0
var num2: Int = 0

for i in nums {

    let test1: Int = nums.index(of: i)!

    for x in nums {

        let test2: Int = nums.index(of: x)!

        if (i + x == target && test1 != test2) {

            num1 = x
            num2 = i

        }

    }

}

let out1: Int = nums.index(of: num1)!
let out2: Int = nums.index(of: num2)!

let outArray: [Int] = [out1, out2]

return outArray

}

大家好。我试图让上面的代码运行。这是我对LeetCode的Two Sum问题的看法。基本上你给一个阵列和一个"目标"并且代码返回数字的索引,这些数字在添加时等于" target"。

twoSum([2,7,11,15], 9)
twoSum([1,5,2,3,5,10], 15)

到目前为止,这两个示例工作正常,它们分别正确地返回[0, 1][1, 5]

但是使用此示例twoSum([3,3], 6),我意外地发现nil错误。有谁知道为什么?

提前致谢。

3 个答案:

答案 0 :(得分:1)

您应该使用enumerated()来避免强行展开 (我在代码中做了一些更改)

func twoSum(_ nums: [Int], _ target: Int) -> [Int] {
    for (test1, i) in nums.enumerated() {
        for (test2, x) in nums.enumerated() {
            if (i + x == target && test1 != test2) {
                return [test1, test2]
            }
        }
    }
    return [0, 0] // but may be you should return nil in this case
}

答案 1 :(得分:0)

由于test1 == test2未定义num1num2,因此当您强行解包时会导致崩溃nums.index(of: num1)

请改为尝试:

for i in nums {
    for x in nums {
        if (i + x == target && i != x) {
            num1 = x
            num2 = i
        }
    }
}

答案 2 :(得分:0)

nums.index(of:x)不返回最初采用x的索引。它搜索x并返回num的第一个元素的索引,该索引等于x。

你的阵列号是[3,3]。如果搜索nums [0] = 3,则index(of:3)返回0.如果搜索nums [1]也是3,则index(of:3)将再次返回0。它没有返回1.索引搜索数字,它不知道该数字来自何处。