- 某公司内有 4 个项⽬目组,项⽬目组 A、B、C、D,项⽬目组A现有10⼈人,项⽬目组B现有7⼈人,项⽬目组C现 有5⼈人,项⽬目组D现有4⼈人。为了了实现跨项⽬目组协作,公司决定每⽉月从⼈人数最多的项⽬目组中抽调 3 ⼈人 出来,到其他剩下 3 组中,每组 1 ⼈人,这称之为⼀一次调整优化(亦即经过第⼀一次调整后,A组有7 ⼈人,B组有8⼈人,C组有6⼈人,D组有5⼈人)。 那么请问,经过⼗十年年的优化调整后,各项⽬目组各有⼏几⼈人? 编程求解该问题,并思考是否为最优解。
# 假设存放4个ABCD组人员
dic = {"A":10, "B":7, "C":5, "D":4}
for i in range(120):
max_key = max(dic, key=lambda k:dic[k])
for k in dic:
if k == max_key:
dic[max_key] -= 3
else:
dic[k] += 1
print(dic)
- 某产品的⽤用户注册邀请码为⼀一串串有⼩小写字⺟母和数字组成的字符串串,字符串串⻓长度为16。当⽤用户数据邀 请码的时候,系统需要对邀请码做有效性验证,假设验证规则如下:
1、 从序列列号最后⼀一位字符开始,逆向将奇数位(1、3、5等等)相加;
2、从序列列号最后⼀一位数字开始,逆向将偶数位数字,先乘以2(如果乘积为两位数,则将其减去 9),再求和;
3、将奇数位总和加上偶数位总和,结果可以被10整除;
4、⼩小写字⺟母对应数值,可由下⾯面键值对确定; [(a,1), (b,2), (c,3)…,(i,9), (j,1), (k, 2)…],亦即,按字⺟母顺序,1-9循环。
输⼊入:输⼊入16位字符串串,表示邀请码
输出:输出“ok”或者“error”
def verify_code(code):
# 验证长度和格式
if len(code) != 16 or not isinstance(code,str) or not code.isalnum():
print("不符合规则")
return
# 建立对应关系
dic = dict()
num = 1
for alpha in "abcdefghijklmnopqrstuvwxyz":
if num > 9:
num = 1
dic[alpha] = num
num += 1
_temp_list = list(code)[::-1] # 逆向列表
odd = 0
even = 0
for index, v in enumerate(_temp_list):
index += 1
if index % 2:
# 奇数位处理
if v.isalpha():
_num = dic[v]
odd += _num
continue
odd += int(v)
else:
# 偶数位处理
if v.isalpha():
_num = (dic[v]) * 2
if _num > 9:
even += (_num - 9)
continue
even += _num
continue
_num = int(v) * 2
if _num > 9:
even += (_num - 9)
continue
even += int(v)
# 验证结果
if (odd + even) % 10:
print("error")
else:
print("ok")
3\ 游戏币组合 ⼩小明的抽屉⾥里里有n个游戏币,总⾯面值m,游戏币的设置有1分的,2分的,5分的,10分的,
⽽而在⼩小明 所拥有的游戏币中有些⾯面值的游戏币可能没有,求⼀一共有多少种可能的游戏币组合⽅方式?
输⼊入:输⼊入两个数n(游戏币的个数),m(总⾯面值)。
出:请输出可能的组合⽅方式数;
# 不够优雅,求一个大神赐教。
def combine_coin(n, m):
if (n * 10) < m or m < n or n < 0 or m < 0:
return 0
count = 0
num_10 = 0
num_5 = 0
num_2 = 0
while num_10 <= (m // 10):
sum_125 = m - (num_10 * 10)
while num_5 <= (sum_125 // 5):
sum_12 = sum_125 - (num_5 * 5)
while num_2 <= (sum_12 // 2):
sum_1 = sum_12 - (num_2 * 2)
if sum_1 >= 0:
num_1 = sum_1
if (num_10+num_5+num_2+num_1) == n:
print(num_10, num_5, num_2, num_1)
count += 1
num_1 += 1
num_2 += 1
num_5 += 1
num_2 = 0
num_10 += 1
num_5 = 0
return count