2011-01-04 24 views
2

Ich nahm die Codility.com demo test.Verwirrt über Codility Demo-Test

Mein Programm zurückgegeben den falschen Wert für eine der Unit-Tests:

TEST extreme_large_numbers Sequenz mit extrem großen Zahlen Test arithmetischen Überlauf.

ZEIT 0,056 s.

RESULT FALSCHE ANTWORT bekam 2, aber es ist nicht Gleichgewichtspunkt, sum [0..1] = 4294967294, sum [3..3] = - 2

Ok, da ich couldn Wenn ich das Problem zuerst in meinem Code sehe, habe ich versucht, es in einem Visual Studio-Projekt auszuführen. Dann stellte der Compiler fest, dass 4294967294 für eine int zu groß war. Es muss ein uint oder ein long sein. Also änderte ich alles auf long und es funktionierte in VS.

Mit dem Demotest können Sie die Funktionseingabe-/Rückgabetypen jedoch nicht auf long ändern.

  • 2.147.483.647 (größte 32-Bit-int)
  • 4294967294 (Zahl von Codility.com Unit-Test gegeben)

Kann jemand bitte erklären, wie dieses Programm möglicherweise richtig mit 4294967294 arbeiten kann als einer der Datenwerte in einem int[]?

alt text

Antwort

8

Sie die große Auswahl berücksichtigt nur nehmen müssen, während das Ergebnis der Berechnung wird das Endergebnis nicht außerhalb der Grenzen sein. Trotzdem scheint es, dass Ihre Lösung nicht sehr effizient ist, Sie können hier eine lineare Laufzeit erreichen.

Edit: Sie können an der Revision der Geschichte aussehen Code zu sehen, die schnell und Partituren läuft 100. ;-)

+0

1. Ich stimme zu, dass meine Lösung nicht die effizienteste ist, aber ich bin kein brillanter Programmierer und es ist nur 30 Minuten! 2. Ich glaube nicht, dass Sie meine Frage beantwortet haben. Wie kann ich Werte vergleichen, wenn ich keinen ausreichend großen Datentyp habe, um '4294967294' zu speichern? – JohnB

+0

1. Ich habe nur darauf hingewiesen ... 2. Sie nicht, das sind in der Tat negative Werte, aber die Summen großer Werte überschreiten den "int" -Bereich. – Lucero

+0

Ich sehe ... '2147483647 * 2 = 4294967294' Sie sind absichtlich blasen die 'int'-Datentyp :( – JohnB

0

A Swift 2.2 Version von @Lurcero Code, der schnell und Partituren läuft 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 
}