
算法学习
CodeLikeWind
努力不会徒劳,伟大并非凑巧
展开
-
【面试排序算法】—— 随笔记录(三)
一、荷兰国旗问题题意:只包含0,1,2三个整数(或者说三种颜色)的数组进行排序,要求使用交换排序,原地排序,而不是利用计数进行排序。思路:这道题就是经典的荷兰国旗问题,而解决的方法类似于快速排序的划分。可以做到时间复杂度为O(n) 额外空间复杂度为(1)我们可以在数组的前方设置一个0区间,在数组的后方设置一个2区间,那么在我们遍历数组的过程中,将0放到0区间(和0区间后面的...原创 2018-08-09 21:57:02 · 269 阅读 · 0 评论 -
【面试算法】——队列和栈(二)
一、双栈队列题型:编写一个类,只能用两个栈结构实现队列结构,支持队列的基本操作。思路:这种题目的实现思路为,首先创建两个栈,一个是stackPush,一个是stackPop,因为队列结构的要求是数据是先进先出,但是栈结构的要求是先进后出,那么要用栈结构实现队列结构就需要将stackPush中的元素倒入到stackPop栈中,弹出时再弹出stackPop中的元素,这样先进的元素就先出...原创 2018-08-17 20:41:55 · 226 阅读 · 0 评论 -
【面试算法】——链表(一)
一、链表1.链表问题算法难度不高,但是考察代码实现能力2.链表和数组都是一种线性结构数组是一段连续的存储空间 链表空间不一定是保证连续的,为临时分配的3.链表的分类4.链表问题代码实现的关键点(1)链表调整函数的返回类型,根据要求往往是节点的类型(2)处理链表过程中,先采用画图的方式理清逻辑(3)链表问题对于边界条件讨论要求严格5.链表插入和删除的注意事项...原创 2018-08-20 11:47:56 · 2353 阅读 · 0 评论 -
【面试算法】——队列和栈(一)
一、队列和栈1、栈和队列的性质栈是先进后出 队列是先进先出栈和队列在实现结构上可以有数组和链表两种形式:其中数组结构实现较容易,用链表结构较复杂,因为牵扯很多指针操作。2、栈结构的基本操作(1)pop操作:从栈顶弹出一个元素(2)top和peek操作:访问栈顶元素,但是不弹出(3)push操作:从栈顶压入一个元素(4)size操作:返回栈中的元素个数3、队列结构...原创 2018-08-17 16:41:15 · 321 阅读 · 0 评论 -
二叉树先序中序后序遍历实现
一、递归实现import java.util.*;/*public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; }}*/public c...原创 2018-08-22 17:00:39 · 306 阅读 · 0 评论 -
【面试算法】——二叉树(一)
一、二叉树问题概述二叉树类型的题目为常考题型原因:能够结合队列、栈、链表、字符串等多数据结构 需要掌握图的基本遍历方法,比如BFS和DFS 需要掌握递归函数的使用,并自己设计出递归过程 二叉树问题与实际工作结合紧密 二、二叉树先序,中序和后序遍历先序遍历:先遍历头节点,再遍历左子树,再遍历右子树中序遍历:先遍历左子树,再遍历头节点,再遍历右子树后序遍历:先遍历左...原创 2018-08-22 12:42:26 · 767 阅读 · 0 评论 -
【面试算法】——字符串(二)
一、KMP算法解决字符串匹配问题KMP算法可以用来解决字符串匹配问题。现在有两个字符串,str1长度为n和str2长度为m且n>=m,判断是否存在str1中包含str2(也就是判断str2是否是str1的子串),如果存在,则返回true,如果不存在则返回false。我们一般的思路是,从str1的第一个字符开始,截取和str2相同长度的子串,将两者人进行比较,直到末尾(真实情况下移动到...原创 2018-08-13 21:44:47 · 534 阅读 · 0 评论 -
【面试排序练习】——随笔记录(二)
一、小范围排序题题意:所谓的小范围排序题指的是,已知一个几乎有序的数组,几乎有序的意思是,如果把数组排好顺序,每个元素移动的距离不超过k,并且k的大小远远小于数组的长度。问选择什么样的方法好。分析:1.时间复杂度为O(n)计数排序和基数排序,由于桶排序类排序算法的特点,当我们不知道数据的具体范围时,无法使用。所以不考虑。2.时间复杂度为O(n²)其中冒泡排序和选择排序的...原创 2018-08-08 19:19:14 · 202 阅读 · 0 评论 -
【面试算法】——字符串问题(一)
字符串面试题的特点一.广泛性 字符串可以看做字符串类型的数组,与数组的排序、查找和调整有关 很多其他类型的面试题可以看做字符串类型的面试题。 注意:使用Java实现字符串类型的题目时需要掌握StringBuffer,StringBuilder和toCharArray方法。二、字符串相关概念1.回文回文的定义:“回文数”就是正读倒读都一样的整数。如奇数个数字:98...原创 2018-08-13 11:37:32 · 1641 阅读 · 0 评论 -
【面试算法】——字符串(五)
一、空格替换题型:给定一个字符串str,将其中所有空格字符替换成“%20”,假设str后面有足够的空间。思路:面对这种题目,我们首先需要计算替换后的数组的长度,我们先遍历原数组,记录数组中的空格数,例如:“a b c”中有两个空格,那么替换后的数组数为5+2*2=9。然后我们从下标为8的位置开始,从后往前依次放入c,0,2,%,直到全部添加完毕。代码举例:import j...原创 2018-08-15 17:29:22 · 4127 阅读 · 0 评论 -
【面试算法】——字符串(四)
目录一、字符串的逆序调整题型:思路:代码举例:二、字符串移位题型:思路:代码举例:三、拼接最小字典序题型:思路:代码举例:一、字符串的逆序调整题型:给定一个字符串str,请在单词间做逆序调整,举例:“pig loves dog”逆序成“dog loves pig”。思路:首先我们需要实现一个函数,这个函数可以做到将字符串局部所...原创 2018-08-15 12:15:16 · 497 阅读 · 0 评论 -
【面试排序练习】——随笔记录(一)
笔者之前的博客提到过七种经典排序算法,他们分别是:时间复杂度为:O(n²)的算法:冒泡排序,选择排序,插入排序 时间复杂度为:O(n*㏒n)的算法:归并排序,快速排序,堆排序,希尔排序那么本篇的内容将要介绍两种时间复杂度为O(n)的排序算法,分别是:计数排序和基数排序这两种算法不是基于比较的的排序算法,主要思想原形是基于桶排序,所谓的桶排序不是一种具体的实现而是一种思想。一、计数排...原创 2018-08-07 17:44:37 · 226 阅读 · 0 评论 -
经典排序算法(一)
一、冒泡排序冒泡排序是时间复杂度为O(n²)的排序算法原理:比较相邻两个数的大小,根据条件进行交换,经过多次循环,最终使数组变得有序思路:若有一个长度为n的数组,现在要将数组元素从小到大排序,首先对于长度为n的数组,我们从第一个数开始,现将第一个数和第二个数进行比较,如果第一个数比第二个数大,则交换两者的值,反之不交换。然后再比较第二个数和第三个数的大小,以此类推一直到最后一个...原创 2018-08-02 17:28:40 · 366 阅读 · 0 评论 -
【面试算法】——字符串(三)
一、词语变形题型:给定两个字符串str1和str2,如果str1和str2中出现的字符种类一样且每种字符出现的次数也一样,那么str1与str2互为变形词,请实现函数判断两个字符是否互为变形词举例:str1=“123”,str2=“231”,返回true;str1=“123”,str2=“2331”,返回false;思路:使用哈希表实现对字符的计数,首先对str1创建哈...原创 2018-08-14 16:15:12 · 511 阅读 · 0 评论 -
经典排序算法(二)
经典排序算法上篇文章介绍了经典排序算法中时间复杂度为O(n²)的算法,这篇文章将要继续介绍时间复杂度为O(n*㏒n)的算法一、归并排序原理:归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修...原创 2018-08-06 18:39:29 · 151 阅读 · 0 评论 -
【面试算法】——链表(二)
一、链表是否有环判断题型:判断一个链表是否有环?如果无环则返回空,如果有环则返回第一个入环节点。思路:这类题目如果对于空间复杂度没有要求的话,我们可以使用哈希表来帮助我们实现遍历链表过程中,链表节点的访问记录。但是这类题目的最佳解法可以做到空间复杂度为O(1),如果链表长度为N,那么空间复杂度可以做到O(N)。最优解法思路为:创建两个指针,分表表示快指针和慢指针,快指针每次...原创 2018-08-21 13:25:14 · 267 阅读 · 0 评论