CSDN 周赛 50 期

1、题目名称:订班服

订班服小A班级订班服了! 可是小A是个小糊涂鬼,整错了好多人的衣服的大小。 小A只能自己掏钱包来补钱了。 小A想知道自己至少需要买多少件衣服。

 本人代码展示:(第一次参加这个比赛,以为要用考试的格式

class Solution:
    def __init__(self) -> None:
        pass
    def solution(self, n, arr1, arr2):
        result = 0
        count = {}
        for size in arr1:
            count[size] = count.get(size, 0) + 1
        for size in arr2:
        if count.get(size, 0) > 0:
            count[size] -= 1
        else:
            result += 1
        return result
if __name__ == "__main__":
    n = int(input().strip())
    arr1 = [input().strip() for _ in range(n)]
    arr2 = [input().strip() for _ in range(n)]
    sol = Solution()
    result = sol.solution(n, arr1, arr2)
    print(result)

         这是一个求解“配对问题”的代码。给定两个长度相同的数组arr1和arr2,要求在arr1中找到一个数,使得它在arr2中也出现过,找到一个数后,就从arr1和arr2中同时删除这个数,然后继续找下一个配对。最终返回不能配对的数的个数。
具体来说,这个算法使用一个字典count记录arr1中每个数字出现的次数。然后遍历arr2,对于每个数字,如果在count字典中出现过,就将其对应的计数减1,否则就将result加1。最终返回result即可。

        其中,`__init__`方法是一个空方法,仅仅是为了让这个类有一个构造函数。
`solution`方法的输入参数包括三个:n表示数组arr1和arr2的长度,arr1和arr2分别是两个长度为n的字符串数组。
首先定义result为0,然后使用一个`count`字典记录arr1中每个数字出现的次数。遍历arr2,如果当前数字在count字典中出现过,则将其对应的计数减1;否则将result加1。最终返回result。
        在主函数中,首先读入n,然后使用列表推导式分别读入arr1和arr2。然后创建一个Solution对象,调用它的solution方法,返回结果并输出。 

 

2、题目名称:异或和

小张找到了一个整数 N,他想问问你从 1 到 N 的所有不同整数的异或和是多少, 请你回答他的问题。

 本人代码展示:

class Solution:
    def __init__(self) -> None:
        pass
    def solution(self, n):
        result = 0
        for i in range(1, n+1):
            result ^= i
        return result
if __name__ == "__main__":
    n = int(input().strip())
    sol = Solution()
    result = sol.solution(n)
    print(result)

        这是一个求解“缺失数字”问题的程序。给定一个长度为n-1的数组,它包含了从1到n中的n-1个数字。要求找到缺失的那个数字。
这个程序使用异或运算来解决问题。首先将1到n的所有数字进行异或操作,然后对于数组中的每个数字,再进行一次异或操作。由于异或运算满足结合律和交换律,所以最终的结果就是缺失数字与1到n的所有数字进行异或的结果。
        其中,`__init__`方法是一个空方法,仅仅是为了让这个类有一个构造函数。
`solution`方法的输入参数只有一个:n,表示1到n中有n个数字。首先将1到n的所有数字进行异或操作,然后对于输入的数组中的每个数字,再进行一次异或操作。最终的结果就是缺失数字与1到n的所有数字进行异或的结果。
        在主函数中,首先读入n,然后创建一个Solution对象,调用它的solution方法,返回结果并输出。

3、题目名称:零钱兑换

零钱兑换 给定数组arr,arr中所有的值都为正整数且不重复。每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给 定一个aim,代表要找的钱数,求组成aim的最少货币数。 如果无解,请返回-1. 数据范围:数组大小满足 0 <= n <=10000 , 数组中每个数字都满足 0 < val <=10000,0 <= aim <=100000 要求:时间复杂度 O(n×aim) ,空 间复杂度 O(aim)。

  本人代码展示:

import re
class Solution:
    def __init__(self) -> None:
    pass
    def solution(self, arr, aim):
        dp = [float("inf")] * (aim + 1)
        dp[0] = 0
        for i in range(1, aim + 1):
            for j in arr:
                if j <= i:
                    dp[i] = min(dp[i], dp[i-j]+1)
            return dp[aim] if dp[aim] != float("inf") else -1
if __name__ == "__main__":
    input_str = input().strip()
    pattern = r"\[(.*?)\],\s*(\d+)"
    match_obj = re.match(pattern, input_str)
    if match_obj:
        arr = list(map(int, match_obj.group(1).split(",")))
        aim = int(match_obj.group(2))
        sol = Solution()
        result = sol.solution(arr, aim)
        print(result)
else:
    print("Invalid input format")

        这段代码是一个动态规划问题的解答,目标是通过给定数组 arr 和目标数 aim,找出最少使用 arr 中的数字能够凑出目标数 aim 的方案数。具体来说,dp[i] 表示凑出数 i 最少需要使用的数字个数,初始化为正无穷,然后遍历 1 到 aim,对于每个数 i,遍历数组 arr 中的每个数字 j,如果 j 小于等于 i,那么尝试使用 j 来凑出 i,此时需要使用 dp[i-j] 的方案数再加上 1,即 dp[i] = min(dp[i], dp[i-j] + 1),最终返回 dp[aim],如果为正无穷,则表示无法凑出目标数,返回 -1。输入格式为一个字符串,其中以方括号包含的一段数字序列表示数组 arr,后跟一个逗号和一个数字

4、题目名称:小艺照镜子

已知字符串str。 输出字符串str中最长回文串的长度。

   本人代码展示:

class Solution:
    def __init__(self) -> None:
        pass
    def solution(self, s):
        n = len(s)
        max_len = 1
        for i in range(n):
        # 奇数
        l,r = i,i
        while l >= 0 and r < n and s[l] == s[r]:
            if r - l + 1 > max_len:
                max_len = r - l + 1
            l -= 1
            r += 1
        # 偶数
        l,r = i,i+1
        while l >= 0 and r < n and s[l] == s[r]:
            if r - l + 1 > max_len:
                max_len = r - l + 1
            l -= 1
            r += 1
        return max_len
if __name__ == "__main__":
    s = input().strip()
    sol = Solution()
    result = sol.solution(s)
    print(result)

        这段代码是一个求解给定字符串 s 中最长回文子串的问题的解答。具体来说,该算法采用了中心扩展法,对于每个可能的回文中心位置,向两边扩展并判断是否为回文子串,记录最长的回文子串长度。其中,对于回文串长度为奇数的情况,中心位置为单个字符,对于回文串长度为偶数的情况,中心位置为两个字符之间的空隙。输出为最长回文子串的长度。
输入格式为一个字符串,表示待处理的字符串 s,输出为最长回文子串的长度。
需要注意的是,该算法只能得到最长回文子串的长度,如果需要得到具体的回文子串,还需要进行进一步的处理。

 

总结

这是第一次参加这种类型的竞赛,自学了2个多月的python,也不知道学的怎么样,就像试试水,就报了这次的考试,没想到居然还能够获奖,真的是受宠若惊。

这次的题目中文感觉还是比较简单的,都是语法的运用。我也是一位新人,所以给不了什么好的建议,只能多多练习了。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值