美团笔试题第一题
2026/4/11 美团开发笔试
T1:Odd Selection Plus
题目:输入n个数,两两一组,即(a1,a2)(a3,a4)... (an),如果n为奇数,那么最后一个数自成一组。输入k,判断能否选k组,从每组中选一个数,使得和为奇数,输出"Yes"or"No"。
题目转换一下就是有(n+1)/2个数,其中有odd个数必为奇数,有even个数必为偶数,有both个数不确定,选择k个数使得和为奇数。
这里可以联想到Odd selection问题:
Odd Selection是输入n个数,判断能否选择x个数使得和为奇数,本质是选择奇数个奇数,所以如果输入odd个奇数,那么只用奇数可以满足的x范围是:1, 3, 5, ... , odd*-2, odd*,这里odd*表示不超过odd的最大奇数。再加上用来凑数量的偶数,这个问题就可以分成两种情况了:
odd* := odd为偶数?odd-1:odd
if even = 0:
可以满足的范围range := 1,3,5,...,odd*
else:
range := [1, odd* + even]
if x in range: return Yes
else return No
用同样的思维来解决这道面试题,找到这n个数能满足的最大范围range:
不考虑both时,一般情况下的range = [1, odd* + even];
由于both要么取奇数要么取偶数,它对于范围的上限并没有影响,但是可以通过调整odd的奇偶来使得odd* = odd,所以range一定为[1, odd+even+both]即[1, n]。
还有一些特殊情况需要考虑:
- both = 0时,按照Odd Selection方法解决;
- even = 0时,若k为奇数,则可令both全为奇数,range = 1, 3, 5, ... , (odd+both)*;否则,转化为even = 1, both' = both -1的情况;
- odd = 0时,range = [1, both* + even];
- odd、even都为0时,range = [1, both]。
最终代码如下:
// 有时间再写

浙公网安备 33010602011771号