鱼C论坛

 找回密码
 立即注册
查看: 620|回复: 24

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

[复制链接]
发表于 2021-4-11 18:27:09 | 显示全部楼层 |阅读模式
20鱼币
本帖最后由 孤独的嫖客 于 2021-4-11 18:31 编辑

QQ图片20210411172719.jpg

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


                               
登录/注册后可看大图



                               
登录/注册后可看大图

我愿意悬赏更多的鱼币,奈何小甲鱼不让......

QQ截图20210411182347.jpg


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2021-4-11 19:37:07 | 显示全部楼层
本帖最后由 Daniel_Zhang 于 2021-4-11 19:38 编辑

菜鸡选手来了

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

  2. biggest = 0
  3. list2 = []
  4. list3 = []
  5. str1 = "."
  6. for each in list1:
  7.     # print(each.count('#'))
  8.     if biggest < each.count('#'):
  9.         biggest = each.count('#')
  10.         list2.append(0)

  11. list2[0] = 1
  12. list3.append([str(list2[0]), list1[0].lstrip('#')])
  13. for each in range(1, len(list1)):
  14.     count = list1[each-1].count('#')
  15.     count1 = list1[each].count('#')
  16.     if count > list1[each - 1].count('#'):
  17.         for every in range(count-1, len(list2)):
  18.             list2[every] = 0
  19.         list2[count-1] += 1
  20.     else:
  21.         list2[count1-1] += 1
  22.         for every in range(count1, len(list2)):
  23.             list2[every] = 0
  24.     # print(list2)
  25.     num_list_new = list(map(lambda x: str(x), list2))
  26.     list3.append([str1.join(num_list_new[:count1]), list1[each].lstrip('#')])

  27. for each in list3:
  28.     print(each)
复制代码


截屏2021-04-11 19.38.02.png

评分

参与人数 1荣誉 +1 鱼币 +1 收起 理由
孤独的嫖客 + 1 + 1 鱼C有你更精彩^_^

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2021-4-11 19:57:41 | 显示全部楼层
  1. data_in = ["# a", "## b", "## c", "### d", "## e", "### f", "# g", "## h"]

  2. def title_sn(array):
  3.     sn_list, title_struct = [], []
  4.     for sp_title in array:
  5.         sp, title = sp_title.split()
  6.         len_sn, length = len(sn_list), len(sp)
  7.         if len_sn < length:
  8.             sn_list.append(0)
  9.         elif len_sn > length:
  10.             del sn_list[length:]
  11.         sn_list[length - 1] += 1
  12.         title_struct.append([".".join(str(n) for n in sn_list), title])
  13.     return title_struct

  14. print(title_sn(data_in))
复制代码

评分

参与人数 2荣誉 +2 鱼币 +2 贡献 +1 收起 理由
孤独的嫖客 + 1 + 1 鱼C有你更精彩^_^
Daniel_Zhang + 1 + 1 + 1 大佬,比我的精简一半

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2021-4-11 21:49:16 | 显示全部楼层

我硬是没想到
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2021-4-11 21:49:47 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2021-4-11 22:11:13 | 显示全部楼层
草草撸了一个
  1. lst = ["#a", "##b", "##c", "###d", "##e", "###f", "#g", "##h"]

  2. def func(lst):
  3.     res = []
  4.     cnt = [0 for i in range(len(lst) + 1)]
  5.     for i in range(len(lst)):
  6.         n = lst[i].count('#')
  7.         cnt[n - 1] += 1
  8.         cnt[n:] = [0] * (len(lst) - n)
  9.         res.append(['.'.join(map(str, cnt[:n])), lst[i].replace('#', '')])
  10.     return res

  11. print(func(lst))
复制代码

明天用 Golang 写一个
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2021-4-11 22:55:37 | 显示全部楼层
qiuyouzhi 发表于 2021-4-11 22:11
草草撸了一个

明天用 Golang 写一个

大佬,可以 再 草草 注释一下么。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2021-4-11 23:27:26 | 显示全部楼层
qiuyouzhi 发表于 2021-4-11 22:11
草草撸了一个

明天用 Golang 写一个


给大佬的代码加个注释

真的,太强了,我啥时候也能这么厉害

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


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

  14. print(func(lst))
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2021-4-11 23:28:08 | 显示全部楼层
阿奇_o 发表于 2021-4-11 22:55
大佬,可以 再 草草 注释一下么。。

注释在楼上,真的太强了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2021-4-11 23:29:43 | 显示全部楼层

大佬能注释一下么。。 一开始我也想到了split(),但后面就理不清规律了。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2021-4-12 00:25:19 | 显示全部楼层
Daniel_Zhang 发表于 2021-4-11 23:28
注释在楼上,真的太强了

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


感谢!

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2021-4-12 00:45:46 | 显示全部楼层
本帖最后由 Daniel_Zhang 于 2021-4-12 00:48 编辑
阿奇_o 发表于 2021-4-12 00:25
谢谢你的注释,还是有帮助的,虽然也花了不少时间才理解。。
其他语句还会,就 cnt[n - 1] += 1 这句, ...


是这样的,

比如一级标题

2

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

但是你修改的是 cnt[0], cnt[0] 自增 1

所以是 cnt[n-1] +=1

二级标题同理,

2.1

在 2.0 的基础上, 也就是 cnt = [2,0,0,...] 的基础上, cnt[1] 自增 1

此时 n = 2 所以是 cnt[n-1] +=1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2021-4-12 01:31:22 | 显示全部楼层
本帖最后由 阿奇_o 于 2021-4-12 01:44 编辑
Daniel_Zhang 发表于 2021-4-12 00:45
是这样的,

比如一级标题


是的,的确是这样子,^_  谢了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2021-4-12 07:21:20 | 显示全部楼层
本帖最后由 孤独的嫖客 于 2021-4-12 07:23 编辑

各位都太强大了,这样,采纳我会再预留一些时间  方便各位大神优化自己的代码
最好对代码有所注释,这也是程序员的基操
测试字符串以这个为准

  1. data=['# a', '## b', '## c', '### d', '### e', '### f', '## g', '### h', '# i', '## j', '## k', '### l', '#### m',
  2.           '#### n', '### o', '# p', '## q', '### r', '### s', '## t', '### u', '# v', '## w', '### x', '### y', '## z']
复制代码
因为目前大部分代码都达到了能直接执行获得最终目标的结果,但是单纯的依据时间排序来采纳不甚公平,所以设置了一些采纳依据条件:
采纳最佳答案依据:
  • 能够运行代码得到准确的目标结果
  • 有清晰明了的注释
  • 代码足够优雅(在能方便阅读代码的前提下,代码行数越少越好)
  • 如果代码都不分上下,则依据leecode计算代码的内存开销,越小越好

20鱼币虽然不多,但是能同台竞技一把,也是难得的体验,祝各位大神能够群雄逐鹿,马到成功!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2021-4-12 08:11:24 From FishC Mobile | 显示全部楼层
阿奇_o 发表于 2021-4-11 23:29
大佬能注释一下么。。 一开始我也想到了split(),但后面就理不清规律了。。

跟其他鱼油的答案差不多的方法。
我在上班就不写注释了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2021-4-12 11:40:53 | 显示全部楼层
本帖最后由 Stubborn 于 2021-4-12 12:51 编辑

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

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

还有一个疑问,输入会以 ## 开始吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2021-4-12 11:49:18 | 显示全部楼层
本帖最后由 阿奇_o 于 2021-4-12 20:12 编辑

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

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

  18. print(func(lst))
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2021-4-12 17:55:21 | 显示全部楼层
阿奇_o 发表于 2021-4-12 11:49
昨晚基本看懂大佬的“草草代码”,今天回测了一下,发现还有个“非连续的平级关系”没注意到,呵呵
下面  ...

蛤? 我测试了下我的代码,貌似并没有问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2021-4-12 18:04:33 | 显示全部楼层
孤独的嫖客 发表于 2021-4-12 07:21
各位都太强大了,这样,采纳我会再预留一些时间  方便各位大神优化自己的代码
最好对代码有所注释,这也是程 ...

退出挑战,自知不敌在座的诸位大佬
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2021-4-12 18:47:56 | 显示全部楼层
Python 版(带注释):
  1. data=["# a", "## b", "## c", "### d", "### e", "### f", "## g", "### h", "# i", "## j", "## k", "### l", "#### m",
  2.           "#### n", "### o", "# p", "## q", "### r", "### s", "## t", "### u", "# v", "## w", "### x", "### y", "## z"]

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

  15. print(func(data))
复制代码


Golang 版:

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

  1. package main

  2. import (
  3.         "fmt"
  4.         "strings"
  5.         "strconv"
  6. )

  7. func to_string(a []int) []string {
  8.         res := make([]string, len(a))
  9.         for i := 0; i < len(a); i++ {
  10.                 res[i] = strconv.Itoa(a[i])
  11.         }
  12.         return res
  13. }

  14. func fn(a []string) ([][]string) {
  15.         res := [][]string{}
  16.         tmp := []string{}
  17.         var cnt []int = make([]int, len(a) + 1)
  18.         // 初始化 cnt, 用于统计层级
  19.         for i := 0; i <= len(a); i++ {
  20.                 cnt[i] = 0
  21.         }
  22.         for i := 0; i < len(a); i++ {
  23.                 n := strings.Count(a[i], "#")
  24.                 cnt[n - 1] += 1
  25.                 for j := n; j < len(a); j++ {
  26.                         cnt[j] = 0
  27.                 }
  28.                 tmp = to_string(cnt)
  29.                 res = append(res, []string{strings.Join(tmp[:n], "."), strings.TrimSpace(strings.Replace(a[i], "#", "", -1))})
  30.         }
  31.         return res
  32. }

  33. func main() {
  34.         res := fn([]string{"# a", "## b", "## c", "### d", "### e", "### f", "## g", "### h", "# i", "## j", "## k", "### l", "#### m",
  35.                 "#### n", "### o", "# p", "## q", "### r", "### s", "## t", "### u", "# v", "## w", "### x", "### y", "## z"})
  36.         fmt.Println(res)
  37. }
复制代码

评分

参与人数 1荣誉 +1 鱼币 +1 收起 理由
孤独的嫖客 + 1 + 1

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1

GMT+8, 2021-5-13 02:08

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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