2011-01-04 4 views
2

나는 Codility.com demo test을 가져갔습니다.혼동에 대한 시뮬레이션 데모 테스트

TEST extreme_large_numbers 이며 매우 많은 수의 테스트 산술 오버 플로우와 순서 :

내 프로그램

은 단위 테스트 중 하나에 대한 잘못된 값을 반환했습니다.

TIME 0.056s.

RESULT 오답 2를 가지고 있지만, 합계 [0..1] = 4294967294, 합계 [3..3] = 평형 점 아니다 - 2

좋아,이 나오지 않았어 때문에 처음에는 내 코드에서 문제를 보았고 Visual Studio 프로젝트에서이 코드를 실행 해 보았습니다. 그렇다면 컴파일러는 int에 대해 4294967294이 너무 큽니다. uint 또는 long이어야합니다. 그래서 모든 것을 long으로 바꿨고 VS에서 잘 돌아갔습니다.

그러나 데모 테스트에서는 함수 입력/반환 형식을 long으로 변경할 수 없습니다.

  • 2,147,483,647 (최대 부호있는 32 비트 INT)
  • 4294967294 (Codility.com 단위 테스트에 의해 주어진 수)

누군가가이 프로그램이 가능 4294967294으로 제대로 작동하는 방법을 설명시겠습니까 int[]에있는 데이터 값 중 하나?

alt text

답변

8

당신은 결과를 계산하는 동안 계정에 큰 범위를 취할 필요, 최종 결과는 아웃 오브 바운드되지 않습니다. 아직도 당신의 솔루션이 매우 효율적이지 않은 것으로 보입니다.이 솔루션은 선형 런타임에 도달 할 수 있습니다.

편집 : 당신은 빠르고 점수 100 ;-)

+0

1. 내 솔루션이 가장 효율적이지는 않지만 필자는 훌륭한 프로그래머가 아니며 30 분 밖에 안됐다. 2. 나는 네가 내 질문에 대답했다고 생각하지 않는다. '4294967294'를 저장할 충분한 데이터 타입이 없다면 어떻게 값을 비교할 수 있습니까 ?? – JohnB

+0

1. 나는 그것을 지적했다 ... 2. 실제로는 음수 값이지만, 큰 값의 합은'int' 범위를 초과한다. – Lucero

+0

내가 본 ...'2147483647 * 2 = 4294967294' 그들은 의도적으로'int' 데이터 타입을 날려 버리고 있습니다. ( – JohnB

0

빠르고 점수를 실행 @Lurcero 코드의 Swift 2.2 버전을 실행하는 코드를 확인하려면 업데이트 내역을 볼 수 있습니다 100 :

public func solution(inout A : [Int]) -> Int { 

let n = A.count 

if n == 0 { return -1 } 

if n == 1 { return 0 } 

var right : Int64 = A.reduce(0, combine: +) 

var left : Int64 = 0 

for i in 0..<n { 

    right -= A[i] 

    if left == right { 
     return i 
    } 
    left += A[i] 
} 

return -1 
} 
관련 문제