字典序最小的01字符串 、小U的数字插入问题| 豆包MarsCode AI刷题

61 阅读3分钟

今天做了一道豆包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