python 算法解决问题

# 优势洗牌
a = [
    12, 24, 8, 32
]

b = [
    13, 25, 32, 11
]

# 思路:
# 都排序,然后找出对方最强的,如果我们最强的打不过它,则用最弱的来顶包,

def youshi(nums1, nums2):
    # 需要记住 nums2 的顺序
    res = [0] * len(nums2)
    sorted_nums2 = [(i,k) for i, k in enumerate(nums2)] # i 是存下之前该数 的原位置
    sorted_nums2.sort(key=lambda x: x[1], reverse=True)
    nums1.sort(reverse=True)
    left = 0
    right = len(nums2) - 1
    print(nums1)
    print(sorted_nums2)
    for i in range(len(nums2)):
        # index, value = i
        if nums1[left] > sorted_nums2[i][1]: # 如果大于的话,直接用 把 nums1 上的最大数保存到结果数组的nums2 对应原位置
            res[sorted_nums2[i][0]] = nums1[left]
            left += 1
        else:
            res[sorted_nums2[i][0]] = nums1[right] # 如果不行, 则从最右边拿个没有用过的最小的数充数
            right -= 1
    print(res)
    return res

# youshi(a, b)



# 找数

from collections import defaultdict
def solution():
    # 思路: 穷举法
    def compare(a, b):
        # 对比 三位数a 和 b ,返回 几个号码一样,以及几个位置一样
        dict_a = defaultdict(int)
        dict_b = defaultdict(int)
        count_position = 0

        for i in range(3):
            tmp_a = a % 10
            tmp_b = b % 10
            if tmp_a == tmp_b: # 统计位置相同
                count_position += 1
            dict_a[tmp_a] += 1
            dict_b[tmp_b] += 1
            a //= 10
            b //= 10
        
        res = set(dict_a.keys()).intersection(set(dict_b.keys()))
        if not res:
            return 0, 0

        count = 0
        for i in res: # 统计几个号码一样
            count += min(dict_a[i], dict_b[i])
        
        return count, count_position
    # print(compare(883, 288))
    # print(compare(215, 246))
    # print(compare(6, 246))
    res = []
    for i in range(0, 1000):
        if compare(i, 246) ==(1, 1) and compare(i, 692) == (2, 0) and compare(i, 174) == (0, 0) and compare(i, 419) == (1, 0):
            print(i)
            res.append(i)
    print(res)
solution()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值