活动:
目录
由于自己进来在学习技能树的内容
现在暂位全站学习达人top1,每日一练暂位top1,1~16期学习榜均上榜用户。
说这些只是想说明以下的测评并不是主观的臆想,而是有了实践的检验。
下面我们直接进入正题。
一、内容
优点:
就现有的技能树来说,技能树的内容比较充实。技能树中图文结合得解析很好,易懂,形象。编程语言技能树较为基础,适合初学者入门学习。
再者就是python技能树有视频讲解,这一点很赞
Neo4j
OpenCV技能树
PostgreSQL
这一点PostgreSQL技能树、OpenCV技能树、Neo4j技能树等做得比较好。
不足:
不足之处就是算法技能书无法选择语言进行练习,算法技能树都是C语言的题目和题解,我看到算法技能树中的大部分题目在CSDN中都是可以搜索到其他语言的题解的,所以我希望可以添加更多语言模块。
参考资料内容质量问题:
还需要改进的就是参考资料版块了。
以下面这道题解为例。
大家第一眼的印象是什么?我第一眼的印象就是觉得很乱(对事不对人),这里应该是整数N,然后A1应该是等于A_1的,1是下标,文中数值部分出现了三次重复。这给我的第一感觉就是复制粘贴,这种重复出现的现象应该是被复制平台的防盗措施。所以大多数人可能是没心情看资料然后直接答题,打错了之后也没资料参考,不想麻烦去搜索直接继续蒙。这也是大多是题目通过率较低的原因(通过率大多在30%左右)
那么我们对图中你内容进行修改
-----------------------------------------------------
给定三个整数数组
A = [ A_1 , A _2, … A _n ]
B = [ B_1 , B_2, … B_n ]
C = [ C_1, C_2 , … C_n](下标n = 1, 2, 3....n)
请你统计有多少个三元组 ( i , j , k )满足:
- 1 ≤ i , j , k ≤ N
- A_i < B_j < C_k
输入格式
第一行:包含一个整数 N。
第二行:包含 N 个整数 A_1,A_2,…A_n
第三行:包含 N 个整数 B_1,B_2,…B_n
第四行:包含 N 个整数 C_1,C_2,…C_n
输出一个整数表示答案。
思路
我自己想的时候是枚举 A 组中的每一个元素,然后B 和 C中的边界点,然后相乘。但是自己想错了, 因为 B和C 有关系,所以不能直接相乘。
那么其实可以枚举 B中的每一个点,再根据 B_i 找到 A, C中小于B_i 的数 和 大于B_i 的数 ,因为如此分,A和 C 就是独立存在,可以用乘法原理
如果暴力解决,那么必然是需要 O(n^3)的复杂度枚举三个点再判断其大小,必定超时
所以可以想办法优化,可以看出我们找小于和大于B_i的数时,可以按照以下步骤
- 排序 + 二分找到边界点
- 前缀和求小于 b i b_i bi 的个数和 大于 b i b_i bi 的个数
- 双指针
--------------------------------------------------------------------
这样修改也不能说有多好,但是基本是可以看得清晰
原文链接:递增三元组
习题无解析问题:
在学习技能树后进行答题时会遇到一些参考资料之外的题目,我们学习技能树大多时先学习参考资料,接着做练习来巩固所学的知识,但是所做的题目却没有解析。虽然设有讨论区,但是讨论区一般活跃度不高,自己做题后可能不知道自己选错错哪了,选则对了但也不懂为什么对。所以我觉得有必要在做题后提供一份选项的错误解析。
二、产品功能
题目练习问题:
有些题目得选项都是错的,存在bug
#-------------------------------------A import os import hashlib import requests import asyncio def url_file_name(url): ext = os.path.splitext(url)[-1] hash_name = hashlib.md5(url.encode('utf-8')).hexdigest() return hash_name+ext def download_img(img_url): img_bytes = requests.get(img_url).content file_name = url_file_name(img_url) output = f'/tmp/{file_name}' with open(output, 'wb') as f: f.write(img_bytes) print(f'img downloaed at: {output}') await asyncio.sleep(1) def test(): urls = [ "https://img-ask.csdnimg.cn/upload/1623844642974.jpg", "https://img-ask.csdnimg.cn/upload/1623844642974.jpg", "https://img-mid.csdnimg.cn/release/static/image/mid/ask/754909759626128.jpg", "https://img-ask.csdn.net/upload/201510/22/1445491909_384819.jpg", ] tasks = [download_img(url) for url in urls] loop = asyncio.get_event_loop() loop.run_until_complete(tasks) loop.close() if __name__ == '__main__': test() #---------------------------------------------B import os import hashlib import requests import asyncio def url_file_name(url): ext = os.path.splitext(url)[-1] hash_name = hashlib.md5(url.encode('utf-8')).hexdigest() return hash_name+ext async def download_img(img_url): # 这里和A不同 img_bytes = requests.get(img_url).content file_name = url_file_name(img_url) output = f'/tmp/{file_name}' with open(output, 'wb') as f: f.write(img_bytes) print(f'img downloaed at: {output}') await asyncio.sleep(1) def test(): urls = [ "https://img-ask.csdnimg.cn/upload/1623844642974.jpg", "https://img-ask.csdnimg.cn/upload/1623844642974.jpg", "https://img-mid.csdnimg.cn/release/static/image/mid/ask/754909759626128.jpg", "https://img-ask.csdn.net/upload/201510/22/1445491909_384819.jpg", ] tasks = [download_img(url) for url in urls] loop = asyncio.get_event_loop() loop.run_until_complete(tasks) loop.close() if __name__ == '__main__': test() #---------------------------------------------------C import os import hashlib import requests import asyncio def url_file_name(url): ext = os.path.splitext(url)[-1] hash_name = hashlib.md5(url.encode('utf-8')).hexdigest() return hash_name+ext async def download_img(img_url): # 这里和A不同 img_bytes = requests.get(img_url).content file_name = url_file_name(img_url) output = f'/tmp/{file_name}' with open(output, 'wb') as f: f.write(img_bytes) print(f'img downloaed at: {output}') await asyncio.sleep(1) def test(): urls = [ "https://img-ask.csdnimg.cn/upload/1623844642974.jpg", "https://img-ask.csdnimg.cn/upload/1623844642974.jpg", "https://img-mid.csdnimg.cn/release/static/image/mid/ask/754909759626128.jpg", "https://img-ask.csdn.net/upload/201510/22/1445491909_384819.jpg", ] tasks = [download_img(url) for url in urls] loop = asyncio.get_event_loop() asyncio.wait(tasks) # 这里和B不同 loop.close() if __name__ == '__main__': test() #------------------------------------------------D import os import hashlib import requests import asyncio def url_file_name(url): ext = os.path.splitext(url)[-1] hash_name = hashlib.md5(url.encode('utf-8')).hexdigest() return hash_name+ext def download_img(img_url): # 这里和c不同 img_bytes = requests.get(img_url).content file_name = url_file_name(img_url) output = f'/tmp/{file_name}' with open(output, 'wb') as f: f.write(img_bytes) print(f'img downloaed at: {output}') await asyncio.sleep(1) def test(): urls = [ "https://img-ask.csdnimg.cn/upload/1623844642974.jpg", "https://img-ask.csdnimg.cn/upload/1623844642974.jpg", "https://img-mid.csdnimg.cn/release/static/image/mid/ask/754909759626128.jpg", "https://img-ask.csdn.net/upload/201510/22/1445491909_384819.jpg", ] tasks = [download_img(url) for url in urls] loop = asyncio.get_event_loop() loop.run_until_complete(asyncio.wait(tasks)) # 这里和A,c不同 loop.close() if __name__ == '__main__': test()
可以看到这四个选项都是不同的,但是我选的时候每个选项都选了一遍(每一段不同代码)但是没有一个是对的,我重复进行了两次,然后第二天再次做这道练习时就通过了。通过的答案和上面的是个选项的代码都不同。
我就有些搞不懂了,可以先把正确答案藏起来的吗?可能事出现了某个bug。
import os import hashlib import requests import asyncio def url_file_name(url): ext = os.path.splitext(url)[-1] hash_name = hashlib.md5(url.encode('utf-8')).hexdigest() return hash_name+ext async def download_img(img_url): img_bytes = requests.get(img_url).content file_name = url_file_name(img_url) output = f'/tmp/{file_name}' with open(output, 'wb') as f: f.write(img_bytes) print(f'img downloaed at: {output}') await asyncio.sleep(1) def test(): urls = [ "https://img-ask.csdnimg.cn/upload/1623844642974.jpg", "https://img-ask.csdnimg.cn/upload/1623844642974.jpg", "https://img-mid.csdnimg.cn/release/static/image/mid/ask/754909759626128.jpg", "https://img-ask.csdn.net/upload/201510/22/1445491909_384819.jpg", ] tasks = [download_img(url) for url in urls] loop = asyncio.get_event_loop() loop.run_until_complete(asyncio.wait(tasks)) loop.close() if __name__ == '__main__': test()
三、UI 界面
技能树入口建议:
技能树简洁的风格个人觉得很好,条目清晰。
一点小建议就是希望将python进阶技能树的入口也像移动端一样单独列出来,再手机很容易知道有python进阶技能树和容易就找到了python进阶技能树的入口。但是对于pc端来说可能不那么明显,可能找不到或是不知道还有python进阶技能树
pc端
移动:
![]()
UI内容展示形式建议:
在学习python技能树的时候我发现,有时展示的能容过长,而窗口却固定了,这就需要其他方法来移动展示的内容。
如
因为要移动到最下端才出现移动内容的滑块,对于一些较长的文章这样就显得很麻烦,所以我一般是使用鼠标中键来移动内容。
这里题的建议就是给实时显示页面添加左右移动的滑块,或者允许读者改变笔记区域的任意宽度(蓝色方框),现在虽然也可以改变笔记区域的宽度但是移到最小还是会遮挡住一部分内容。而移动端就没有这样的问题。
四、用户激励
勋章、学习榜单和活动都对用户产生了较好的激励效果。
这里要题的建议时排行时不应仅仅按照解锁的知识点来排榜单,还应加入正确率这一因素来制定榜单。因为正确率也体现了个人的学习效果,解锁知识点多少+正确率相结合则可以体现个人学习的效率,以此来排名个人感觉更加合理。
五、使用体验
个人体验来所还是不错的。
学习这些技能树学到了很多的知识,做习题初步检验了学习成果,加深了学习印象。就是还感到上诉的不足,在移动端部分技能树内容单一不够系统,可以拓展自己所学知识但是章节间的联系不强,内容较为分散,我想章节可以参考一些经典书籍的学习路线和章节排布,希望后面可以改进,增加更多技能树。
六、改进建议
综合上述的建议。
- 为算法技能树增加更多编程语言练习
- 激励更多解题博主投稿,提高参考资料的质量,严格审核抄袭行为
- 增加技能树习题的解析
- 修改选项无正确答案的bug
- 为python技能树增加独立入口
- 改进技能树资料阅读时显示遮挡问题
- 将正确率和解锁知识点数量共同作为学习榜单排名依据
- 技能树内容单一不够系统、章节间的联系不强,内容较为分散
以上就是目前想到的测评内容。