2011-01-04 4 views
2

Я взял Codility.com demo test.Смущенный про демонстрационный тест Codility

Моя программа вернула неверное значение для одного из модульных тестов:

TEST extreme_large_numbers последовательности с экстремально большого числа испытаний арифметического переполнения.

ВРЕМЯ 0.056 s.

РЕЗУЛЬТАТ НЕПРАВИЛЬНО ОТВЕТ получил 2, но это не точка равновесия, сумма [0..1] = 4294967294, сумма [3..3] = - 2

Хорошо, так как я не мог Сначала я вижу проблему в моем коде, я попытался запустить ее в проекте Visual Studio. Затем компилятор поймал, что 4294967294 был слишком большой для int. Это должно быть uint, или long. Поэтому я все изменил до long и работал в VS.

Однако демонстрационный тест не позволяет вам изменять типы ввода/возврата функции на long.

  • 2.147.483.647 (самое большое 32-битное целое)
  • 4294967294 (номер, присвоенный с помощью теста Codility.com единицы)

Может кто-то пожалуйста, объясните, как эта программа может работать должным образом, возможно, с 4294967294 как одно из значений данных в int[]?

alt text

ответ

8

Вам только нужно взять большой диапазон во внимание при вычислении результата, конечный результат не выйдет за пределы. Тем не менее кажется, что ваше решение не очень эффективно, вы можете достичь линейного исполнения на этом.

Edit: Вы можете посмотреть на историю изменений, чтобы увидеть код, который работает быстро и оценки 100. ;-)

+0

1. Я согласен, что мое решение не является самым эффективным, но я не блестящий программист, и это всего лишь 30 минут! 2. Я не думаю, что вы ответили на мой вопрос; как я могу сравнивать значения, если у меня нет достаточно большого типа данных для хранения '4294967294' ?? – JohnB

+0

1. Я просто указывал на это ... 2. Вы этого не делаете, это фактически отрицательные значения, но суммы больших значений превышают диапазон 'int'. – Lucero

+0

Я вижу ... '2147483647 * 2 = 4294967294' Они намеренно выдувают тип данных' int' :( – JohnB

0

Swift 2.2 версия @Lurcero кода, который работает быстро и баллы 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 
} 
Смежные вопросы