2016-07-12 7 views
1

これはLeetCodeの質問です。私はその質問の異なるバージョンで4つの答えを書いた。私が "ビット操作"を使用しようとしたとき、私はエラーを受け取りました。 LeetCodeの誰も私の質問に答えることができないので、これについてスウィフトの文書を見つけることはできません。私はここで尋ねようと思った。Swiftでビット操作を使用して負の数値を取得できないのはなぜですか?

問題は、特定の配列で多数の要素(> n/2)を取得することです。次のコードはJavaのように他の言語でも動作しますので、Swiftの一般的な質問と思われます。

func majorityElement(nums: [Int]) -> Int { 
    var bit = Array(count: 32, repeatedValue: 0) 
    for num in nums { 
     for i in 0..<32 { 
      if (num>>(31-i) & 1) == 1 { 
       bit[i] += 1 
      } 
     } 
    } 
    var ret = 0 
    for i in 0..<32 { 
     bit[i] = bit[i]>nums.count/2 ? 1 : 0 
     ret += bit[i] * (1<<(31-i)) 
    } 
    return ret 
} 

入力[-2147483648]ある場合、出力は2147483648であるが、Javaでは、これは正しい負の数に成功し出力することができます。

があっても32ビットプラットフォーム上で、intは-2147483648と2,147,483,647の間の任意の値を格納することができ、多くの整数の範囲に対して十分な大きさである。

スウィフトDOCは言います。

さて、2,147,483,647で、入力された数よりも1大きいです。私はpow(2.0, 31.0)を遊び場で走ったとき、と表示されます。私は混乱した。私のコードに何が間違っているのか、私が迷ったのはSwift Int

+3

を使用することであろう。 '1000 ... 00000 [32 zeroes]'ですが、2,147,483,648は '011 .... 111 [31 ones]' –

答えて

2

Java intは32ビットの整数です。 Swift Intは、プラットフォームによっては32ビットまたは64ビットの です。特に、Swiftが利用可能なすべてのOS X プラットフォームでは64ビットです。

あなたのコードが与えられた整数の唯一の下位32ビットを扱う

-2147483648 = 0xffffffff80000000 

だから問題を解決

2147483648 = 0x0000000080000000 

になるように、あなたは、32ビットを取るために機能を変更することができますいずれか引数として整数:

func majorityElement(nums: [Int32]) -> Int32 { ... } 

か、それは目を計算することによって、任意のサイズの整数で動作させます代わりに、一定の32 E実際のサイズと使用:

func majorityElement(nums: [Int]) -> Int { 
    let numBits = sizeof(Int) * 8 
    var bit = Array(count: numBits, repeatedValue: 0) 
    for num in nums { 
     for i in 0..<numBits { 
      if (num>>(numBits-1-i) & 1) == 1 { 
       bit[i] += 1 
      } 
     } 
    } 
    var ret = 0 
    for i in 0..<numBits { 
     bit[i] = bit[i]>nums.count/2 ? 1 : 0 
     ret += bit[i] * (1<<(numBits-1-i)) 
    } 
    return ret 
} 

よりSwiftyの方法は、2,147,483,648が実際に33ビット数であるため、map()reduce()

func majorityElement(nums: [Int]) -> Int { 
    let numBits = sizeof(Int) * 8 
    let bitCounts = (0 ..< numBits).map { i in 
     nums.reduce(0) { $0 + ($1 >> i) & 1 } 
    } 
    let major = (0 ..< numBits).reduce(0) { 
     $0 | (bitCounts[$1] > nums.count/2 ? 1 << $1 : 0) 
    } 
    return major 
} 
+0

です。私はInt32を試しましたが、あなたの答えから今私は間違った方法で試してみました。ありがとうございました。 –

+0

これはあなたの質問に答えますか?詳しい情報が必要な場合はお知らせください。 –

+0

はい、あなたの答えは私の質問に答えます。どうもありがとうございました!そして、私はSwiftyの方法 'map()'と 'reduce()'をとても好きです! :) –

関連する問題