题目描述
给一个整数数组
问怎么选数字,可以让能得到的结果最大,同时这个接结果需要是3的倍数?
f1 分类讨论+ 贪心 |
基本分析
- 怎么判断能不能被3整除?和 % 3 == 0
- 怎么判断该从数组中删掉哪些数字?(1)和%3==1, 删最小的余1的数字,不行删俩最小的余2的数字;(2)和% 3 == 2,删最小的余2的数字或者俩最小的余1的数字
- 怎么构造出ans?从小到大枚举出现过的数字,如果该删就删,否则构造为结果
代码
class Solution:
def largestMultipleOfThree(self, digits: List[int]) -> str:
cnt, modulu = [0] * 10, [0] * 3
s = 0
for d in digits:
cnt[d] += 1
modulu[d % 3] += 1
s += d
del_d, del_q = 0, 0
if s % 3 == 1:
del_d, del_q = (1, 1) if modulu[1] >= 1 else (2, 2)
if s % 3 == 2:
del_d, del_q = (2, 1) if modulu[2] >= 1 else (1, 2)
ans = ""
for i in range(10):
for j in range(cnt[i]):
if i % 3 == del_d and del_q > 0:
del_q -= 1
else:
ans += str(i)
if len(ans) > 0 and ans[-1] == '0':
return '0'
else:
return ans[::-1]
总结
- 根据和的%3的结果分类讨论
- 结果需要考虑是"0"的特殊情况