原题
1797.检查数组对是否可以被k整除
2020年6月28日
195周赛第二题
题解
方法一
对于k来说,余数一共有k种,分别是0到k-1,那么我们不妨建立一个数组长度为k,数组中的每个元素的下标就代表余数,元素的值代表有多少数mod k后得这个余数。遍历一遍原数组得到余数数组的每一项值。
遍历完数组,先看yushu[0]的值是否偶数;再看一下互补的余数的数量是否相等,如果k是偶数,那么还要看一下余数为k/2的数量是否为偶数。不过既然题目说了n为偶数,那么就可以少判断0或者k/2之一了。
本思路java代码示例:
/*
@v7fgg
执行用时:8 ms, 在所有 Java 提交中击败了100.00%的用户
内存消耗:48.2 MB, 在所有 Java 提交中击败了100.00%的用户
2020年6月28日 14:02
*/
class Solution {
public boolean canArrange(int[] arr, int k) {
int yushu[]=new int[k];
for(int i=0;i<arr.length;i++){
int a=arr[i]%k<0?arr[i]%k+k:arr[i]%k;
yushu[a]++;
}
if(yushu[0]%2==1){return false;}
if(k%2==0){
if(yushu[k/2]%2==1){return false;}
for(int i=1;i<k/2;i++){
if(yushu[i]!=yushu[k-i]){return false;}
}
}
else{
for(int i=1;i<=k/2;i++){
if(yushu[i]!=yushu[k-i]){return false;}
}
}
return true;
}
}
方法二
思路与方法一相同,只是用来HashMap来存储某余数对应的数字个数。
本思路java代码示例:
/*hashmapde value的比较要用.equals
@v7fgg
执行用时:51 ms, 在所有 Java 提交中击败了23.37%的用户
内存消耗:56.5 MB, 在所有 Java 提交中击败了100.00%的用户
2020年7月2日 14:29
*/
class Solution {
public boolean canArrange(int[] arr, int k) {
Map<Integer,Integer> m=new HashMap<>();
for(int i=0;i<arr.length;i++){
m.put((arr[i]%k+k)%k,m.getOrDefault((arr[i]%k+k)%k,0)+1);
}
if(m.containsKey(0)&&m.get(0)%2!=0){return false;}
if(k%2==0){
if(m.containsKey(k/2)&&m.get(k/2)%2==1){return false;}
for(int i=1;i<k;i++){
if(m.containsKey(i)){
if(m.containsKey(k-i)){
if(!m.get(i).equals(m.get(k-i))){return false;}
}
else{return false;}
}
}
}
else{
for(int i=1;i<k;i++){
if(m.containsKey(i)){
if(m.containsKey(k-i)){
if(!m.get(i).equals(m.get(k-i))){return false;}
}
else{return false;}
}
}
}
return true;
}
}