一些算法
文章平均质量分 58
Hustlrz
学习中
展开
-
kmp算法 java实现
通常我们想在一个字符串中匹配一个子字符串,会遍历字符串,对于每一个字符,都遍历子字符串进行匹配,这样时间复杂度为O(nm); 使用KMP算法只需先进行一个O(m)的预处理(生成next数组),就能将搜索的时间复杂度降低至O(n+m)。下面讲一讲KMP算法的实现原理。 对于ABCDEABD...和ABCDEABC,当匹配至最后一位是发现不匹配,之前的ABCDEAB都是匹配的,这段字符串包原创 2017-06-16 10:30:08 · 215 阅读 · 0 评论 -
删除排序链表中重复的节点 递归方式
思路比较简单,直接看代码 /* public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; } } */ public class Solution { public ListNode deleteDuplicati原创 2017-06-13 22:39:27 · 526 阅读 · 0 评论 -
找到链表中环的入口节点 java
如果一个链表中有环,如何找到这个环的入口节点? 可以自己在纸上画一画,定义一个快节点,一个慢节点;快节点每次走两步,慢节点每次走一步;如果有环,两个节点必将相遇,记录下相遇节点的位置; 重新从头节点开始走,同时之前记录下的节点也开始走,直到两个节点相遇就是换的入口节点。 /* public class ListNode { int val; ListNode next =原创 2017-06-13 21:42:57 · 318 阅读 · 0 评论 -
约瑟夫问题(约瑟夫环) java
n个人围成一圈,编号为0~n-1,从第0号开始,数到m-1,则去掉编号为m-1的人,然后按下一个人为0开始重新计数,直到最后只剩下一个人。 初始状态为0,1,2,......,m-2,m-1,m,m+1,......,n-2,n-1 当去掉m-1后状态为0,1,2,......,m-2,m,m+1,......,n-2,n-1 将剩下的n-2个人重新编号 m -------->原创 2017-06-13 16:12:39 · 1616 阅读 · 0 评论 -
找到数组中重复的数字
一个长度为n的数组中有重复的数字,有多少个重复的或者重复多少次都不清楚,每个数字的值在0~n-1之间,找出任意重复的数字。 这个问题还是比较简单的,由于所有数字的值都在数组下标的范围内,所以遍历一遍数组,对于每个值,把相应下标的值加n,使其大于n-1,第二次访问到这个下标就能知道该值重复了。时间复杂度为O(n)。 public class Solution { // Parameter原创 2017-06-12 19:43:00 · 185 阅读 · 0 评论 -
不使用+、-、*、/完成两个整数的相加
第一步:两个整数相异或,得到的是相加的位,如5-101与7-111,异或得到010,十进制是2,相当于个位的数值; 第二部:两个整数相与,再左移一位,得到的是进位,101&111 = 101,左移一位是1010,相当于十进制的10; 第三部:进位不为0,则重复上述操作。 public class Solution { public int Add(int num1,int num2)原创 2017-06-12 19:07:12 · 376 阅读 · 0 评论