2011-01-04 33 views
2

私はCodility.com demo testを受け取りました。算術オーバーフローをテストめちゃめちゃ多数有するCodilityのデモテストについて混乱した

TEST extreme_large_numbers配列:

私のプログラムは、ユニットテストのために間違った値を返し。

TIME 0.056秒。

RESULT 間違った答えは、2を得たが、それは、平衡点ではなく、和[0..1] = 4294967294、和[3..3] = - I couldnので、[OK]を2

、私のコードで最初に問題が発生するのを見て、私はVisual Studioプロジェクトでそれを実行しようとしました。コンパイラはintのために4294967294が大きすぎると捉えました。 uintまたはlongにする必要があります。だから私はlongにすべてを変更し、それはVSで働いた。

ただし、デモテストでは、関数の入力/戻り型をlongに変更することはできません。

  • 2147483647(最大の符号付き32ビット整数)
  • 4294967294(Codility.comユニットテストによって与えられた数)

誰かがこのプログラムはおそらく4294967294などで正しく動作することができますどのように説明していただけますint[]のデータ値の1つ?

alt text

答えて

8

あなただけの結果を計算しながら、最終結果が範囲外ではありません考慮に大規模な範囲を取る必要があります。それでも、あなたのソリューションはあまり効率的ではないようですが、あなたはこれで線形のランタイムに到達することができます。

編集:あなたが速いとスコア100 ;-)

+0

1.私のソリューションは最も効率的ではないことに同意しますが、私は素晴らしいプログラマーではなく、わずか30分です!私はあなたが私の質問に答えたとは思わない。 '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 
} 
関連する問題