Algorithm 算法-TOC编号(目录)

Algorithm 算法-TOC编号(目录),algorithm,pseudocode,Algorithm,Pseudocode,我想实现一个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(羞耻的重担)下

我想实现一个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

  • 如果当前缩进级别大于堆栈的大小,则在堆栈上按差异大小推送相同数量的缩进级别(差异通常只有一个,但即使有人将级别3标题放在级别1标题下,这也有效)
  • 如果当前缩进级别小于堆栈的大小,则弹出并丢弃与差值相同的数字,然后增加堆栈上的顶部数字
  • 如果当前缩进级别等于堆栈的大小,则增加堆栈上的顶部数字
  • 对于每一行,当前标题编号都是堆栈上的编号,这些编号与。把他们分开

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

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

    const toc=`
    一个
    两个
    三
    四
    五
    六
    七
    八
    九
    十
    `;
    让堆栈=[];
    toc.trim().split(/\n/g).forEach(行=>{
    //获取标识级别,其中1没有缩进,以此类推
    让level=line.match(/^\s*/)[0]。长度+1;
    如果(级别>堆栈长度){
    while(级别>堆栈长度)
    堆栈推送(1);
    }否则{
    while(级别<堆栈长度)
    stack.pop();
    stack[stack.length-1]+;
    }
    让title=stack.join(“.”+“+line.trim()”;
    document.body.appendChild(document.createElement(“div”)).innerText=title;
    
    });此算法假定缩进级别的增加幅度不会超过1个单位。如果是,则必须将所有“跳过”级别设置为1

    #use a vector instead, if your language supports it
    numbering = {0, 0, 0, 0, 0, 0, 0}
    
    for line in lines:
        level = indentLevel(line) #starting from 0
    
        numbering[level] = numbering[level] + 1
        numbering[level + 1] = 0 #create it if it doesn't exist
        for n = 0 to level - 1
            print numbering[n], ".",
        print numbering[level], " ", line
    

    所以你有工作代码。那你需要什么?@白痴:我来这里不是为了完成我的工作,而是为了向别人学习更好的方法,如果我能的话,也许还能帮助他们。顺便提一下你为什么要浪费时间在这些评论上?你从来没有提出过具体的问题,请阅读常见问题解答:这不是讨论板。如果我不再回应,请原谅。