折腾了好久,还是没做出来
这个是群里水友发的题,自己也没做出来,写出来的代码和结果偏差太大,就不show code了
想看看大佬怎么解决的
实现语言:Python,Golang(可选) https://www.cnblogs.com/Higurashi-kagome/p/12747857.html 本帖最后由 小帅才 于 2021-4-11 18:27 编辑
1 小帅才 发表于 2021-4-11 18:08
说下我的思路,首先建立一个map,维护已经出现的 “#.*?” 次数,然后获取当前字符串标题序号时,比如 "### ...
嗯java我看不太明白
这个题主要难点就是维护#的计数
当遇到新的#节点 后面的##### 要重新计数
而且感觉很难把代码写的优雅
太难了 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-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 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:12 编辑
pangrui2011 发表于 2021-4-11 19:36
def fi():
data = ['#a', '##b', '##c', '#e']
li = * 10
你写的判断好像有点问题,数据多一点或者长一点,后面的序号就乱了。
本帖最后由 笨笨家的唯一 于 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: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