豆包青训营考核2 | “朝闻道”

辉常腻害 2024-10-31 09:07:25

这是我参加朝闻道知识分享大赛的第 2 篇文章

寻找独特数字卡片

问题描述

在一个班级中,每位同学都拿到了一张卡片,上面有一个整数。有趣的是,除了一个数字之外,所有的数字都恰好出现了两次。现在需要你帮助班长小C快速找到那个拿了独特数字卡片的同学手上的数字是什么。

要求:

  1. 设计一个算法,使其时间复杂度为 O(n),其中 n 是班级的人数。

  2. 尽量减少额外空间的使用,以体现你的算法优化能力。


测试样例

样例1:

输入:cards = [1, 1, 2, 2, 3, 3, 4, 5, 5] 输出:4 解释:拿到数字 4 的同学是唯一一个没有配对的。

样例2:

输入:cards = [0, 1, 0, 1, 2] 输出:2 解释:数字 2 只出现一次,是独特的卡片。

样例3:

输入:cards = [7, 3, 3, 7, 10] 输出:10 解释:10 是班级中唯一一个不重复的数字卡片。

约束条件

  • 1 ≤ cards.length ≤ 1001

  • 0 ≤ cards[i] ≤ 1000

  • 班级人数为奇数

  • 除了一个数字卡片只出现一次外,其余每个数字卡片都恰好出现两次

核心思想:相同的数异或都是0,0异或任何一个数都是它本身

def solution(inp):
    # Edit your code here
    re = inp[0]
    for i in inp[1:]:
        re ^= i
    return re

 

数字字符串格式化

问题描述

小M在工作时遇到了一个问题,他需要将用户输入的不带千分位逗号的数字字符串转换为带千分位逗号的格式,并且保留小数部分。小M还发现,有时候输入的数字字符串前面会有无用的 0,这些也需要精简掉。请你帮助小M编写程序,完成这个任务。


测试样例

样例1:

输入:s = "1294512.12412" 输出:'1,294,512.12412'

样例2:

输入:s = "0000123456789.99" 输出:'123,456,789.99'

样例3:

输入:s = "987654321" 输出:'987,654,321'

def solution(s: str) -> str:
    # write code here
    if '.' in s:
        integer_part, decimal_part = s.split('.')
        # 整数部分使用逗号格式化,小数部分保持原样
        formatted_integer = "{:,}".format(int(integer_part))
        return f"{formatted_integer}.{decimal_part}"
    else:
        # 如果没有小数点,只格式化整数部分
        return "{:,}".format(int(s))

 

数字分组求偶数和

问题描述

小M面对一组从 1 到 9 的数字,这些数字被分成多个小组,并从每个小组中选择一个数字组成一个新的数。目标是使得这个新数的各位数字之和为偶数。任务是计算出有多少种不同的分组和选择方法可以达到这一目标。

  • numbers: 一个由多个整数字符串组成的列表,每个字符串可以视为一个数字组。小M需要从每个数字组中选择一个数字。

例如对于[123, 456, 789],14个符合条件的数为:147 149 158 167 169 248 257 259 268 347 349 358 367 369


测试样例

样例1:

输入:numbers = [123, 456, 789] 输出:14

样例2:

输入:numbers = [123456789] 输出:4

样例3:

输入:numbers = [14329, 7568] 输出:10

 

动态规划思想:

我们可以定义一个二维数组 dp[i][j],其中 i 表示处理到第 i 个数字组时,j 表示组合的各位数字之和是奇数还是偶数:

  • dp[i][0]:第 i 个组之前的组合其各位数字之和是偶数的总数。

  • dp[i][1]:第 i 个组之前的组合其各位数字之和是奇数的总数。

def solution(numbers):
    # Please write your code here
    # 初始的dp表示没有数字组时,和为偶数的组合有1种(空组合),和为奇数的组合有0种
    dp = [1, 0]
    
    # 遍历每个数字组
    for group in numbers:
        odd_count = 0
        even_count = 0
        
        # 统计当前数字组中奇数和偶数的个数
        for num in str(group):
            if int(num) % 2 == 0:
                even_count += 1
            else:
                odd_count += 1
        
        # 更新dp数组,tmp是为了防止在更新过程中覆盖了dp中的值
        new_dp = [0, 0]
        
        # 偶数和偶数组合:dp[0] (之前是偶数) + (选择偶数) => 仍为偶数
        # 奇数和奇数组合:dp[1] (之前是奇数) + (选择偶数) => 仍为奇数
        new_dp[0] = dp[0] * even_count + dp[1] * odd_count
        
        # 奇数和偶数组合:dp[0] (之前是偶数) + (选择奇数) => 为奇数
        # 偶数和奇数组合:dp[1] (之前是奇数) + (选择奇数) => 为偶数
        new_dp[1] = dp[0] * odd_count + dp[1] * even_count
        
        # 更新 dp 数组
        dp = new_dp
    
    # 返回最终和为偶数的组合数
    return dp[0]

 

寻找最大葫芦

问题描述

在一场经典的德州扑克游戏中,有一种牌型叫做“葫芦”。“葫芦”由五张牌组成,其中包括三张相同牌面值的牌 a* 和另外两张相同牌面值的牌 b。如果两个人同时拥有“葫芦”,我们会优先比较牌 a 的大小,若牌 a 相同则再比较牌 bb 的大小。

在这个问题中,我们对“葫芦”增加了一个限制:组成“葫芦”的五张牌牌面值之和不能超过给定的最大值 max。牌面值的大小规则为:A > K > Q > J > 10 > 9 > ... > 2,其中 A 的牌面值为1,K 为13,依此类推。

给定一组牌,你需要找到符合规则的最大的“葫芦”组合,并输出其中三张相同的牌面和两张相同的牌面。如果找不到符合条件的“葫芦”,则输出 “0, 0”。


测试样例

样例1:

输入:n = 9, max = 34, array = [6, 6, 6, 8, 8, 8, 5, 5, 1] 输出:[8, 5]

样例2:

输入:n = 9, max = 37, array = [9, 9, 9, 9, 6, 6, 6, 6, 13] 输出:[6, 9]

样例3:

输入:n = 9, max = 40, array = [1, 11, 13, 12, 7, 8, 11, 5, 6] 输出:[0, 0]

思路一:暴力,按规则排序后,从前往后遍历找最大

def solution(n, max, array):
    # Edit your code here
    array.sort(reverse = True)
    num_one = array.count(1)
    while 1 in array:
        array.remove(1)
    for i in range(num_one):
        array.insert(0, 1)
​
    num = {}
    for i in array:
        num[i] = num.get(i, 0) + 1
    re = [0, 0]
    print(num)
    
    for k in num:
        f = False
        if num.get(k) >= 3:
            re[0] = k
            for kk in  num:
                if kk != k and num.get(kk) >= 2:
                    re[1] = kk
                    if 3 * re[0] + 2 * re[1] <= max:
                        f = True
                        break
            if f:
                break
    else:
        re = [0, 0]
    return re

 

创意标题匹配问题

问题描述

在广告平台中,为了给广告主一定的自由性和效率,允许广告主在创造标题的时候以通配符的方式进行创意提交。线上服务的时候,会根据用户的搜索词触发的 bidword 对创意中的通配符(通配符是用成对 {} 括起来的字符串,可以包含 0 个或者多个字符)进行替换,用来提升广告投放体验。例如:“{末日血战} 上线送 SSR 英雄,三天集齐无敌阵容!”,会被替换成“帝国时代游戏下载上线送 SSR 英雄,三天集齐无敌阵容!”。给定一个含有通配符的创意和n个标题,判断这句标题是否从该创意替换生成的。


测试样例

样例1:

输入:n = 4, template = "ad{xyz}cdc{y}f{x}e", titles = ["adcdcefdfeffe", "adcdcefdfeff", "dcdcefdfeffe", "adcdcfe"] 输出:"True,False,False,True"

样例2:

输入:n = 3, template = "a{bdc}efg", titles = ["abcdefg", "abefg", "efg"] 输出:"True,True,False"

样例3:

输入:n = 5, template = "{abc}xyz{def}", titles = ["xyzdef", "abcdef", "abxyzdef", "xyz", "abxyz"] 输出:"True,False,True,True,True"

方法一:正则表达式

import re
def solution(n, template, titles):
    # Please write your code here
    result = []
    template = re.sub(pattern="{.*?}", repl=".*", string=template) # {}替换为匹配所有(非贪婪)
    template += "$" # 匹配字符串末尾
    for s in titles:
        print(re.match(pattern=template, string=s))
        if re.match(pattern=template, string=s) is not None:
            result.append("True")
        else:
            result.append("False")
        
    return ",".join(result)

 

...全文
400 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

1,041

社区成员

发帖
与我相关
我的任务
社区描述
中南民族大学CSDN高校俱乐部聚焦校内IT技术爱好者,通过构建系统化的内容和运营体系,旨在将中南民族大学CSDN社区变成校内最大的技术交流沟通平台。
经验分享 高校 湖北省·武汉市
社区管理员
  • c_university_1575
  • WhiteGlint666
  • wzh_scuec
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

欢迎各位加入中南民族大学&&CSDN高校俱乐部社区(官方QQ群:908527260),成为CSDN高校俱乐部的成员具体步骤(必填),填写如下表单,表单链接如下:
人才储备数据库及线上礼品发放表单邀请人吴钟昊:https://ddz.red/CSDN
CSDN高校俱乐部是给大家提供技术分享交流的平台,会不定期的给大家分享CSDN方面的相关比赛以及活动或实习报名链接,希望大家一起努力加油!共同建设中南民族大学良好的技术知识分享社区。

注意:

1.社区成员不得在社区发布违反社会主义核心价值观的言论。

2.社区成员不得在社区内谈及政治敏感话题。

3.该社区为知识分享的平台,可以相互探讨、交流学习经验,尽量不在社区谈论其他无关话题。

试试用AI创作助手写篇文章吧