2016-07-12 2 views
1

이것은 LeetCode 질문입니다. 그 질문의 다른 버전에서 나는 4 개의 답을 썼다. "비트 조작"을 사용하려고하면 오류가 발생합니다. LeetCode의 아무도 내 질문에 답할 수 없기 때문에 이에 대한 신속한 문서를 찾을 수 없습니다. 나는 여기서 물어볼려고 노력할 것이라고 생각했다.왜 Swift에서 비트 조작을 사용하여 음수를 얻을 수 없습니까?

질문은 주어진 배열에서 주 요소 (> n/2)를 얻는 것입니다. 다음 코드는 Java과 같은 다른 언어에서 작동하므로 Swift에서 일반적인 질문 일 수 있습니다. 입력이 [-2147483648] 경우

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이다하지만 자바에서 성공적 출력 오른쪽 음수 일 수있다.

심지어 32 비트 플랫폼, 지능이 -2,147,483,648과 2,147,483,647 사이의 값을 저장할 수 있으며, 많은 정수 범위에 대한 충분한 크기 :

신속한 의사는 말한다.

음, 입력 번호가 1보다 크면, 2,147,483,647이다. 놀이터에서 pow(2.0, 31.0)을 실행하면 이 표시됩니다. 혼란스러워. 내 코드가 잘못되었거나 놓친 부분이 Swift Int?

+3

을 사용하는 것이다. '1000 ... 00000 [32 zeroes]'입니다. 반면에 2,147,483,648은'011 .... 111 [31 ones]' –

답변

2

Java int은 32 비트 정수입니다. 스위프트 Int은 플랫폼에 따라 32 비트 또는 64 비트 입니다. 특히 Swift를 사용할 수있는 모든 OS X 플랫폼에서 64 비트입니다.

-2147483648 = 0xffffffff80000000 

2147483648 = 0x0000000080000000 

그래서 문제를 해결하기가되도록

당신의 코드가 주어진 정수의 하위 32 비트를 처리, 당신은 32 비트를 취할 수있는 기능을 변경 할 수 있습니다 인수로 정수 :

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

하거나 일을 계산하여 임의의 크기의 정수와 함께 작동하도록 E 실제 크기 대신 일정한 32의 사용 :

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 
} 

더 스위프 티 방법은 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

예, 내 질문에 대한 답변이 있습니다. 고마워요! 그리고 나는 끔찍한 방법으로'map()'과'reduce()'를 매우 좋아합니다! :) –

관련 문제