孤独的嫖客 发表于 2021-4-11 18:27:09

[面试题]难度中级,来挑战一下吧

本帖最后由 孤独的嫖客 于 2021-4-11 18:31 编辑



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

static/image/hrline/line7.png

static/image/hrline/line1.png
我愿意悬赏更多的鱼币,奈何小甲鱼不让......



Daniel_Zhang 发表于 2021-4-11 19:37:07

本帖最后由 Daniel_Zhang 于 2021-4-11 19:38 编辑

菜鸡选手来了{:10_245:}

list1 = ["#a", "##b", "##c", "###d", "##e", "#f"]

biggest = 0
list2 = []
list3 = []
str1 = "."
for each in list1:
    # print(each.count('#'))
    if biggest < each.count('#'):
      biggest = each.count('#')
      list2.append(0)

list2 = 1
list3.append(), list1.lstrip('#')])
for each in range(1, len(list1)):
    count = list1.count('#')
    count1 = list1.count('#')
    if count > list1.count('#'):
      for every in range(count-1, len(list2)):
            list2 = 0
      list2 += 1
    else:
      list2 += 1
      for every in range(count1, len(list2)):
            list2 = 0
    # print(list2)
    num_list_new = list(map(lambda x: str(x), list2))
    list3.append(), list1.lstrip('#')])

for each in list3:
    print(each)


hrp 发表于 2021-4-11 19:57:41

data_in = ["# a", "## b", "## c", "### d", "## e", "### f", "# g", "## h"]

def title_sn(array):
    sn_list, title_struct = [], []
    for sp_title in array:
      sp, title = sp_title.split()
      len_sn, length = len(sn_list), len(sp)
      if len_sn < length:
            sn_list.append(0)
      elif len_sn > length:
            del sn_list
      sn_list += 1
      title_struct.append([".".join(str(n) for n in sn_list), title])
    return title_struct

print(title_sn(data_in))

柿子饼同学 发表于 2021-4-11 21:49:16

Daniel_Zhang 发表于 2021-4-11 19:37
菜鸡选手来了

我硬是没想到{:10_266:}

柿子饼同学 发表于 2021-4-11 21:49:47

hrp 发表于 2021-4-11 19:57


{:10_275:}厉害厉害

qiuyouzhi 发表于 2021-4-11 22:11:13

草草撸了一个
lst = ["#a", "##b", "##c", "###d", "##e", "###f", "#g", "##h"]

def func(lst):
    res = []
    cnt =
    for i in range(len(lst)):
      n = lst.count('#')
      cnt += 1
      cnt = * (len(lst) - n)
      res.append(['.'.join(map(str, cnt[:n])), lst.replace('#', '')])
    return res

print(func(lst))
明天用 Golang 写一个

阿奇_o 发表于 2021-4-11 22:55:37

qiuyouzhi 发表于 2021-4-11 22:11
草草撸了一个

明天用 Golang 写一个

大佬,可以 再 草草 注释一下么。。
{:10_257:}

Daniel_Zhang 发表于 2021-4-11 23:27:26

qiuyouzhi 发表于 2021-4-11 22:11
草草撸了一个

明天用 Golang 写一个

给大佬的代码加个注释

真的,太强了,我啥时候也能这么厉害{:10_266:}

lst = ["#a", "##b", "##c", "###d", "##e", "###f", "#g", "##h"]


def func(lst):
    res = []
    cnt = # 生成一个长度为 len(lst)+1 的值为 0 的列表
    for i in range(len(lst)):
      n = lst.count('#')   # 计算每一个元素的 '#' 的个数
      cnt += 1# 个数 - 1 即为目录的长度,自增 1
      cnt = * (len(lst) - n)# 切片并赋值, n 位后面的全部变为 0
      # 获取结果, map 将列表里的前 n 项(不包含 n) 转换为 str 类型
      # lst 的 对应位置的元素替换 '#' 为 ''
      # 结果插入到 res 列表中
      res.append(['.'.join(map(str, cnt[:n])), lst.replace('#', '')])
    return res

print(func(lst))

Daniel_Zhang 发表于 2021-4-11 23:28:08

阿奇_o 发表于 2021-4-11 22:55
大佬,可以 再 草草 注释一下么。。

注释在楼上,真的太强了{:10_285:}

阿奇_o 发表于 2021-4-11 23:29:43

hrp 发表于 2021-4-11 19:57


大佬能注释一下么。。 一开始我也想到了split(),但后面就理不清规律了。。{:10_266:}

阿奇_o 发表于 2021-4-12 00:25:19

Daniel_Zhang 发表于 2021-4-11 23:28
注释在楼上,真的太强了

谢谢你的注释,还是有帮助的,虽然也花了不少时间才理解。。
其他语句还会,就 cnt += 1 这句,和 cnt 本身的长度,我难以整明白,
直到 我想到 和 代入 “平级时”、“不平级时”的情况,进行逐一推算,我才搞明白。。
平级时,n值相同(带相同个#号),就会在cnt[]相同位置+1 ,如 1.1,变 1.2;
小于其级别时,n值就会大于前一次的值(#号更多),就会在cnt[]下一个位置(或更后面的位置)+1(开始累计1),如 1.2,变1.2.1,或 1.2 变 1.2.0.1

感谢!
{:10_250:}

Daniel_Zhang 发表于 2021-4-12 00:45:46

本帖最后由 Daniel_Zhang 于 2021-4-12 00:48 编辑

阿奇_o 发表于 2021-4-12 00:25
谢谢你的注释,还是有帮助的,虽然也花了不少时间才理解。。
其他语句还会,就 cnt += 1 这句, ...

是这样的,

比如一级标题

2

那么此时 n 的值 = 1,因为 count 到了一个 '#'

但是你修改的是 cnt, cnt 自增 1

所以是 cnt +=1

二级标题同理,

2.1

在 2.0 的基础上, 也就是 cnt = 的基础上, cnt 自增 1

此时 n = 2 所以是 cnt +=1

阿奇_o 发表于 2021-4-12 01:31:22

本帖最后由 阿奇_o 于 2021-4-12 01:44 编辑

Daniel_Zhang 发表于 2021-4-12 00:45
是这样的,

比如一级标题


是的,的确是这样子,^_谢了

孤独的嫖客 发表于 2021-4-12 07:21:20

本帖最后由 孤独的嫖客 于 2021-4-12 07:23 编辑

各位都太强大了,这样,采纳我会再预留一些时间方便各位大神优化自己的代码
最好对代码有所注释,这也是程序员的基操
测试字符串以这个为准
data=['# 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']因为目前大部分代码都达到了能直接执行获得最终目标的结果,但是单纯的依据时间排序来采纳不甚公平,所以设置了一些采纳依据条件:
采纳最佳答案依据:
[*]能够运行代码得到准确的目标结果
[*]有清晰明了的注释
[*]代码足够优雅(在能方便阅读代码的前提下,代码行数越少越好)
[*]如果代码都不分上下,则依据leecode计算代码的内存开销,越小越好

20鱼币虽然不多,但是能同台竞技一把,也是难得的体验,祝各位大神能够群雄逐鹿,马到成功!

hrp 发表于 2021-4-12 08:11:24

阿奇_o 发表于 2021-4-11 23:29
大佬能注释一下么。。 一开始我也想到了split(),但后面就理不清规律了。。

跟其他鱼油的答案差不多的方法。
我在上班就不写注释了{:10_245:}

Stubborn 发表于 2021-4-12 11:40:53

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

思路,首先,我们遍历的过程中只会有三种情况:
1.递增层级 # -> ##
2.同层级    # -> #
3.新层级    ## -> #
我们只要记录上一次处理的数据,就可以知道当前处理的数据是一上哪三种情况。根绝每种情况,做不同的操作,实现起来没有什么困难的。

看评论好了漏了 ##a ###b ##c同层不连续了。
这样的话,我觉得更加简单一点, 以 # 开始和结束一轮,用字典记录每个层级的处理状态,当前遍历的数据,只和同层级的有关系

还有一个疑问,输入会以 ## 开始吗?

阿奇_o 发表于 2021-4-12 11:49:18

本帖最后由 阿奇_o 于 2021-4-12 20:12 编辑

昨晚基本看懂大佬的“草草代码”,今天回测了一下,发现还有个“非连续的平级关系”没注意到,呵呵
下面 我稍微优化一下(基本逻辑还是大佬的),并加上注释,欢迎大家指点 ^_
#lst = ['#a', '##b', '##c', '###d', '##e', '###f' ]
lst = ['# a', '## b', '## c', '### d', '## e', '### f' ]#之前没注意题目原本带空格,现加上,后面转换时,对应加上了 .strip()方法
def func(lst):
    res = []                  # 存储最终结果
    cnt = * 10            # cnt用来存储和计算 每个元素里#的规律;
                              # cnt的长度,意味着可以允许标题有多少级别(多少个#)
    for v in lst:
      n = v.count('#')
      cnt += 1         # 累计+1 该元素 在各级别上 的值,
                              # 如 '#a' 是在 cnt 上记1,即 一级标题记1,则 cnt =
                              # '##b'则是在cnt上+1 ,于是 cnt =
                              # '##c' 也是在cnt上+1 (与前一个平级),故此时 cnt =
                              # …… 如此循环下去

      cnt = * len(cnt)      # 处理非连续的平级关系,如这里 '###d' 和 '###f' 之间隔着'##e', 需要先清空 '###d'在cnt的值,让它重新计数+1
                                          # 不然,从'##e'到'###f',会直接从 '1.3'跳到了 '1.3.2',因受到了'###d'的影响,故需清空。
      res.append(['.'.join(map(str, cnt[:n])), v.replace('#', '').strip()])   # 转换一下变成题目要求的格式,并存到res中
    return res

print(func(lst))

qiuyouzhi 发表于 2021-4-12 17:55:21

阿奇_o 发表于 2021-4-12 11:49
昨晚基本看懂大佬的“草草代码”,今天回测了一下,发现还有个“非连续的平级关系”没注意到,呵呵
下面...

蛤? 我测试了下我的代码,貌似并没有问题

Daniel_Zhang 发表于 2021-4-12 18:04:33

孤独的嫖客 发表于 2021-4-12 07:21
各位都太强大了,这样,采纳我会再预留一些时间方便各位大神优化自己的代码
最好对代码有所注释,这也是程 ...

退出挑战,自知不敌在座的诸位大佬{:10_266:}

qiuyouzhi 发表于 2021-4-12 18:47:56

Python 版(带注释):
data=["# 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 func(lst):
    res = [] # 用于存放结果
    cnt = # 用于存放前缀层级
    for i in range(len(lst)):
      n = lst.count('#') # 统计前缀数量
      cnt += 1 # 对应位置加一
      cnt = * (len(lst) - n) # 对应位置后面的都清零, 因为层级是连续的,也就是说,
      # a, ## b, ### c ## d ### e这个 e 是属于 d 的, 所以结果应是 1.2.1, 而不是 1.2.2
      # res.append(['.'.join(map(str, cnt[:n])), lst.replace('#', '').strip()])
      # 这种方法保险,但貌似并没什么用, 还不如下面那种
      res.append(['.'.join(map(str, cnt[:n])), lst[-1]]) # 把层级拼接起来,并放入标题名称
    return res

print(func(data))

Golang 版:

由于思路和 Python 版 一样, 这里就不写注释了

package main

import (
        "fmt"
        "strings"
        "strconv"
)

func to_string(a []int) []string {
        res := make([]string, len(a))
        for i := 0; i < len(a); i++ {
                res = strconv.Itoa(a)
        }
        return res
}

func fn(a []string) ([][]string) {
        res := [][]string{}
        tmp := []string{}
        var cnt []int = make([]int, len(a) + 1)
        // 初始化 cnt, 用于统计层级
        for i := 0; i <= len(a); i++ {
                cnt = 0
        }
        for i := 0; i < len(a); i++ {
                n := strings.Count(a, "#")
                cnt += 1
                for j := n; j < len(a); j++ {
                        cnt = 0
                }
                tmp = to_string(cnt)
                res = append(res, []string{strings.Join(tmp[:n], "."), strings.TrimSpace(strings.Replace(a, "#", "", -1))})
        }
        return res
}

func main() {
        res := fn([]string{"# 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"})
        fmt.Println(res)
}
页: [1] 2
查看完整版本: [面试题]难度中级,来挑战一下吧