算法问题/代码挑战。 JS 函数以字典顺序最小的步长递增字符串[关闭]

问题描述 投票:0回答:1

我需要一个 js 函数,通过仅递增或附加字母来按字典顺序递增字符串。还应该有一个函数,通过相同的逻辑递减字符串。

  1. 不应修改特殊字符,但在递减时也可以添加或删除特殊字符

  2. 增量也应该是尽可能最小的步长,至少在所需的字符串长度范围内

  3. 增量/减量的总量可以作为参数传递,因为它是提前确定的。

  4. 我们还可以假设,我们不会对字符串进行超过可能的减量。

增量示例:

“x”,2次: y,z

“x”,53次 xA, xB, xC,...,xz, y, yA,

“$y$”,1 次: “$z$”

“$y$”,>53 次: $y$A - $y$Z、$y$a - $y$z、$z$、$z$A、....

javascript string algorithm increment decrement
1个回答
0
投票

增加字符串的想法不是在没有可能性时在右侧附加新数字,而是在左侧。否则,您将被字符串的“zz”前缀困住,它永远不会再改变,只会增长。

您可以使用带有正则表达式参数的

replace
函数来快速识别“z”字符的终止序列,这样您就可以将它们全部变成“A”。

对于递减,逻辑是识别“A”字符的终止序列。那些必须转向“z”。

当然,在这两种情况下,终止序列之前的数字必须递增/递减。

例如,如果您不断增加反馈到

incrementString
的字符串,您会得到以下结果:

v, w, x, y, z, AA, AB, AC, ..., Az, BA, BB, ... ... zy, zz, AAA, ...

您的代码显示了一个额外的功能:如果输入中有外来字符,它应该保持不变。按照这种逻辑,将不可能确保两个函数精确地相互镜像。例如,如果输入是“-A-”,那么

decrementString()
的输出将变成“--”或空字符串。如果此输出作为
incrementString()
的输入给出,则没有关于在哪里插入“A”的信息,以便您再次得到“-A-”。如果原始输入是“-A--AA-”,事情会变得更加复杂。

由于没有具体说明你想如何处理这些情况,所以我没有集中精力。

为了确保词汇顺序,我建议从结果字符串中删除任何不是有效“数字”的前缀。

这是一个解决方案。可运行的代码片段允许您输入一些字符,它将显示使用该输入调用两个函数的结果:

const upper = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
const digits = upper + upper.toLowerCase();

const add = (ch, unit) => digits[digits.indexOf(ch) + unit];

const incrementString = (string) =>
    string.replace(/([A-Za-y])?([^A-Za-y]*)$/, (_, digit, zz) =>
        add(digit || '-', 1) + zz.replace(/z/g, "A")
    );

const decrementString = (string) =>
    string.replace(/([A-Za-z])([^B-Za-z]*)$/, (match, digit, aa) =>
        (add(digit, -1) ?? ' ') + aa.replace(/A/g, "z")
    ).replace(/^[^A-Za-z]+$/, ""); // return empty string if no characters left

// I/O management

const [input, outPrev, outSelf, outNext] = document.querySelectorAll("input, span");
input.addEventListener("input", refresh);

function refresh() {
    const s = input.value;
    outPrev.textContent = JSON.stringify(decrementString(s));
    outSelf.textContent = JSON.stringify(s);
    outNext.textContent = JSON.stringify(incrementString(s));
}
refresh();
Input: <input value="yZzz"><br>
<pre>
Prev: <span></span>
Self: <span></span>
Next: <span></span>
</pre>

© www.soinside.com 2019 - 2024. All rights reserved.