今天做了一道豆包MarsCode AI刷题题库中的困难题,一道简单题,记录一下我的解题过程。
字典序最小的01字符串
问题描述
小U拥有一个由0和1组成的字符串,她可以进行最多k次操作,每次操作可以交换相邻的两个字符。目标是通过这些操作,使得最终得到的字符串字典序最小。
例如,小U当前有一个字符串 01010,她最多可以进行 2 次相邻字符交换操作。通过这些操作,她可以将字符串调整为 00101,这是可以通过不超过2次操作得到的字典序最小的字符串。
现在,小U想知道,经过最多k次操作后,能够得到的字典序最小的字符串是什么。
测试样例
样例1:
输入:
n = 5, k = 2, s = "01010"
输出:'00101'
样例2:
输入:
n = 7, k = 3, s = "1101001"
输出:'0110101'
样例3:
输入:
n = 4, k = 1, s = "1001"
输出:'0101'
解题过程
我没刷过多少题,上次做一道题学会了递归暴力破解,于是这题也这么做,结果第四个样例就超时了。于是我想着如何能改进算法呢?经过在网络上的一番搜索,我发现可以用贪心思想来改进。每当发现'01'序列时,使用一次交换操作,其余情况都不进行交换。改进后,答案提交就成功通过了。
代码实现
def search(i, n, k, s):
global min_string
if k == 0 or i == n-1:
s = "".join(s)
if s < min_string:
min_string = s
return
else:
return
if not (s[i] == '1' and s[i+1] =='0'):
search(i+1, n, k, s)
else:
s_swap = s[:]
s_swap[i], s_swap[i+1] = s_swap[i+1], s_swap[i]
search(0, n, k-1, s_swap)
return
def solution(n: int, k: int, s: str) -> str:
global min_string
min_string = s
s = list(s)
search(0, n, k, s)
return min_string
小U的数字插入问题
问题描述
小U手中有两个数字 a 和 b。第一个数字是一个任意的正整数,而第二个数字是一个非负整数。她的任务是将第二个数字 b 插入到第一个数字 a 的某个位置,以形成一个最大的可能数字。
你需要帮助小U找到这个插入位置,输出插入后的最大结果。
测试样例
样例1:
输入:
a = 76543, b = 4
输出:765443
样例2:
输入:
a = 1, b = 0
输出:10
样例3:
输入:
a = 44, b = 5
输出:544
样例4:
输入:
a = 666, b = 6
输出:6666
解题过程
一开始想复杂了,把a转换成了列表处理,忽略了a可能是两位及以上的位数。可以直接在字符串层面进行操作,而不需要将 a 转换成列表,遍历a,尝试在每个位置插入,并与目前的最大值相比较即可。
代码实现
def solution(a: int, b: int) -> int:
b = str(b)
a_str = str(a)
max_result = a
for i in range(len(a_str) + 1):
new_number = int(a_str[:i] + b + a_str[i:])
if new_number > max_result:
max_result = new_number
return max_result