2015-06-02 54 views
2

的Codility問題和測試用例示於:here爲什麼代碼在Codility測試用例中返回負值?

寫入golang的代碼:

func Solution(A []int, B []int) []int { 
    result := make([]int, len(A)) 
    step := make([]int, len(A)+1) 
    step[0] = 1 
    step[1] = 1 
    for i := 2; i <= len(A); i++ { 
     step[i] = step[i-1] + step[i-2] 
    } 
    for i := 0; i < len(A); i++ { 
     result[i] = int(int32(step[A[i]]) % int32(math.Pow(2, float64(B[i])))) 
     // result[i] = step[A[i]] & (1<<uint(B[i]) - 1) 
    } 
    return result 
} 

result[i] = step[A[i]] & (1<<uint(B[i]) - 1)通過了所有病例。但result[i] = int(int32(step[A[i]]) % int32(math.Pow(2, float64(B[i]))))result[i] = step[A[i]] % int(math.Pow(2, float64(B[i])))產生一些負數。

看起來有些東西溢出。有人會知道原因嗎?謝謝!

+0

您是否使用了與您提供的鏈接中給定的A和B完全相同的數組?如果A和B都由小的正整數組成,我看不到結果爲負的任何理由。 –

+0

示例數組結果OK。但是在提交代碼後,它在某些情況下失敗了。不幸的是,codilty並沒有顯示完全的測試用例,所以我不知道在這種情況下使用的數組。奇怪! – victor1ee

回答

0

對於某些輸入,您將範圍爲[1<<31, 1<<32)的值轉換爲int32

http://play.golang.org/p/6HYPXY9Kjb

a := int64(1 << 31) 
b := int64(1<<32 - 1) 
// int32(a) == -2147483648 
// int32(b) == -1 

根據您的算法是如何工作的,你需要擴大範圍使用int64,或使用uint32,這將截斷的價值,但仍然樂觀。

+0

它使感覺!編碼問題假設「數組B的每個元素都是[1..30]範圍內的整數」,也許某些測試用例的輸入超出了該限制。 – victor1ee

相關問題