RS水果 发表于 2021-4-11 17:30

折腾了好久,还是没做出来


这个是群里水友发的题,自己也没做出来,写出来的代码和结果偏差太大,就不show code了
想看看大佬怎么解决的
实现语言:Python,Golang(可选)

ermao 发表于 2021-4-11 17:56

https://www.cnblogs.com/Higurashi-kagome/p/12747857.html

小帅才 发表于 2021-4-11 18:08

本帖最后由 小帅才 于 2021-4-11 18:27 编辑

                  1

RS水果 发表于 2021-4-11 18:19

小帅才 发表于 2021-4-11 18:08
说下我的思路,首先建立一个map,维护已经出现的 “#.*?” 次数,然后获取当前字符串标题序号时,比如 "### ...

嗯java我看不太明白
这个题主要难点就是维护#的计数
当遇到新的#节点   后面的##### 要重新计数
而且感觉很难把代码写的优雅
太难了

ermao 发表于 2021-4-11 19:17

titles = [
    '# 标题',
    '## 标题',
    '### 标题',
    '#### 标题',
    '#### 标题',
    '## 标题',
    '### 标题',
    '#### 标题',
    '# 标题',
    '## 标题',
]
nums = []
num =
for j, title in enumerate(titles):
    index = title.index(' ')
    text = title
    now = len(title[:index])
    nums.append(now)
    if j > 0 and now > nums:
      num = 0
    num += 1
    sn = []
    for i in range(now):
      sn.append(str(num))
    print('{} {}'.format('.'.join(sn), text))

pangrui2011 发表于 2021-4-11 19:36

本帖最后由 pangrui2011 于 2021-4-12 13:51 编辑

之前的代码有点问题,已修改def fi(data):
    li = * 10
    res = []
    for i in data:
      x = i.split(' ')
      n = len(x)
      li += 1
      a = '.'.join(map(str, li))
      res.append(])
      li = li[:n + 1] + * 1
    return res

ligxi 发表于 2021-4-11 21:54

本帖最后由 ligxi 于 2021-4-11 22:03 编辑

这样优雅吗?可能有点难理解,写了一点注释。{:1_900:}
titles = ['# a', '## b', '## c', '### d', '### e', '### f', '## g', '### h', '# i', '## j', '## k', '### l', '#### m',
          '#### n', '### o', '# p', '## q', '### r', '### s', '## t', '### u', '# v', '## w', '### x', '### y', '## z']
# 序号和标题
sNumbers, contents = list(zip(*map(lambda x: x.split(), titles)))

# 最大计数长度
numbers = * len(max(sNumbers))
#
title_list = []
for index, value in enumerate(sNumbers):
    # 获取长度
    serial_number_length = len(value)
    # 自增
    numbers += 1
    # 结果
    serial_number = '{}'.format('.'.join(map(lambda x: str(x), numbers[:serial_number_length])))
    # print(serial_number)
    title_list.append(])
    # 重置计数
    numbers = numbers[:serial_number_length] + list(map(lambda x: 0, numbers))
#
print(title_list)

封装为函数进行调用:
# 假装是输入的内容
titles = ['# a', '## b', '## c', '### d', '### e', '### f', '## g', '### h', '# i', '## j', '## k', '### l', '#### m',
          '#### n', '### o', '# p', '## q', '### r', '### s', '## t', '### u', '# v', '## w', '### x', '### y', '## z']


def serial_count(lst):
    s_numbers, contents = list(zip(*map(lambda x: x.split(), lst)))
    numbers = * len(max(s_numbers))
    title_list = []
    for index, value in enumerate(s_numbers):
      serial_number_length = len(value)
      numbers += 1
      serial_number = '{}'.format('.'.join(map(lambda x: str(x), numbers[:serial_number_length])))
      title_list.append(])
      numbers = numbers[:serial_number_length] + list(map(lambda x: 0, numbers))
    return title_list


print(serial_count(titles))

ligxi 发表于 2021-4-11 23:10

本帖最后由 ligxi 于 2021-4-11 23:12 编辑

pangrui2011 发表于 2021-4-11 19:36
def fi():
    data = ['#a', '##b', '##c', '#e']
    li = * 10

你写的判断好像有点问题,数据多一点或者长一点,后面的序号就乱了。

笨笨家的唯一 发表于 2021-4-12 00:17

本帖最后由 笨笨家的唯一 于 2021-4-12 00:18 编辑

let arr = ['# a', '## b', '## c', '### d', '### e', '### f', '## g', '### h', '# i', '## j', '## k', '### l', '#### m', '#### n', '### o', '# p', '## q', '### r', '### s', '## t', '### u', '# v', '## w', '### x', '### y', '## z'];
function jiexi(arr) {
            let titleArr = []; //用于 存储解析的 # 的个数 titleArr 表示 只有一个 # 也就是第一层 titleArr 表示 有两个 # 那么他的标题就是 第一层 + 第二层
            let result = new Map(); // 存储结果
            arr.forEach((value, i) => { // 遍历数组
                let matchs = value.match(/^(#+)(.*)/); // 正则提取 前面的 # 和后面的内容
                let temp = matchs.length - 1; // 将 前面的 # 的个数 -1 赋予 临时变量也就是判断你有几个 # 充当当前层级计数器
                if (titleArr) { // 当前层级已经存在了 , 那么要么要重置层级计数器,要么就层级数目 + 1
                  let before = arr.match(/^(#+)(.*)/); // 获取当前元素前面的那个元素的 # 也就是层级
                  if (temp + 1 == before.length + 1) { // 如果 当前元素的 # 的个数 (temp + 1) 与前面的 # 的个数 + 1 相同,代表需要重置计数器 如 ###a ####b 那么 此时的b 的标题当前层级就需要重置
                        titleArr = 1; // 重置当前层级的 计数器
                  } else {
                        titleArr += 1; // 不满足要求 那么 层级计数器 + 1
                  }
                } else {
                  titleArr = 1; // 初始化计数器
                }
                let title = titleArr.slice(0, temp + 1).join('.'); // 当前元素层级转换完毕,转换为 标题
                result.set(title, matchs); // 向结果 中 添加 标题 和标题内容
            });
            return result; //返回结果
      }

      let m1 = jiexi(arr);
      console.log(m1);

js 代码, 按下f12 ,复制到Console 中即可运行
python 不大会,但是思路应该是一致的

RS水果 发表于 2021-4-12 05:15

本帖最后由 RS水果 于 2021-4-12 05:22 编辑

pangrui2011 发表于 2021-4-11 19:36
def fi():
    data = ['#a', '##b', '##c', '#e']
    li = * 10

代码逻辑有点问题
使用测试列表

s2 = ["# a", "# b", "## c","# d","# e","## f"]
输出结果:
['1', ' a']
['2', ' b']
['2.1', ' c']
['3', ' d']
['4', ' e']
['4.2', ' f'] # 输出应该为 ['4.1','f']
页: [1] 2
查看完整版本: 折腾了好久,还是没做出来