代码训练
JerryZengZ
这个作者很懒,什么都没留下…
展开
-
爬虫前行中(datawhale task2)
本次需要了解bs4库的使用,xpath,正则表达式并实现案例bs4库的使用Beautiful Soup 是一个HTML/XML 的解析器,主要用于解析和提取 HTML/XML 数据。 它基于HTML DOM 的,会载入整个文档,解析整个DOM树,因此时间和内存开销都会大很多,所以性能要低于lxml。 BeautifulSoup 用来解析 HTML 比较简单,API非常人性化,支持CSS选择器、...原创 2020-04-23 17:03:14 · 277 阅读 · 0 评论 -
剑指offer(替换空格)
继续刷剑指offer,第二题,替换空格题目:请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。解题:Java中,可以利用StringBuffer的特性,其中有很多方法可以调用:1、toString();2、charAt();3、replace();4、length();5、...原创 2020-02-25 12:25:57 · 143 阅读 · 0 评论 -
剑指offer(二维数组中的查找)
发现之前刷的题又忘记了好多,决定重新再刷一遍。先从剑指offer开始吧!!!!第一题,二维数组中的查找。题目表述:在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。这个题目的解题方法就是从右上角开始往左和往下两边遍历,仔细一想,好想是变形后的二分查...原创 2020-02-24 14:27:23 · 129 阅读 · 0 评论 -
LeetCode探索之旅(4)
今天继续刷LeetCode,第13题,将罗马数字转换为整型数。分析:罗马数字中有几个标志数,一种简单的办法是通过遍历字符串中的每位,采用switch的方法进行转换,这种方法在遍历中的每一位都要判断,会浪费计算时间,如果采用map的方法,在判断之前就建立罗马数字与整型数之间的映射关系,就能节省很多计算时间了。例外一个问题是罗马数字中的4和9表示方法的不同,如果每次转换的时候要判断的时候要找到下...原创 2019-01-24 10:16:03 · 134 阅读 · 0 评论 -
LeetCode探索之旅(5)
每日一题:今天刷LeetCode第14题,找出最大的公共前缀,失败则返回空。分析:输入的是一个容器,为了减少计算,设置的判断条件越多,时间越少,可能存在输入为空,输入只有一个字符串,最后判断的时候就是用第一个的每一位对后面每一个字符串进行比较,如果相等就添加到输出字符串中,否则就返回空。问题:1、要考虑到很多特殊情况,进行判断2、要熟悉容器的使用方法附上代码:class Soluti...原创 2019-01-25 09:48:58 · 125 阅读 · 0 评论 -
LeetCode探索之旅(0)
LeetCode刷题应该是程序猿必须经历的吧,于是开始吧!原创 2019-01-21 18:59:42 · 207 阅读 · 0 评论 -
LeetCode探索之旅(1)
#今天开始第一个题目,Two Sum 这个应该是学习语言时候的hello world,Two Sum是给定一个数组和一个整型数,求在这个数组中某两个数的和等于给定的这个整数,并输出数组中两个数的下标,题目自然是很简单,但是正在做起来的时候却没有那么容易。 ##分析题目: 通过简单粗暴的方式自然可以解决,通过两层循环,第一层遍历数组中的所有数,第二层遍历剩下的所有数,判断什么时候两个数的和等于...原创 2019-01-21 19:17:28 · 181 阅读 · 0 评论 -
LeetCode探索之旅(2)
今天写第二个题目,也选的比较简单的一个。LeetCode第七题,反转整数,例如输入346,返回643,输入-368,返回-863。分析问题:这个题目其实就是将一个整数分开成一位一位,然后反过来合并。其实最开始有的想法是将整数中每位求出并放入数组中,然后再将数组进行前后调转,最后得到输出结果。但是很显然这样必须牺牲掉一部分内存空间,看了网上很多例子后,发现其实可以将存入数组这一步省略掉,时间复...原创 2019-01-22 10:45:41 · 80 阅读 · 0 评论 -
LeetCode探索之旅(6)
休息两天,今天继续刷LeetCode第20题,有效的括号,这是一个典型的数据结构的题目,判断括号使用是否正确。分析:判断括号使用是否正确,使用栈,遍历字符串中所有字符,遇到左括号,就进栈,遇到右括号,就出栈。如果互相不匹配,就返回false,否则,返回true。但是在判断左右是否匹配的时候,可以使用if判断语句加上&&,但是这样毕竟不易阅读,可读性差,这时使用map映射就可以简...原创 2019-01-28 11:30:29 · 141 阅读 · 0 评论 -
LeetCode探索之旅(3)
第三天刷LeetCode,坚持!加油!今天刷第九题,判断一个整数是否为回文数,例如输入121,输出true,输入-121,输出false;分析:首先这个应该是很常见的一个简单题,看到这个题目的时候第一反应还是用数组、或者容器之类的牺牲空间的情况下来解决这个问题,这个思想其实应该改变一下了。看到网上的一个题目讲解是不能借助其他空间,虽然题目没有给出,但是这个题目确实可以不借助其他空间来解决。因...原创 2019-01-23 10:30:03 · 169 阅读 · 0 评论 -
LeetCode探索之旅(14)-58求最后的单词长
今天继续刷LeetCode,第58题,求给定的一句英文中,最后一个单词的长度。分析:显然,从英文字符串的末尾开始从后往前遍历,如果不是空格就累计加一,直到遇到空格的时候就结束遍历,返回累计值,就是最后一个单词的长度。题目很简单,但是要考虑几种特殊情况下的判断。首先是只有一个单词的时候,没有空格出现;第二种情况是,最后一个单词后面存在空格的时候;第三种情况是,没有单词、或者全是空格的情况。问题...原创 2019-02-21 15:07:19 · 91 阅读 · 0 评论 -
LeetCode探索之旅(15)-66加一
继续刷LeetCode,第66题,对一个正整数进行加一。分析:输入的正整数是用容器来表示每个位的,所以可以从最后一位往前遍历,进行加一,碰到加一后的结果为10的时候就,往前进一位,继续加一,直到第一位。如果出现加一后还是为10,就插入一位。问题:1、考虑特殊情况,出现0、129、999等;附上代码:class Solution {public: vector<int&g...原创 2019-02-21 18:10:25 · 89 阅读 · 0 评论 -
LeetCode探索之旅(22)-101对称二叉树判断
继续刷LeetCode,第101题,判断给定的一个二叉树是否为对称二叉树。分析:这个题目也是典型的递归的应用,不过要注意的是判断的条件。通过递归调用,比较根节点的左右子树的值是否相等,然后比较左子树的右孩子是否等于右子树的左孩子,再比较左子树的左孩子是否等于右子树的右孩子。这样递归的遍历所有节点,出现不等的时候就返回false,否则直到所有节点值对应相等,就返回true。问题:1、递归的方...原创 2019-02-27 14:48:41 · 104 阅读 · 0 评论 -
LeetCode探索之旅(23)-104二叉树的深度
继续刷LeetCode,第104题,求二叉树的深度。分析:使用递归的方法,遍历左右两个孩子节点,判断哪个较大,就返回其加一。问题:1、求二叉树的深度的方法。附上代码:/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * Tr...原创 2019-02-27 16:06:41 · 135 阅读 · 0 评论 -
LeetCode探索之旅(24)-107层次遍历二叉树
今天继续刷LeetCode,第107题,层次遍历二叉树,并自底向上输出。分析:可以借助队列来进行层次遍历二叉树,但是题目是使用容器,因此,可以通过递归的方法,遍历二叉树。先写一个函数创建容器,再执行一个函数用来遍历二叉树。这个函数用做递归调用每一层的所有节点。问题:1、容器的使用,可以是push_back,也可以是vector[n];2、容器使用前得先申明一个空间,但是这样会占用部分内存...原创 2019-02-28 10:10:28 · 108 阅读 · 0 评论 -
LeetCode探索之旅(25)-108平衡二叉树
继续刷LeetCode,第108题,输入一个从小到大的有序表,建立一个平衡二叉树,注:该二叉树并不唯一。分析:既然给定的是有序表,那么就可以通过类似二分查找的方式,中间值,然后作为根节点。然后递归到左右子树中,再寻找中间位置的数,作为根节点。最后输出二叉树。问题:1、给二叉树赋值的时候得先创建二叉树的节点。2、考虑为空的情况;附上代码:/** * Definition for a ...原创 2019-02-28 11:11:02 · 133 阅读 · 0 评论 -
LeetCode探索之旅(7)
寒假结束,今天开始进入学习状态,现在到LeetCode21题,将两个有序链表进行合并,这个应该是数据结构必会的一个题目。分析:这个题目简单,但是判断条件比较多,需要考虑周到;首先判断两个输入链表是否为空,都会空的话,就返回空指针,其中一个为空,就返回另外一个。接下来从头开始遍历两个链表,比较大小,哪个小就连接到新的链表尾部,并向后移动一位,直到出现一个链表为空。最后判断哪个链表先为空就将令一个...原创 2019-02-18 19:56:42 · 94 阅读 · 0 评论 -
LeetCode探索之旅(8)
今天继续刷LeetCode,第26题,去掉有序表中重复的元素,不能花费额外的内存。分析:既然是有序表,那么就可以将第一个最为对比元素,遍历后面所有的元素,如果不相等就将该元素赋值给参考元素后一位,并令该元素为新的参考元素,相等就继续向后遍历。另外注意,最后输出的是不相等的个数,所以需要统计不相等的情况有几次。问题:1、容器的使用和数组的使用类似,用nums[i]可以查找到任意一个元素;2...原创 2019-02-19 10:51:02 · 91 阅读 · 0 评论 -
LeetCode探索之旅(9)
继续刷LeetCode,第27题,去掉给定数组中的等于k的所有元素,并将剩余的返回。分析:这个题目和26题类似,通过将数组中每个元素与k进行比较,如果不相等就加入新的数组,相等就继续向后遍历。其中加入到新的数组中的第几个不同值就赋值给数组中第几个位置上,不能使用新的内存。最后统计与K不同的元素个数,并返回其值。问题:1、注意返回的值的含义,是数组中的前几个,而不是整个数组附上代码:cl...原创 2019-02-19 15:15:19 · 63 阅读 · 0 评论 -
LeetCode探索之旅(10)
继续刷LeetCode,第28题,求一个字符串在另一字符串中的起始位置分析:暴力解决的办法是,将该字符串与另外一个字符串每个位置进行比较,如果相等,就继续比较两者后续位,如果不相等,就退出,从下一位开始继续比较。这样花费的时间会很多,改进的办法是,减少比较次数,只比较两个字符串长度差的个数次。另外,这个也可以用KMP算法,以减少比较次数。问题:1、特别注意下标的设置2、各种条件下的判断...原创 2019-02-19 17:55:00 · 101 阅读 · 0 评论 -
LeetCode探索之旅(11)
今天继续刷LeetCode,第35题,给定一个数,找到它在有序表中的位置,如果不存在,返回插入位置,使得仍然有序。分析:这个题目首先是查找,查找成功,则返回该位置下标,查找失败,就插入,并返回插入位置。可以采用直接遍历的方式,这样时间开销应该会大一点。既然是有序表,那么就可以采用二分查找的方式,加快查找速度,一但查找成功就返回下标,如果不成功就返回插入位置,这样节省很多时间。问题:1、二分...原创 2019-02-20 10:11:08 · 95 阅读 · 0 评论 -
LeetCode探索之旅(12)-报数
继续刷LeetCode,第38题,报数。第一次为“1”,第二次为一个一,也就是“11”,第三次为两个一,也就是"21",第四次为一个二,一个一,也就是"1211",这样依次下去。题目输入n在0到30之间,输出为报的数,表示为一个字符串。分析:该题类似于递归求解,已知第一次为“1”,递归求出第二次、第三次、、、第n次。因此可以采用两种方法,一种方法是递归调用函数,求解结果。第二种方法是用循环语句...原创 2019-02-20 15:49:09 · 115 阅读 · 0 评论 -
LeetCode探索之旅(16)-67二进制数相加
今天继续刷LeetCode,第67题,求两个二进制数的和。分析:输入的两个二进制数的字符串,要求和的时候,首先得将两个二进制转换为十进制,然后将两个十进制进行相加运算,最后将结果再转换为二进制,最后添加到输出字符串中。那么必须从字符串的最后一位开始,从后往前遍历,如果大于等于2的时候,就向前一位进1。问题:1、字符串的输出形式,是往前添加,不是往后;2、注意两个字符串长度不等的情况;3...原创 2019-02-26 10:45:27 · 280 阅读 · 0 评论 -
LeetCode探索之旅(13)-最大子序列
继续刷LeetCode第53题,求一个给定数组中子序列和的最大值。分析:数组中子序列求和有一个规律,就是加上后面一个数后,得到的结果小于前面的数的和,那么这时增加的这个数只会使结果变小,因此就可以排除前面的数,重新在后面开始新的一轮计算。不断迭代查找到最后一个数,其中得到的数的和没有减少时,就是最大的子序列和。问题:1、特殊情况考虑不周到,例如如果全是负数的情况;2、代码的简化,可读性差...原创 2019-02-20 19:46:38 · 150 阅读 · 0 评论 -
LeetCode探索之旅(17)-69求根号
继续刷LeetCode,第69题,求一个非负数的根号。分析:求根号的时候,自然是从1开始,平方是否等于所给数,不然就加一,继续求平方,这样其实是相当于从头到尾遍历查找有序表。刚刚开始写的代码就是这样,最后运行时间过长,虽然节省了一半的时间(只需要找到一半的位置即可)。为了缩减查找效率,可以采用二分查找的方式,快速找到。问题:1、抽象问题的方法,该题目可以抽象为查找问题;2、附上第一次代...原创 2019-02-26 15:25:59 · 482 阅读 · 0 评论 -
LeetCode探索之旅(18)-70爬楼梯
继续刷LeetCode,第70题,求一次只能爬一阶或者两阶台阶的时候,总共有多少种情况可以到达第N阶台阶。分析:这个是很经典的一个题目,可以有两种方法来解决,一种是通过递归调用,结果等于前两次结果的和;第二种是通过循环的方式,第一阶与第二阶给定,第三阶开始由前两次的结果求和,直到第N阶。采用的方法可以是通过两个临时变量存储前两次的结果;或者通过容器的方式,将每次的结果保存,再到达目标的时候提取...原创 2019-02-26 16:29:12 · 123 阅读 · 0 评论 -
LeetCode探索之旅(19)-83去重
继续刷LeetCode,第83题,去掉链表中重复值的节点。分析:从前往后遍历,如果后面一个节点的值等于该结点的值,就将指针指向后面一个节点,否则往后继续遍历,直到为空的时候。问题:1、考虑特殊情况,为空的时候,如何判断;附上代码:/** * Definition for singly-linked list. * struct ListNode { * int val;...原创 2019-02-26 17:02:43 · 101 阅读 · 0 评论 -
LeetCode探索之旅(20)-88合并两个有序表
继续刷LeetCode,第88题,合并两个有序表。分析:合并两个有序表,添加到第一个有序表中,可以从前往后遍历,但是这样会出现经常要移动元素的问题,因此,采用从后往前遍历,将最大的赋值给最后一位,接着下一位,以至于将其中一个全部遍历完。最后判断是否第二个有序表全部比较完,则继续添加到第一个有序表的前部。问题:1、采用容器的方式存储的时候,可以像类似数组一样访问每一位,也可以动态的增加数组长...原创 2019-02-26 21:08:41 · 159 阅读 · 0 评论 -
LeetCode探索之旅(21)-100判断两棵树是否相同
今天继续刷LeetCode,第21题,判断两棵树是否相等。分析:采用递归的方式,通过中序遍历,遍历到二叉树的所有节点,包括叶子节点。然后判断两棵树中对应位置的值是否相等,不相等就返回false,知道所有节点值都相等,就返回true。问题:1、考虑树为空的情况;2、递归调用的写法;附上代码:/** * Definition for a binary tree node. * str...原创 2019-02-27 09:40:29 · 189 阅读 · 0 评论 -
LeetCode探索之旅(33)-125有效的回文数或字母
继续刷LeetCode,第125题,判断一个字符串是否是有效的回文数,其中字母和数字为有效。分析:通过从前往后遍历的方式,可以首先剔除掉无效的符号,然后再判断是否回文,判断是否回文的时候可以通过前后两个指针的值对比大小,直到两个指针指向中间位置。但是这个办法需要占用空间,因此也可以在前后两个指针遍历的时候,判断是否符号有效,无效的话继续遍历,有效的话就比较大小,这样可以节省空间。问题:1、...原创 2019-03-08 15:18:41 · 117 阅读 · 0 评论 -
LeetCode探索之旅(26)-110平衡二叉树
今天继续刷LeetCode,第110题,判断给定的一个二叉树是否是平衡二叉树。分析:根据平衡二叉树的定义可知,第一步是计算二叉树中节点的左右节点的深度,然后判断两者之差是否大于1,则判断为不平衡,否则继续判断其他节点。如果可以一边计算二叉树的深度,一边判断是否平衡,这就需要从最下一层开始,向上遍历,这样显然不符合二叉树的遍历顺序。因此,只有从根节点开始,从上到下不断遍历的同时计算左右子树的深度...原创 2019-03-06 15:07:58 · 88 阅读 · 0 评论 -
LeetCode探索之旅(27)-111求二叉树的最小深度
继续刷LeetCode,第111题,求一个二叉树的最小深度,深度为从根节点到叶子节点的路径长度。分析:这个题目同样是求数的深度,但是只需要求解根节点的左右子树的深度,然后比较谁比较小,就输出。但是需要注意的是,如果一个二叉树比较特殊,所有节点只有左孩子,或者只有右孩子的时候,判断深度的时候不是直接按照计算两个子树的深度中最大值,还需要判断其中一个为空的时候,就认为另外一个的深度是整个的深度。...原创 2019-03-06 16:01:30 · 79 阅读 · 0 评论 -
LeetCode探索之旅(34)-136单个数
今天继续刷LeetCode,第136题,求一个全是双数的数组中唯一的一个单数。分析:1、这个题目的第一种方法就是,通过暴力解决,每遍历到一个数,就将这个数和后面所有的数进行比较,如果存在相等的情况,那么就继续循环,如果没有相等的,就认为这个数是那个单数,这种办法不需要占用空间,但是时间复杂度是O(n^2),这样显然不符合题目要求。2、那么在O(n)的时间复杂度下,可以通过添加一个辅助空间,每...原创 2019-03-09 09:43:04 · 95 阅读 · 0 评论 -
LeetCode探索之旅(35)-141链环
继续刷LeetCode,第141题,判断一个链表中是否存在环。分析:这个题目是判断一个链表中是否存在环,通过双指针来遍历整个链表,其中一个指针每次只走一步,另外一个指针每次走两步,如果两个指针相遇,那么这个链表就存在环,如果第二个指针指向为空的时候,就没有环。问题:1、学会用双指针法解决问题;附上代码:/** * Definition for singly-linked list....原创 2019-03-09 10:23:26 · 75 阅读 · 0 评论 -
LeetCode探索之旅(36)-155最小栈值
继续刷LeetCode,求栈中的最小值。分析:这个是简单的栈的定义,通过添加一个最小栈,求栈中的最小值。问题:1、栈的函数应用(pop,push,empty,top等)附上代码:class MinStack {public: stack<int> data; stack<int> min_val; /** initialize your...原创 2019-03-09 10:46:41 · 92 阅读 · 0 评论 -
LeetCode探索之旅(28)-112路径和
继续刷LeetCode,第112题,求二叉树的路径和分析:这个是一个动态规划的问题,当从根节点开始向下遍历到一个叶子节点的时候,不满足给定的路径和,就回到父节点,然后遍历其他叶子节点,如果仍然不满足路径和,就再往上回溯一层,这样遍历所有到所有叶子节点后,如果仍然没有得到所给路径和,就返回false。问题:1、动态规划和回溯也是用递归来实现附上代码:/** * Definition f...原创 2019-03-06 20:11:15 · 98 阅读 · 0 评论 -
LeetCode探索之旅(29)-118杨辉三角
继续刷LeetCode,第118题,求杨辉三角二维数组,用容器表示。分析:这个题目需要用循环的方法,从上往下一层一层的计算。每层中的数都等于两肩上的数的和,并且首尾赋值1。问题:1、注意容器的定义和使用;附上代码:class Solution {public: vector<vector<int>> generate(int numRows) { ...原创 2019-03-06 22:21:49 · 123 阅读 · 0 评论 -
LeetCode探索之旅(49)-190反转bit
今天继续刷LeetCode,第190题,将一个32位二进制数反转分析:既然是二进制数,那么可以通过位运算的方式解决问题。反转二进制数,可以从后往前遍历,将最后一位作为输出的第一位,最后第二位作为输出的第二位,知道遍历完所有位。问题:1、位运算的应用,与、或、非等附上代码:class Solution {public: uint32_t reverseBits(uint32_t...原创 2019-03-14 12:40:40 · 105 阅读 · 0 评论 -
LeetCode探索之旅(30)-119杨辉三角2
今天继续刷LeetCode,第119题,求杨辉三角中的第N行。分析:这个题目和上个题目类似,仍然是从上往下计算,但是每行的值都由上一行的值得到。刚开始想到的办法是,每次保存上一行的值,然后计算下一行,但是看到有更简单的办法是,从后往前计算的时候,就可以把这个位置的值重新赋值,不会影响后面的计算。问题:1、注意代码的优化,分析问题的逻辑要清晰;附上代码:class Solution {...原创 2019-03-07 16:37:51 · 158 阅读 · 0 评论 -
LeetCode探索之旅(50)-191求二进制中1的个数
今天继续刷LeetCode,第191题,求一个32位二进制数中1的个数。分析:通过二进制中每一位与1进行与操作,如果结果为1,那么二进制位为1,否则为0,累加为1的次数。问题:1、与操作的使用;2、每次需要右移一位;附上代码:class Solution {public: int hammingWeight(uint32_t n) { int sum=0;...原创 2019-03-15 09:17:50 · 126 阅读 · 0 评论