Codility问题和测试用例显示在:here
用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 :(得分:0)
对于某些输入,您需要将int32
范围内的值转换为a := int64(1 << 31)
b := int64(1<<32 - 1)
// int32(a) == -2147483648
// int32(b) == -1
。
http://play.golang.org/p/6HYPXY9Kjb
int64
根据算法的工作方式,您需要扩展范围以使用uint32
,或使用'item' in s for s in mylist
,这将截断值但保持为正值。