字典序最小的01字符串|豆包MarsCode AI刷题

52 阅读4分钟

代码整体功能概述

这段 Java 代码旨在解决一个有趣的字符串操作问题,即给定一个由 0 和 1 组成的字符串,允许进行最多k次交换相邻字符的操作,目标是通过这些操作得到字典序最小的字符串。代码通过巧妙运用贪心算法的思想,逐步对字符串进行优化调整,以实现最终的目标。

代码具体步骤解析

  1. 字符数组转换
char[] charArray = s.toCharArray();

首先,通过调用toCharArray方法将输入的字符串s转换为字符数组charArray。这样做的好处是在后续处理中,能够方便地对字符串中的每个字符进行直接操作,例如交换相邻字符等,相较于直接操作字符串本身,操作字符数组更为灵活高效,为后续的核心算法逻辑实施奠定了基础。

  1. 外层循环遍历(贪心选择的主要过程)
for (int i = 0; i < n - 1 && k > 0; i++) {

外层循环控制着整个优化过程的推进。它从字符串的第一个字符位置(索引为 0)开始,一直持续到倒数第二个字符位置(索引为n - 1,因为我们只需要考虑到倒数第二个字符,它才有相邻字符可供交换)。同时,每次循环还会检查剩余的操作次数k是否大于 0,只有当还有可操作次数时,才会继续进行下一轮的优化尝试,这确保了不会超出给定的操作次数限制,遵循了题目的要求。

  1. 内层循环寻找最小字符索引
int minIndex = i;
for (int j = i + 1; j < Math.min(i + k + 1, n); j++) {
    if (charArray[j] < charArray[minIndex]) {
        minIndex = j;
    }
}

对于外层循环每到达的一个位置i,都会启动内层循环来寻找从当前位置i开始,在剩余操作次数所能涉及的范围内的最小字符所在的索引。内层循环从i + 1位置开始,其结束位置通过Math.min(i + k + 1, n)来确定,这样既考虑了最多能利用剩余的k次操作去查找后面的字符(也就是最远能涉及到i + k位置的字符,所以是i + k + 1来界定范围),又防止了超出字符串本身的长度范围(与n取较小值)导致数组越界异常。在这个循环过程中,如果发现后面某个位置j上的字符比当前记录的最小字符(初始为位置i处的字符,索引记录在minIndex中)更小,就更新minIndexj,通过这样的比较查找,最终minIndex就指向了从当前位置开始在可操作范围内字典序最小的字符所在位置。

  1. 执行字符交换操作及更新操作次数
if (minIndex > i) {
    for (int m = minIndex; m > i; m--) {
        char temp = charArray[m];
        charArray[m] = charArray[m - 1];
        charArray[m - 1] = temp;
    }
    k -= (minIndex - i);
}

当内层循环结束后,如果发现找到的最小字符的索引minIndex大于当前位置i,这就意味着需要通过交换操作将这个最小字符移动到当前位置i处,以优化字符串的字典序。为此,使用了一个内层的交换循环,从minIndex位置开始,将该位置的字符依次与它前面的字符进行交换(通过临时变量temp实现交换过程),每次交换都使得最小字符往前移动一位,直到它到达位置i为止。同时,由于每进行一次相邻字符交换就消耗了一次操作机会,所以需要相应地更新剩余操作次数k,这里将k减去从最小字符位置minIndex移动到当前位置i所需要进行的交换次数(即minIndex - i),确保操作次数的统计始终准确,符合题目给定的最多k次操作的限制条件。

  1. 返回最终结果
return new String(charArray);

当外层循环结束,也就是已经遍历完所有可以进行操作的位置或者操作次数已经用完时,此时字符数组charArray所表示的字符串就是经过最多k次操作后得到的字典序最小的字符串。最后通过new String(charArray)将处理后的字符数组转换回字符串并返回,完成整个算法流程,输出符合要求的结果。

测试样例验证

main方法中,代码添加了题目给定的几个测试样例进行验证,通过equals方法比较函数返回的结果和预期的正确结果是否一致,以此来检验代码逻辑在不同输入情况下的正确性。例如,对于输入n = 5, k = 2, s = "01010"的情况,经过代码中的一系列操作,最终应该返回"00101",通过这样的测试验证,能够确保代码在面对类似的具体输入场景时,确实能够按照预期找到字典序最小的字符串,从而增强了代码的可靠性和实用性。