面试算法题(python)

  1. 某公司内有 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)
  1. 某产品的⽤用户注册邀请码为⼀一串串有⼩小写字⺟母和数字组成的字符串串,字符串串⻓长度为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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值