数据结构和算法
kaibingwang
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
查找单链表中的环及入口
题目:如果一个链表中包含环,如何找出环的入口节点?思路:判断是否有环:定义两个快慢指针,p1指向头结点,p2指向头结点的下一个节点,如上图中(a)所示;p1和p2同时往后移动,但速度不一样,p1以每次移动一个节点的速度,p2以每次移动2个的速度往后移动,最后p1和p2会相遇,则存在环,如上图(b)所示。查找环入口:在上面基础上,p1和p2相遇的节点“9”在环内,可以计算出环的节点总数.查找环入口同样定义两个快慢指针,p1指向头结点,p2在头结点上往后移动环节点总数,如上图原创 2021-08-20 14:42:29 · 520 阅读 · 0 评论 -
查找链表倒数第n个节点
题目:查找单链表中倒数第n个节点数据思路:考虑到时间复杂度,不允许对链表进行两次遍历操作来完成上述需求。该问题可通过定义两个快慢指针,快指针p1和慢指针p2,倒数第n个,p1最开始指向头节点,向后移动n-1个节点,到达如图a所示的地方,p2指针最开始指向头结点p2,如图b所示,p1和p2同时向后移动,当p1到达链表尾部时,停止,此时p2指向的节点即为倒数第n个节点。代码:/***查找倒数第n个节点*@paramlinkedNodeOne*@parami...原创 2021-08-18 11:02:26 · 1098 阅读 · 0 评论 -
数组中出现超过一半的数字
题目:数组中出现超过一半的数字数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如,输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。思路:一个数组中某个数字超过一半的值,排序后位于数组中间的数字一定就是n出现次数超过数组长度一半的数字。所以可以对该数组进行快速排序,如上图所示,分区数选择最后一个元素2,分区完成后,如图b所示,分区数在5的位置,大于数组中间的索引4,则说明在左边,对左边的数组进行分原创 2021-08-11 14:37:43 · 386 阅读 · 0 评论 -
算法-快速排序
题目:对一个数组{11,8,3,9,7,1,2,5}进行快速排序。思路:全局思路:如上示意图所示,选取最后一个函数作为分区元素,经过具体的分区后,把该数组分成两部分,如(b)所示,左边的一部分小于5,右边的一部分大于5。再分别对左边的和右边的数组进行分区,分区后如(c)所示;再对9左边的{7,8}数组进行分区,导致就完成了整个数组的分区...分区...再分区的操作。分区函数实现思路:如上图所示,定义两个索引i和j,i指向已处理的数据区域,j用作向后遍历数组,开原创 2021-08-10 15:59:49 · 129 阅读 · 0 评论 -
旋转数组中的最小数字
题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如,数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。思路:由上图可知,旋转数组是由两个有序的数组来组成的,阴影和非阴影两部分对应两个有序的数组。定义两个索引p1和p2,分别指向数组的第一个和最后一个元素。 此时p1为0,p2为4,计算middle=(p1+p2)/2的值为2,值为5,和p1、p2所对应的值3和2进行对比原创 2021-08-09 13:42:28 · 136 阅读 · 0 评论 -
字符串替换
替换空格:请实现一个函数,把字符串中的每个空格替换成“%20”,例如,输入“We are happy.”,则输出“We%20are%20happy.”。思路:原始字符串转换成字符数组,构建一个新的字符串数组,长度大小为原始数组的长度+空格数*2,使用System.arraycopy()函数进行数组拷贝,拷贝后的数组如上图中的A所示。在拷贝后的新数组中进行操作,定义两个索引,p1指向原始字符串的末尾,p2指向新字符数组的末尾。P1和p2不相等,向左移动p1,直到遇见第一个空格,此时把字原创 2021-08-09 09:19:31 · 187 阅读 · 0 评论
分享