万事开头难,开始算法学习的第一步,反正也是给自己看的,所以没去博客园,csdn,无关名利,给自己记录一下学习过程。
回顾一下自己会什么。语言就会个python,数据库会mysql,mongodb,redis,会爬虫,框架会个scrpay。科班出身,那么我还了解软工知识,做需求分析分析,面向百度写报告还是会的,了解大数据方向的知识,会一点数据分析,常用算法都听说过,刚刚好找不到工作。爬虫这个岗位太难找了。
开始第一天的学习,从算法开始,首先找刷题网站,以前也刷过力扣,三五十道差不多,无所谓,号找不到了,在注册一个,百度一下什么是算法
算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。如果一个算法有缺陷,或不适合于某个问题,执行这个算法将不会解决这个问题。不同的算法可能用不同的时间、空间或效率来完成同样的任务。一个算法的优劣可以用空间复杂度与时间复杂度来衡量。
不清除,不明白,无所谓。点击LeetCode 探索,从最基础的开始,初级算法,开始再次入门。
数组
第一题, 从排序数组中删除重复项
给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。
不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。
说一下有哪些问题,就会用个python,别的语言C还能写个hello world,java勉强能读一下
def removeDuplicates(self, nums: List[int]) -> int:
大致也能理解一下,定义了一个方法,传入一个参数,nums,应该是一个列表,由整形组成的。
刚开始就遇到问题,-> 什么意思,没见过啊。百度。明白了,无所谓,是个注释,->:标记返回函数注释。
开始思考,python中有数组这种东西吗,
回忆加百度,python共有六个基本数据类型,数字,字符串,列表,元组,集合,字典。
没找到数组,观察,基本二字,百度什么是数组,数组是用于储存多个相同类型数据的集合。
看一下题目,nums:LIst[int]。嗯,没什么问题。那就是列表去重。
最简单的方法,列表转集合再转列表,
nums = list(set(nums))
利用集合的互异性,出现问题,集合还有无序性。要求保持顺序。
方法二,创建一个空列表,对nums遍历,不在空列表的放入,得到一个有序的新列表
a = []
for i in nums:
if i not in a:
a.append(i)
直接写代码是有点费劲啊,以后截图吧,理论上没问题,但是没审题,原地删除重复的元素,不能建立新的空列表。
方法三,遍历,匹配
不出意外的报错了,对列表遍历时改变了列表的长度, list index out of range列表索引超出范围,len(a)的大小变化了。
改BUG吧,
没改明白。
找了一下午,没找到,发现一个排序方法
sorted(set(nums),key=nums.index)
日了狗了,编译器能好使提交就完犊子???????????
读题读题读题!!!!啊啊啊!
不要拷贝!!!虽然没明白是什么原理,但是读题啊,不要做任何拷贝
至少列表变成集合肯定是有新对象建立。
这道题还有一个坑,结果要返回数组长度,??????什么鬼东西,
也是set方法将数组转化为集合,利用集合无序性,sorted方法添加参数key=nums.index,依照原来的顺序排序。
读题,有序数组,那么重复元素扎堆聚集在一起,i与i+1对比就行
正常操作一个有序数组去除,我和下一个不重复,那么我就是不重复的。
首先定义一个i为0,while循环,为什么i必须小于len(nums)-1,防止数组越界,如果不减1,判断下一个时最后一个nums【i+1】越界。
如果我等于下一个,那么我能力,否则我就是下一个。
还可以,反正弄出来了,但是这个只能用于有序,无序不行,上面的集合排序好使没毛病。
写个这个真费劲,继续吧。这头开的不咋地啊。