吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1469|回复: 16
收起左侧

[求助] 折腾了好久,还是没做出来

[复制链接]
RS水果 发表于 2021-4-11 17:30
QQ图片20210411172719.jpg
这个是群里水友发的题,自己也没做出来,写出来的代码和结果偏差太大,就不show code了
想看看大佬怎么解决的
实现语言:Python,Golang(可选)

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

ermao 发表于 2021-4-11 17:56
小帅才 发表于 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
[Python] 纯文本查看 复制代码
titles = [
    '# 标题',
    '## 标题',
    '### 标题',
    '#### 标题',
    '#### 标题',
    '## 标题',
    '### 标题',
    '#### 标题',
    '# 标题',
    '## 标题',
]
nums = []
num = [0, 0, 0, 0]
for j, title in enumerate(titles):
    index = title.index(' ')
    text = title[index + 1:]
    now = len(title[:index])
    nums.append(now)
    if j > 0 and now > nums[j - 1]:
        num[now - 1] = 0
    num[now - 1] += 1
    sn = []
    for i in range(now):
        sn.append(str(num[i]))
    print('{} {}'.format('.'.join(sn), text))

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
ligxi + 1 + 1 用心讨论,共获提升!

查看全部评分

pangrui2011 发表于 2021-4-11 19:36
本帖最后由 pangrui2011 于 2021-4-12 13:51 编辑

之前的代码有点问题,已修改
[Python] 纯文本查看 复制代码
def fi(data):
    li = [0] * 10
    res = []
    for i in data:
        x = i.split(' ')
        n = len(x[0])
        li[n] += 1
        a = '.'.join(map(str, li[1:n + 1]))
        res.append([a, x[1]])
        li = li[:n + 1] + [0] * 1
    return res
ligxi 发表于 2021-4-11 21:54
本帖最后由 ligxi 于 2021-4-11 22:03 编辑

这样优雅吗?可能有点难理解,写了一点注释。
[Python] 纯文本查看 复制代码
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 = [0] * len(max(sNumbers))
#
title_list = []
for index, value in enumerate(sNumbers):
    # 获取长度
    serial_number_length = len(value)
    # 自增
    numbers[serial_number_length - 1] += 1
    # 结果
    serial_number = '{}'.format('.'.join(map(lambda x: str(x), numbers[:serial_number_length])))
    # print(serial_number)
    title_list.append([serial_number, contents[index]])
    # 重置计数
    numbers = numbers[:serial_number_length] + list(map(lambda x: 0, numbers[serial_number_length:]))
#
print(title_list)

封装为函数进行调用:
[Python] 纯文本查看 复制代码
# 假装是输入的内容
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 = [0] * len(max(s_numbers))
    title_list = []
    for index, value in enumerate(s_numbers):
        serial_number_length = len(value)
        numbers[serial_number_length - 1] += 1
        serial_number = '{}'.format('.'.join(map(lambda x: str(x), numbers[:serial_number_length])))
        title_list.append([serial_number, contents[index]])
        numbers = numbers[:serial_number_length] + list(map(lambda x: 0, numbers[serial_number_length:]))
    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
[mw_shl_code=python,true]def fi():
    data = ['#a', '##b', '##c', '#e']
    li = [0] * 10

你写的判断好像有点问题,数据多一点或者长一点,后面的序号就乱了。
image.png
笨笨家的唯一 发表于 2021-4-12 00:17
本帖最后由 笨笨家的唯一 于 2021-4-12 00:18 编辑

[JavaScript] 纯文本查看 复制代码
  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[0] 表示 只有一个 # 也就是第一层 titleArr[1] 表示 有两个 # 那么他的标题就是 第一层 + 第二层 
            let result = new Map(); // 存储结果
            arr.forEach((value, i) => { // 遍历数组
                let matchs = value.match(/^(#+)(.*)/); // 正则提取 前面的 # 和后面的内容
                let temp = matchs[1].length - 1; // 将 前面的 # 的个数 -1 赋予 临时变量  也就是判断你有几个 # 充当当前层级计数器
                if (titleArr[temp]) { // 当前层级已经存在了 , 那么要么要重置层级计数器,要么就层级数目 + 1
                    let before = arr[i - 1].match(/^(#+)(.*)/)[1]; // 获取当前元素前面的那个元素的 # 也就是层级
                    if (temp + 1 == before.length + 1) { // 如果 当前元素的 # 的个数 (temp + 1) 与前面的 # 的个数 + 1 相同,代表需要重置计数器 如 ###a ####b 那么 此时的b 的标题当前层级就需要重置
                        titleArr[temp] = 1; // 重置当前层级的 计数器 
                    } else {
                        titleArr[temp] += 1; // 不满足要求 那么 层级计数器 + 1
                    }
                } else {
                    titleArr[temp] = 1; // 初始化计数器 
                }
                let title = titleArr.slice(0, temp + 1).join('.'); // 当前元素层级转换完毕,转换为 标题  
                result.set(title, matchs[2]); // 向结果 中 添加 标题 和标题内容
            });
            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
[Python] 纯文本查看 复制代码
def fi():
    data = ['#a', '##b', '##c', '#e']
    li = [0] * 10


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

[Python] 纯文本查看 复制代码
s2 = ["# a", "# b", "## c","# d","# e","## f"]

输出结果:
[Python] 纯文本查看 复制代码
['1', ' a']
['2', ' b']
['2.1', ' c']
['3', ' d']
['4', ' e']
['4.2', ' f'] # 输出应该为 ['4.1','f']
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-26 04:43

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表