
数据结构
qq_29566629
热爱生活,热爱安全,热爱编程
展开
-
用两个栈实现队列(java和python版)
@解题思路栈的特征是“LIFO”,即先进后出,队列的特征是“FIFO”,即先进先出,那么就可以使用 两个栈s1和s2来实现队列,例如有数据顺序为a,b,c,d,先把数据push进s1,这个时候如果想要删除数据,只能删除d,这不符合队列的“头删”特性 ,因此要把s1的数据逐个pop出来,push进s2,这个时候再删除数据的话,就是先删除a,从而实现“头删”功能。栈的另一个特性就是“尾插”,这里...原创 2019-02-21 13:42:38 · 139 阅读 · 0 评论 -
排序之简单选择排序(java版)
原理之所以叫做简单选择排序,是因为这种排序方法真的很简单,原理如下:第一轮:找到序列中最小的值,具体的代码中就是要找到最小的值所在的index,先初始化index为0,然后逐一往后比较,遇到小的就把其索引赋给index,直到遍历到最后一个,这时最小值的index也就确定了,然后将这个最小值与第一个值进行交换,这样就把最小值放在了第一个位置。第二轮:以此类推,重复第一步,直到排到最后一个值。...原创 2019-03-20 23:03:09 · 243 阅读 · 0 评论 -
排序之冒泡排序(java版)
前言最近面试算法岗被面试官问到:简单介绍一下快速排序的原理,当时大脑一片空白,真是耻辱啊,作为一个计算机的研究生,连这都回答不上来,所以痛定思痛,准备出一个排序算法的介绍系列,今天从最简单的冒泡排序开始说起。原理大家一定要彻底理解这里的“冒泡”,众所周知,在水中,水泡越往上越大,所以冒泡也就是说逐渐的将最大的“冒”出来,举例如下:[4,5,1,3,7]。冒泡算法的过程就是第一轮:4和5比,...原创 2019-03-19 23:51:06 · 164 阅读 · 0 评论 -
链表的基本操作(java版)
引言最近在刷剑指offer和LeetCode的时候,看到了很多关于链表的问题,以前只学过c版本的链表,而且学的不是太好,现在总结一下java版本实现链表基本操作的问题基本操作先新建一个节点类:public class ListNode { int val; ListNode next = null; ListNode(int val) { ...原创 2019-03-04 21:23:13 · 2716 阅读 · 0 评论 -
合并两个排序的链表(java版)
题目输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。解题思路这题的解题思路很简单:假设两个链表为list1,list2,合并以后的为mergeHead,设置三个指针分别指向这三个指针,对list1和list2逐个进行对比,谁小就把谁插入到mergeHead。关键就在于如何用代码实现,其中涉及到“引用类型”的使用,(如果想对“引用类型”加深了解,参...原创 2019-03-04 19:01:11 · 798 阅读 · 1 评论 -
调整数组顺序使奇数位于偶数前面
题目输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。解题思路初级思路:遍历整个数组,将奇数、偶数按照原来的顺序分别进行排序组成两个数组,然后再将这两个数组中的元素依次赋给原数组,这个思路可行,但是时间复杂度较高,且技术水平太低,难以得到面试官的青睐。面试官喜欢的思路;(...原创 2019-02-26 21:24:52 · 131 阅读 · 0 评论 -
数值的整数次方(java版)
题目给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。解题思路看到这个题目,第一想到的肯定就是一个for loop就可以解决,但是针对这个问题,需要考虑底数和指数的正负以及零值的情况,这也体现了代码健壮性的重要性,在这里,有以下几个考虑点:(1)当指数为0时,底数无论是什么,结果都为0。(2)当底数为0,并且指数为负值时,这在数...原创 2019-02-26 16:08:31 · 296 阅读 · 0 评论 -
反转链表(java版)
题目描述输入一个链表,反转链表后,输出新链表的表头。解题方法链表示意如下:a->b->c->d->e->…x->y->z目标是将链表反转为以 z为头结点的链表。这里显然需要从前到后遍历整个链表,针对每个节点进行反转操作,以节点“c”为例,假设前面节点已经完成反转,c这时指向“b”,那么c和d之间的联系就断裂了,从而无法继续下去,所以这里也需要事...原创 2019-02-28 16:21:54 · 413 阅读 · 0 评论 -
链表中倒数第k个结点(java版)
题目输入一个链表,输出该链表中倒数第k个结点。解题思路能想到的最直接的解法就是输出该链表的第(n-k+1)个节点,不过这里有一个问题:需要先求出链表的长度,也就是n,那么这个算法就需要遍历整个链表两次。还有一种解法如下:设置两个指针ahead、behind,顾名思义,ahead指针在前,behind指针在后,前后相差k-1,这样当ahead到达链表的末尾是,behind正好位于倒数第k个...原创 2019-02-28 15:21:51 · 188 阅读 · 0 评论 -
旋转数组的最小数字(java和python版)
题目把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。解题思路第一种方法:直接在数组中利用 自带的查找函数找到最小的那个,当然,这样面试官可能直接就让你滚粗了。第二种...原创 2019-02-21 15:13:26 · 240 阅读 · 1 评论 -
链表中的头指针、头结点、首元结点
图解图片中解释的很清楚,头指针指向的是第一个节点,这个“第一个节点”就是头结点,大多数情况下,这个头结点的数据域都是空值,头结点也就代表着这整个链表。首元结点就是第一个有实际意义的节点。这里有一点需要特别说明一下:在有明确“指针”概念的语言中,如C与C++,链表中存在“头指针”,但是在java中,只存在头节点,这个头节点...原创 2019-08-02 15:24:27 · 763 阅读 · 0 评论