检查Python数组能否分成各对之和能被k整除
假设我们有一个数字数组和另一个数字k,我们必须检查给定的数组能否分成几对,使得每对的和都能被k整除。
因此,如果输入类似于arr = [5, 15, 6, 9] k = 7,则输出为True,因为我们可以取(5, 9)和(15, 6)这样的对。
为了解决这个问题,我们将遵循以下步骤:
- n := 数组大小
- 如果n是奇数,则
- 返回False
- occurrences := 一个空字典,如果某个键不存在,则返回0作为该缺失键的值
- 对于i从0到n,执行以下操作:
- 将occurrences[((array[i] mod k) + k) mod k]加1
- 对于i从0到n,执行以下操作:
- remainder := ((array[i] mod k) + k) mod k
- 如果2 * remainder等于k,则
- 如果occurrences[remainder]是奇数,则
- 返回False
- 如果occurrences[remainder]是奇数,则
- 否则,当remainder等于0时,则
- 如果occurrences[remainder] AND 1不为零,则
- 返回False
- 如果occurrences[remainder] AND 1不为零,则
- 否则,当occurrences[remainder]不等于occurrences[k - remainder]时,则
- 返回False
- 返回True
让我们看看下面的实现,以便更好地理解:
示例
from collections import defaultdict def solve(array, k): n = len(array) if n % 2 != 0: return False occurrences = defaultdict(lambda : 0) for i in range(0, n): occurrences[((array[i] % k) + k) % k] += 1 for i in range(0, n): remainder = ((array[i] % k) + k) % k if (2 * remainder == k): if (occurrences[remainder] % 2 != 0): return False elif (remainder == 0): if (occurrences[remainder] & 1): return False elif (occurrences[remainder] != occurrences[k - remainder]): return False return True arr = [5, 15, 6, 9] k = 7 print(solve(arr, k))
输入
[5, 15, 6, 9], 7
输出
True
广告