[面试题]难度中级,来挑战一下吧
本帖最后由 孤独的嫖客 于 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: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)
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)) Daniel_Zhang 发表于 2021-4-11 19:37
菜鸡选手来了
我硬是没想到{:10_266:} hrp 发表于 2021-4-11 19:57
{:10_275:}厉害厉害 草草撸了一个
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 写一个 qiuyouzhi 发表于 2021-4-11 22:11
草草撸了一个
明天用 Golang 写一个
大佬,可以 再 草草 注释一下么。。
{:10_257:} 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))
阿奇_o 发表于 2021-4-11 22:55
大佬,可以 再 草草 注释一下么。。
注释在楼上,真的太强了{:10_285:} hrp 发表于 2021-4-11 19:57
大佬能注释一下么。。 一开始我也想到了split(),但后面就理不清规律了。。{:10_266:} 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: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:44 编辑
Daniel_Zhang 发表于 2021-4-12 00:45
是这样的,
比如一级标题
是的,的确是这样子,^_谢了
本帖最后由 孤独的嫖客 于 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鱼币虽然不多,但是能同台竞技一把,也是难得的体验,祝各位大神能够群雄逐鹿,马到成功!
阿奇_o 发表于 2021-4-11 23:29
大佬能注释一下么。。 一开始我也想到了split(),但后面就理不清规律了。。
跟其他鱼油的答案差不多的方法。
我在上班就不写注释了{:10_245:} 本帖最后由 Stubborn 于 2021-4-12 12:51 编辑
思路,首先,我们遍历的过程中只会有三种情况:
1.递增层级 # -> ##
2.同层级 # -> #
3.新层级 ## -> #
我们只要记录上一次处理的数据,就可以知道当前处理的数据是一上哪三种情况。根绝每种情况,做不同的操作,实现起来没有什么困难的。
看评论好了漏了 ##a ###b ##c同层不连续了。
这样的话,我觉得更加简单一点, 以 # 开始和结束一轮,用字典记录每个层级的处理状态,当前遍历的数据,只和同层级的有关系
还有一个疑问,输入会以 ## 开始吗?
本帖最后由 阿奇_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))
阿奇_o 发表于 2021-4-12 11:49
昨晚基本看懂大佬的“草草代码”,今天回测了一下,发现还有个“非连续的平级关系”没注意到,呵呵
下面...
蛤? 我测试了下我的代码,貌似并没有问题 孤独的嫖客 发表于 2021-4-12 07:21
各位都太强大了,这样,采纳我会再预留一些时间方便各位大神优化自己的代码
最好对代码有所注释,这也是程 ...
退出挑战,自知不敌在座的诸位大佬{:10_266:} 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