1,041
社区成员




在一个班级中,每位同学都拿到了一张卡片,上面有一个整数。有趣的是,除了一个数字之外,所有的数字都恰好出现了两次。现在需要你帮助班长小C快速找到那个拿了独特数字卡片的同学手上的数字是什么。
要求:
设计一个算法,使其时间复杂度为 O(n),其中 n 是班级的人数。
尽量减少额外空间的使用,以体现你的算法优化能力。
样例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)