2017-10-22 8 views
-2
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問題を取り上げたものです。基本的には配列と "ターゲット"を与え、コードは "ターゲット"に等しい数値のインデックスを返します。なぜこのネストループがNULL値を取得するのですか?

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

これまでのところ、これらの2例が正常に動作していると、彼らは正確にそれぞれ[0, 1][1, 5]を返します。

しかし、この例では、twoSum([3,3], 6)、予期せずnilエラーが見つかりました。なぜ誰が知っていますか?

ありがとうございます。あなたの代わりにこれを試してみてくださいnums.index(of: num1)

アンラップ強制とき

答えて

0

test1 == test2どちらnum1またはnum2のでクラッシュで、その結果、定義されます:

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

正しい!私は問題がもともと貧弱な方法で解決されたと思うし、代わりにAleksandrの方法を好むだろう – nomadoda

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 
} 
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を返しません。インデックス番号を検索し、その番号がどこから来たのかわかりません。

+0

ありがとうございます。私はそれを試してみるつもりです。 –

関連する問題