我需要一个 js 函数,通过仅递增或附加字母来按字典顺序递增字符串。还应该有一个函数,通过相同的逻辑递减字符串。
不应修改特殊字符,但在递减时也可以添加或删除特殊字符
增量也应该是尽可能最小的步长,至少在所需的字符串长度范围内
增量/减量的总量可以作为参数传递,因为它是提前确定的。
我们还可以假设,我们不会对字符串进行超过可能的减量。
增量示例:
“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、....
增加字符串的想法不是在没有可能性时在右侧附加新数字,而是在左侧。否则,您将被字符串的“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>