题解 | #数组分组#
数组分组
https://www.nowcoder.com/practice/9af744a3517440508dbeb297020aca86
from math import nan
#获取数据并整理成列表
cnt_input = input()
list_in = input().split(' ')
list_input = []
for i in list_in:
if i != '':
list_input.append(int(i))
else:
continue
####数据初始化,获取到数组后,整理数组
#初始化数组
list_3 = []#3倍组
list_5 = []#5倍组
list_o = []#公共组
#分为3倍组,5数组以及公共组
for v in list_input:
if v%15 == 0:#因为同时为3和5的公倍数的话两组都可以放进去,所以也算公共组
list_o.append(v)
elif v%3 == 0:
list_3.append(v)
elif v%5 == 0:
list_5.append(v)
else:
list_o.append(v)
#计算3倍组与5倍组的差
tar_num = abs(sum(list_3)-sum(list_5))
#此时我们获得两个关键信息,3倍组与5倍组的差值(后面简称差值),还有一组公共数组
#注意此处不要被数字的符号干扰,只要你能找到一组数的绝对值等于差值的绝对值就说明这个公共组有解
#思路:1.把公共组所有数字取绝对值并倒序排序
#2.按照多扣少补的思路,让公共组的计算值与差值做比较,计算值比差值大则把下一个数字减去上一个计算值,少则加
#3.把公共组的所有数遍历完成后得到最终的计算值,只要最终的计算值的绝对值与差值的绝对值相等,那结果就是有解
standard_o = list(map(lambda x:abs(x),list_o))
standard_o.sort(reverse=True)
v_res = None
if len(standard_o) > 2:
v_res = standard_o[0]
for vi in range(1, len(standard_o)):
if v_res >= tar_num:
v_res -= standard_o[vi]
elif v_res < tar_num:
v_res += standard_o[vi]
elif len(standard_o) == 2:
v_res = standard_o[0]
if v_res >= tar_num:
v_res -= standard_o[1]
elif v_res < tar_num:
v_res += standard_o[1]
elif len(standard_o) == 1:
v_res = standard_o[0]
else:
v_res = 0
if abs(v_res) == tar_num:
print('true')
else:
print('false')
查看19道真题和解析