第一种方法:尝试数字两两组合,看是否为 k 的倍数,写不出来
第二种方法(参考别人的):将每个数字对 k 取模,放入相应的桶里,看 1 与 k-1 这样的队伍的个数是否相同,如果是就是正确的,不是就是错误的。
class Solution {
public:
bool canArrange(vector<int>& arr, int k) {
vector<int> res(k,0);//用于存放每个余数的个数
for(auto & i:arr){
//res[(i + k)%k]++;这里要先取模再加上 k ,否则可能会造成数组越界。
// [-1,1,-2,2,-3,3,-4,4]3
// res[i%k + k]++;
res[(i%k + k)%k]++;
//加完之后还是要再求一次模,否则会造成数组越界
//额外加上的 k 是为了防止负数
}
if(res[0]%2)
return false;//有奇数个0一定是错的。
//for(int i = 1;i < k/2;++i){
//范围界定错误,
for(int i = 1;i <= k/2;++i){
if(res[i] != res[k-i])
return false;
}
return true;
}
};
对于负数的求模运算不是很理解。