gpt4 book ai didi

算法 - TOC 的编号(目录)

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:04:51 27 4
gpt4 key购买 nike

我想实现一个 VBA 函数,根据行的分组深度对 Excel 行进行编号。

但我认为生成 TOC 的通用算法更有趣。

问题是:

给定一个“缩进”行的列表,例如

One
Two
Three
Four
Five
Six

(可以假定“缩进级别”是已知的并且是输入数据的一部分)

生成以下输出:

1.    One
1.1 Two
1.1.1 Three
1.1.1.1 Four
1.2 Five
2. Six

当然,我的代码已启动并运行......并且还隐藏在 THWoS(耻辱的沉重重量)下

最佳答案

对数字使用堆栈。循环遍历每一行,检查每一行的缩进级别,没有缩进为级别1。

  1. 如果当前缩进级别大于堆栈的大小,则将与差异相同的缩进数量压入堆栈(差异通常只有一个,但即使有人将 3 级标题放在一个级别下也是如此例如 1 个标题)
  2. 如果当前缩进级别小于堆栈的大小,弹出并丢弃与差值一样多的数字,然后递增堆栈顶部的数字。
  3. 如果当前缩进级别等于堆栈的大小,则递增堆栈顶部的数字

对于每一行,当前标题编号是堆栈中的数字与 .将它们分开。

请注意堆栈的大小如何方便地表示上一行的缩进级别。

对于那些发现更容易阅读代码的人,这里有一个适用于现代浏览器的 JavaScript 实现:

const toc = `
One
Two
Three
Four
Five
Six
Seven
Eight
Nine
Ten
`;

let stack = [];

toc.trim().split(/\n/g).forEach(line => {
// Gets the identitation level with 1 being no indentation and so forth
let level = line.match(/^\s*/)[0].length + 1;

if (level > stack.length) {
while (level > stack.length)
stack.push(1);
} else {
while (level < stack.length)
stack.pop();

stack[stack.length - 1]++;
}

let title = stack.join(".") + ". " + line.trim();

document.body.appendChild(document.createElement("div")).innerText = title;
});

关于算法 - TOC 的编号(目录),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2946427/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com