![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法
行万里路,读万卷书
工作三年
展开
-
两个字符串的最大长度子串
题目求两个字符串的最大长度子串,如:字符串"abcdefhellosadjvdb"与字符串"helloworld"的最大长度子串为hello解题思路指定两个指针,分别指向长度最小的字符串的头部和尾部,然后依次遍历它的每个子串,长度最大的字符串通过调用contains(子串)来判断,如果返回值为true,则跳出循环,此时的子串即两个字符串的最大长度子串(思想类似求两个数的最大公约数)代码实现public class StringDemo2 { /** * 获取两个字符串中最大的相同原创 2021-12-23 19:25:42 · 880 阅读 · 0 评论 -
如何判断一个单链表中是否有环
题目给一个单链表,判断其中是否有环的存在解题方法(1)暴力法给定一个足够大的循环上限,遍历链表,遍历到空指针则没有环,到达循环上限则认为有环package com.company.algorithm.link;import sun.awt.image.ImageWatched;public class LinkIsContainsRing { public static void main(String[] args) { LinkIsContainsRing l原创 2021-11-20 07:45:06 · 352 阅读 · 0 评论 -
算法-词频统计
题目给定一个string数组article及其大小n及一个待统计单词word,请返回该单词在数组中出现的频数。文章的词数在1000以内解题思路(1)暴力法用一个int变量count统计单词word出现的次数,遍历所有的article元素,与word一一比较,如果相等则count+1代码实现package com.company.algorithm;public class WordFrequency { public static void main(String[] args) {原创 2021-11-18 22:09:18 · 991 阅读 · 0 评论 -
合并两个有序数组
题目给出两个有序的整数数组A和B,假设A数组有足够的空间存放B数组的元素,A和B中初始的元素数目分别为m和n,将数组B合并到数组A中,变成一个有序的数组解题思路数组A和数组B从后往前遍历,不需要额外分配空间,也不需要进行冗余处理,时间复杂度为O(n),空间复杂度为O(1)编码实现package com.company.algorithm;import java.util.Arrays;public class MergeArrays { public static void mai原创 2021-11-05 21:39:54 · 290 阅读 · 0 评论 -
删除链表的倒数第K个节点
1.题目给定一个链表,删除链表的倒数第n个节点,并且返回链表的头节点2.示例给定一个链表:1 -> 2 -> 3 -> 4 -> 5 删除位置:n=2,n必须是有效的位置删除倒数第2个节点后的链表:1 -> 2 -> 3 -> 5 ...原创 2021-10-31 11:00:46 · 209 阅读 · 0 评论 -
连续子数组的最大和
题目输入一个整形数组,数组里有正数也有负数。数组中的一个或连续多个整数组成一个子数组。求所有子数组和的最大值。要求时间复杂度为O(n)。例如,输入的数组为{1,-2,3,10,-4,7,2,-5},和最大的子数组为{3,10,-4,7,2},因此输出该子数组的和为18。解题思路从头到尾逐个累加示例数组中的每个数字。初始和为0。第一步加上第一个数字,此时和为1。第二步加上数字-2,和就变成了...原创 2019-08-16 09:56:55 · 124 阅读 · 0 评论 -
字符流中第一个不重复的字符
题目请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。思路解析利用一个数组,然后数组的下标就是这个字符对应的整数。刚输入一个字符,先把这个字符放入一个队列。就将判断该字符对应下标在数组中的值是否已经有,有就在基础上加一,如果没有,则...原创 2019-08-15 22:17:59 · 116 阅读 · 0 评论 -
数据流中的中位数
题目如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序后中间两个数的平均值。解题思路用一个最大堆实现左边的数据容器,用一个最小堆实现右边的数据容器。往队中插入一个数据的时间效率为O(logn)。由于只要O(1)时间就可以得到位于堆顶的数据,因此得到中位数的时间复杂度是O(1)。源...原创 2019-08-15 21:36:51 · 127 阅读 · 0 评论 -
合并区间
题目给出一个区间的集合,请合并所有重叠的区间。示例 1:输入: [[1,3],[2,6],[8,10],[15,18]]输出: [[1,6],[8,10],[15,18]]解释: 区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].示例 2:输入: [[1,4],[4,5]]输出: [[1,5]]解释: 区间 [1,4] 和 [4,5] 可被视为重叠区间。解题思...原创 2019-08-12 10:38:49 · 179 阅读 · 0 评论 -
判断一个字符串数组是否能组成首尾相连的环
题目输入一组字符串 判断字符串是否组成环例如:输入:aes dwewe ea sd输出:true输入:as st ta输出:false解题思路总体思想就是当前字符串找到一个能连接的就继续找能接上的,最后原字符串数组只剩下一个字符串的时候,一个的首是否等于另一个尾。满足就是环。方法一如果字符串数组能组成环,则每个字符串首尾的字符每个出现偶数次。依次遍历字符串数组,截取每个字符串...原创 2019-08-12 09:30:23 · 2701 阅读 · 2 评论 -
求两个数组的交集
题目求两个数组的交集,它们之间相等的的元素。例如:a [] = {4,5,6,7,2,8},b [] = {4,9,0,2,7}输出:4,7,2方法一:暴力搜索import java.util.ArrayList;import java.util.Arrays;public class FindInterBetweenTwoArray { public static voi...原创 2019-08-11 22:10:32 · 649 阅读 · 0 评论 -
和为s的连续正数序列
题目小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!输出描述输出所有和为S的连续正数序列。序列内按...原创 2019-08-20 15:22:55 · 82 阅读 · 0 评论 -
从1到n整数中1出现的次数
题目输入一个整数n,求1~n这n个整数的十进制表示中1出现的次数。例如,输入12,1-12这些整数中包含1的数字有1、10、11和12,1一共出现了5次。暴力法原创 2019-08-16 11:07:36 · 338 阅读 · 0 评论 -
两个大数和
题目求两个超大整数的和,不能使用Java内置类BigInteger。解题思路1.同号相加,结果符号位取任意一个数的符号;2.异号相加,取较大的数减去较小的数,结果符号取较大的数的符号位。由于是超大数,因此我们使用String来存储。源代码public class BigNumberSum { public static String bigNumberSum(String n...原创 2019-08-21 22:23:33 · 323 阅读 · 0 评论 -
两个大数的乘积
题目求两个非常大整数的乘积,要求不能使用Java类库提供的BigInteger。解题思路将字符串转换成整数数组,逐位相乘后保存到结果数组中,数组的长度为两个字符串长度的和,然后单独处理进位。最后从后往前遍历数组就是两个大数的乘积。源代码package Arithmetic;import java.util.Scanner;public class BigNumberMultip...原创 2019-08-22 11:02:32 · 856 阅读 · 0 评论 -
数字序列中的某一位数字
题目数字以0123456789101112131415…的格式序列化到一个字符序列中。在这个序列中,第5位(从0开始计数)是5,第13位是1,第19位是4等等。请写出一个函数,求任意第n位对应的数字。解题思路比如,序列的第1001位是什么?序列的前10位是0-9这10个只有一位的数字。显然第1001位在这10个数字之后,因此这10个数字可以直接跳过。我们再从后面紧跟着的序列中找第991(9...原创 2019-08-17 15:53:27 · 333 阅读 · 0 评论 -
把数字翻译成字符串
题目给定一个数字,按照如下规则翻译成字符串:1翻译成"a",2翻译成"b"…26翻译成"z"。一个数字有多种翻译可能,例如12258一共有5种,分别是abbeh,lbeh,aveh,abyh,lyh。实现一个函数,用来计算一个数字有多少种不同的翻译方法。解题思路可以用递归,但是发现子问题258 58都重复了。动态规划f(i)表示从第i位数字开始不同的翻译数目可以得出转移矩阵:f(i)...原创 2019-08-17 17:12:13 · 236 阅读 · 0 评论 -
最长不含重复字符的子字符串
题目输入一个字符串(只包含a-z的字符)。求其最长不含重复字符的子字符串的长度。例如,对于arabcacfr,最长不含重复字符的子字符串为acfr,长度为4。解法一用双指针i,j分别指向第一第二个元素,当j发现了重复元素,则从i的下一位开始搜索。源代码public static int lengthOfLongestSubString1(String str) { int...原创 2019-08-18 11:17:43 · 226 阅读 · 0 评论 -
n个骰子的点数
题目把n个骰子扔在地上,所有骰子朝上一面的点数之和为s。输入n,打印出s的所有可能出现的值出现的概率。解题思路将n个骰子分为两堆,第一堆只有一个,剩下的一堆有n-1个然后计算n-1个骰子的点数之和,过程和第一步一样总共n个骰子,有6^n中排列组合,骰子点数之和在n到6n之间,所以可以用5n+1的数组来存放出现点数之和的次数,将和为s的点数存放在数组的第s-n个元素中...原创 2019-08-27 16:27:33 · 159 阅读 · 0 评论 -
简单选择排序
算法思想第一次从R[0]R[n-1]中选取最小值,与R[0]交换,第二次从R[1]R[n-1]中选取最小值,与R[1]交换,…,第i次从R[i-1]R[n-1]中选取最小值,与R[i-1]交换,…,第n-1次从R[n-2]R[n-1]中选取最小值,与R[n-2]交换,总共通过n-1次,得到一个按排序码从小到大排列的有序序列。算法分析1.将整个记录序列划分为有序区和无序区,初始时有序区为空,无...原创 2019-07-21 13:14:15 · 410 阅读 · 0 评论 -
数组中只出现一次的数字
题目一个整型数组里除了两个数字之外,其他的数字都出现了偶数次。请写程序找出这两个只出现一次的数字。解题思路(1)利用hashmap分拣存储。源代码import java.util.ArrayList;import java.util.HashMap;import java.util.List;public class AppearOnceNum { public static ...原创 2019-08-20 09:59:40 · 107 阅读 · 0 评论 -
求一个数组的最长严格递增子序列
题目求一个数组的最长严格递增子序列比如:输入85 9 4 1 3 7 6 7输出 4解题思路假设要寻找的最长上升子序列的是a[n],然后寻找到的递增子序列放入到数组b中。1.当遍历到数组a的第一个元素时,将这个元素放入到b数组中,以后遍历到的元素和已经放入到b中的元素进行比较;2.如果比b数组中的每个元素都大,则将该元素插入到b数组的最后一个元素,并且b数组的长度加1;3.如果比...原创 2019-08-10 22:21:23 · 878 阅读 · 0 评论 -
最小的K个数
题目输入n个整数,找出其中最小的k个数。例如,输入4、5、1、6、2、7、3、8这8个数,则最小的4个数字是1,2,3,4.原创 2019-08-14 22:38:32 · 181 阅读 · 0 评论 -
排序算法的性能和应用场景
按算法分类1.插入排序直接插入排序,希尔排序2.交换排序冒泡排序、快速排序3.选择排序直接选择排序、堆排序4.归并排序5.基数排序原创 2019-07-22 13:56:38 · 198 阅读 · 0 评论 -
基数排序
基本思想基数排序是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。由于整数也可以表达字符串(比如名字或日期)和特定格式的浮点数,所以基数排序也不是只能使用于整数。算法分析(1)将所有待比较数值(正整数)统一为同样的数位长度,数位较短的数前面补零。(2)从最低位开始,依次进行一次排序。(4)这样从最低位排序一直到最高位排序完成以后, 数列就变成一个有...原创 2019-07-22 10:29:43 · 677 阅读 · 0 评论 -
堆排序
基本思想堆排序(英语:Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。算法分析1.假设结果要递增有序。2.首先用前n个元素的无序序列,构建成大顶堆;3.构建大顶堆时,从最后一个非叶节点n/2-1的位置开始检查节点与其孩子值是否满足大顶堆的要求,不满足则需要调整该元素与其孩...原创 2019-07-21 20:35:17 · 191 阅读 · 0 评论 -
归并排序
基本思想归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用,且各层分治递归可以同时进行。算法分析1.[分]:先将待排序序列一分为二[left…center…right]2.[治]:将左边的数组排序[left–>center]3.[治]:将右边的数组排序[center+1–>right]4.[合]:合...原创 2019-07-21 15:41:45 · 107 阅读 · 0 评论 -
冒泡排序
算法思想它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果他们的顺序(如从大到小、首字母从A到Z)错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列已经排序完成。算法分析冒泡排序算法的原理如下:1.比较相邻的元素。如果第一个比第二个大,就交换他们两个。2.对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会...原创 2019-07-21 14:47:49 · 108 阅读 · 0 评论 -
Shell排序
基本思想希尔排序是由Donald Shell发明的。该算法思想是通过比较一定间隔的元素进行插入排序来工作,当选中间隔逐渐缩小到1时,无序序列就形成了有序序列。算法分析Step1 将n个元素个数列分为5个小组,在每个小组内按直接插入法排序;step2 在第i步,分组个数取 di+1 =(di +1)/2 {9,5,3,2,1};相临两组之间的对应元素进行比较,如果ai>aj,则交换它们...原创 2019-07-21 11:01:13 · 214 阅读 · 0 评论 -
直接插入排序
算法思想把n个待排序的元素看成为一个有序表和一个无序表。开始时有序表中只包含1个元素,无序表中包含有n-1个元素,排序过程中每次从无序表中取出第一个元素,将它插入到有序表中的适当位置,使之成为新的有序表,重复n-1次可完成排序过程。算法介绍每一趟将一个待排序的记录,按其关键字的大小插入到已经排好序的一组记录的适当位置上,直到所有待排序记录全部插入为止。待排序记录R1,R2,R3,…,Rn–...原创 2019-07-21 10:07:46 · 133 阅读 · 0 评论 -
排序算法-快速排序
基本思想通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,一次达到整个数据变成有序序列。...原创 2019-07-20 22:34:27 · 104 阅读 · 0 评论 -
动态规划
定义将原问题拆解成若干个子问题,同时保存子问题的答案,使得每个子问题只求解一次,最终获得原问题的答案。在递归问题中如果存在重叠子问题,那么可以进行一下两种改造:(1)自顶向下地解决问题:记忆化搜索(2)自底向上地解决问题:动态规划...原创 2019-06-24 10:30:17 · 73 阅读 · 0 评论 -
求最长不含重复字符的子字符串
题目最长不含重复字符的子字符串请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。假设字符串中只包含从’a’到’z’的字符。例如,在字符串中”arabcacfr”,最长非重复子字符串为”acfr”,长度为4。解题思路一:暴力破解法,遍历所以的子字符串,判断其中的不重复的子字符串...原创 2019-08-08 14:37:25 · 897 阅读 · 1 评论 -
字符串的全排列
题目输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。解题思路这是经典的DFS题目大致思想是,先确定第i个字符(从i到最后完成遍历枚举),然后对i+1~N-1个字符递归使用全排列(缩小范围)。源代码import java.util.ArrayList;impo...原创 2019-08-13 15:03:42 · 9175 阅读 · 1 评论 -
数组中出现次数超过一半的数字
题目数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如,输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一般,因此输出2。解题思路源代码import java.util.HashMap;public class MoreThanHalfNum { public static int moreThanHal...原创 2019-08-14 22:03:28 · 81 阅读 · 0 评论 -
翻转单词顺序列
题目一个整型数组里除了两个数字之外,其他的数字都出现了偶数次。请写程序找出这两个只出现一次的数字。解题思路(1)异或一个数与自身异或是0,一个数与0异或是本身当数组中只有两个数出现一次,其余数字都出现偶数次时,数组中所有数字异或的结果就是这个两个数字异或的结果...原创 2019-08-19 22:17:21 · 127 阅读 · 0 评论 -
二叉查找树的第K个节点
题目给定一颗二叉搜索树,请找出其中的第k小的结点。二叉搜索树二叉搜索树,是指一棵空树或者具有下列性质的二叉树:1.若任意节点的左子树不空,则左子树上所有节点的值均小于它的根节点的值;2. 若任意节点的右子树不空,则右子树上所有节点的值均大于它的根节点的值;3. 任意节点的左,右子树也分别为二叉搜索树;4. 没有键值相等的节点。解题思路首先这个是一颗二叉搜索树,我只需要是的这个这颗...原创 2019-08-19 17:00:23 · 691 阅读 · 0 评论 -
数字在排序数组中出现的次数
题目统计一个数字在排序数组中出现的次数,比如排序数组为{1,2,3,3,3,4,5},那么数字3出现的次数就是3。解题思路(1) 暴力法:HashMap遍历数组将遍历到的数字作为键,出现的次数作为值保存。源代码package Arithmetic;import java.util.HashMap;import java.util.Set;public class GetNum...原创 2019-08-19 15:36:18 · 184 阅读 · 0 评论 -
翻转链表
题目定义一个函数,输入一个链表的头结点,反转该链表并输出反转后的链表。链表节点定义public class Node { public int Data { get; set; } // 指向后一个节点 public Node Next { get; set; } public Node(int data) ...原创 2019-08-09 20:25:22 · 164 阅读 · 0 评论 -
正则表达式匹配
题目请实现一个函数用来匹配包括’.‘和’‘的正则表达式。模式中的字符’.‘表示任意一个字符,而’'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"abaca"匹配,但是与"aa.a"和"ab*a"均不匹配。解题思路用字符串去匹配模式,匹配上就把模式串往后移动继续匹配,直到匹配串全部匹配完,如果字符串还是没...原创 2019-08-09 17:23:22 · 495 阅读 · 0 评论