面试题9:数组配对

题目:给定N个整数,N为偶数,是否能找到N/2对,使得每队和都能被k整除。注意:每个元素只能出现在一个配对中。


观察:

     如果某个数能被k整除,那么该数除以k的余数为零。假设a和b之后能被k整除,即(a+b)%k=0,如果a%b=z,那么当z不等于0时,b%k=k-z;当z等于时,b%k=0。通过上面的推导,我们需要记录这个数组除以k之后的余数情况。然后从余数里找出配对。

    使用额外一个数组保存余数的情况,数组大小为k,A[i]记录余数为i的个数。有了这个余数个数的数组之后,我们需要考虑如下边界情况。

1)被k整除的个数是否为偶数?如果是奇数,那么就不可能找到N/2个能被k整除的数对(因为总会有至少一个余数不为0和余数为0的数对存在)

2)余数为i和余数k-i的个数是相同


代码实现:

package main
 
 
import (
    "fmt"
)
 
 
func checkPairable(nums []int, k int) bool {
    if k <= 0 {
        return false
    }
    // 该切片用来存储 数%k的余数的个数
    counts := make([]int, k)
    length := len(nums)
    for i := 0; i < length; i += 1 {
        counts[nums[i]%k] += 1
    }
    if counts[0]%2 != 0 {
        return false
    }
    for i := 1; i <= k/2; i += 1 {
        if counts[i] != counts[k-i] {
            return false
        }
    }
    return true
}
 
 
func main() {
    fmt.Println(checkPairable([]int{1, 2, 3, 4, 5, 6, 7, 8}, 3))
}
 
 


猜你喜欢

转载自blog.csdn.net/qq_35191331/article/details/80234275