刷题漫漫路(四)| 豆包MarsCode AI刷题

296 阅读3分钟

大家好,今天我将继续分享我的豆包MarsCode AI刷题。这次我将解决两个问题,首先是简单的字符串替换问题,其次是身为困难题的字符串排序问题。

第一题——字符串替换挑战

问题描述
给定一个字符串s,编写一个函数,将字符串中的小写字母a替换为"%100",并返回替换后的字符串。

示例
对于字符串"abcdwa",所有a字符会被替换为"%100",最终结果为"%100bcdw%100"

解答思路

这个问题相对简单,我们可以遍历字符串,并使用条件语句检查每个字符是否为'a'。如果是,我们将其替换为"%100"。一行代码就搞定了

实现代码

function solution(s) {
    return s.split('').map(char => char === 'a' ? '%100' : char).join('');
}
function main() {
    console.log(solution("abcdwa") === "%100bcdw%100");
    console.log(solution("banana") === "b%100n%100n%100");
    console.log(solution("apple") === "%100pple");
}
main();

运行结果确认无误,我们继续进行下一题。

第二题——最小字典序挑战

这是一道困难题,我刚看到题目的时候也没什么思路,看了十几分钟还是让ai给的思路。看到豆包的思路后就差不多写出来了

问题描述
小U拥有一个由01组成的字符串,她可以进行最多k次操作,每次操作可以交换相邻的两个字符。目标是通过这些操作,使得最终得到的字符串字典序最小。

示例
小U当前有一个字符串"01010",她最多可以进行2次相邻字符交换操作。通过这些操作,她可以将字符串调整为"00101",这是可以通过不超过2次操作得到的字典序最小的字符串。

解答思路

这个问题可以使用贪心算法来解决。我们的目标是尽可能地将0移到字符串的前面。因此,我们应该在每次操作时,找到最左边的1,并尝试将其与左侧最近的0交换。

实现代码

function solution(n, k, s) {
    let s_list = s.split('');
    for (let i = 0; i < n && k > 0; i++) {
        if (s_list[i] === '1') {
            // 找到左侧最近的'0'进行交换
            for (let j = i - 1; j >= 0 && k > 0; j--) {
                if (s_list[j] === '0') {
                    [s_list[i], s_list[j]] = [s_list[j], s_list[i]];
                    k--;
                    break;
                }
            }
        }
    }
    return s_list.join('');
}
// 测试用例
console.log(solution(5, 2, "01010") === '00101');
console.log(solution(7, 3, "1101001") === '0110101');
console.log(solution(4, 1, "1001") === '0101');

在这个实现中,我们通过两层循环来确保每次操作都是有效的,并且尽可能地将0字符移到前面。外层循环负责遍历字符串,内层循环负责找到并交换10。通过这种方式,我们能够确保在操作次数限制内得到尽可能小的字典序字符串。

可以分为以下步骤:

  1. 遍历字符串:使用一个循环从字符串的第一个字符开始遍历。
  2. 寻找1字符:在每次迭代中,如果当前字符是1,则尝试将其与左侧最近的0进行交换。
  3. 交换操作:为了实现交换,我们需要从当前1字符的位置向左查找,找到第一个0字符。找到后,我们将这两个字符交换,并将操作次数k减一。
  4. 停止条件:如果k变为0,即没有剩余的操作次数,或者已经遍历完整个字符串,则停止操作。

运行测试用例,结果符合预期。

image.png 今天的分享到这里就结束了,不要忘记转语言提交哦