数据结构
王根生
只有工作才感觉到活着
展开
-
剑指offer(06)-从尾到头打印链表
题目描述输入一个链表的头节点,按链表从尾到头的顺序返回每个节点的值(用数组返回)。牛客链接本题牛客链接解题思路一可以使用stack的方式,但是这种方法会存在占用空间过大的问题先创建一个栈,然后依次从头到尾循环将链表中的节点元素入栈,再创建一个数组集合,利用栈先进后出的特点将栈中的元素分别出栈添加到数组集合中,return 数组集合。解题代码一/*** public class ListNode {* int val;* ListNode next =原创 2021-10-06 16:01:46 · 88 阅读 · 0 评论 -
剑指offer(05)-替换空格
题目描述请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。解题思路字符串中定义两个新老索引下标,设置字符串里新的大小防止越界。首先判断老索引位置上的元素是不是空格,是空格的话对新索引位置进行操作,不是空格的话,再对新索引的位置进行另外的操作。解题代码import java.util.*;public class Solution { public String replaceSp原创 2021-10-04 22:13:33 · 50 阅读 · 0 评论 -
剑指offer(04)-数组中出现次数超过一半的数字
题目描述数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。牛客链接https://www.nowcoder.com/practice/e8a1b01a2df14cb2b228b30ee6a92163?解题思路1这道题思路比较明确,定义map,使用<数字,次数>的映射关系,最后统计每个字符出现的次数,看是否有次数超过数组元素个数一原创 2021-10-04 18:07:42 · 228 阅读 · 1 评论 -
剑指offer(2)-旋转数组的最小数字
题目描述把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。例如:数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。给出的所有元素都大于0,若数组大小为0,请返回0。解题思路该题属于查询,查询的本质是排除,相比遍历,二分查找可以排除更多,那么查找的效率也就更高。当出现中间位置的元素值=左边位置的元素值,或者中间位置的元素值=右边位置的元素值,或者左边位置的元素值=右边位置的元素值,此时二分查找原创 2021-10-03 16:19:43 · 46 阅读 · 0 评论 -
剑指offer(1)
题目描述:在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。oj链接https://www.nowcoder.com/practice/abc3fe2ce8e146608e868a70efebf62e?解决思路任何查找的过程,本质是排除的过程(谁排除的效率更高,谁查找的效率就更高)遍历的做法一次排除一个,用排除行列的做法一次可以排除一行或一列,效率明显提原创 2021-10-03 11:27:14 · 59 阅读 · 0 评论 -
字符串逆置+翻转字符串(面试常考题)
字符串逆置个人理解首先将字符串变为数组将里面的数组元素进行逆置,用双指针的思想进行交换位置将交换位置的数组元素再变为字符串返回(这里将数组元素变为字符串又有两种情况:1:return new String(value) ~~~~ 2:return String.copyValueOf(value); )代码实现public class TestDemo { public static St原创 2021-08-27 20:50:59 · 323 阅读 · 1 评论 -
字符串连接
目录字符串连接题目描述输入描述输出描述示例个人理解:反转字符串字符串连接题目描述不借用任何字符串库函数实现无冗余地接收两个字符串,然后把它们无冗余地连接起来。输入描述每一行包括两个字符串,长度不超过100。输出描述可能有多组测试数据,对于每组数据,不借用任何字符串库函数实现无冗余地接收两个字符串,然后把它们无冗余的连接起来,输出连接后的字符串。示例输入:abc def输出: abcdef个人理解:反转字符串...原创 2021-08-26 20:03:56 · 353 阅读 · 1 评论 -
数据结构-双向链表
无头双向链表在Java的集合框架库中LinkedList底层实现就是无头双向循环链表。无头双向循环链表实现链表的功能实现代码class Node { public int data;//保存数据 public Node next; public Node prev; public Node (int data){ this.data = data; }}public class MyLinkedList { public Node原创 2021-08-13 23:20:12 · 93 阅读 · 0 评论 -
顺序表和链表的区别与联系
顺序表和链表的区别与联系顺序表:一白遮百丑白(优点):空间连续,支持随机访问丑(缺点):1:中间或前面部分的插入删除时间复杂度O(N)2:增容的代价比较大。链表:一胖毁所有胖(缺点):以节点为单位存储,不支持随机访问。所有(优点):没有增容问题,插入一个开辟一个空间。...原创 2021-08-09 20:33:40 · 194 阅读 · 3 评论 -
链表面试常考题-相交链表+合并两个有序链表
题目描述:给你两个单链表的头结点headA和headB,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回null。图示两个链表在节点c1开始相交:题目数据保证整个链式结构中不存在环。注意,函数返回结果后,链表必须保持其原始结构。示例描述:示例1:输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,0,1,8,4,5], skipA = 2, skipB = 3输出:Intersected at ‘8’解释:相交节点原创 2021-08-09 12:41:05 · 354 阅读 · 0 评论 -
链表面试-详解环形链表题
题目描述:给定一个链表,判断链表中是否有环。如果链表中有某个节点,可以通过连续跟踪next指针再次到达,则链表中存在环。为了表示给定链表中的环,我们使用整数pos来表示链表尾连接到链表中的位置(索引从0开始)。如果pos是-1,则在该链表中没有环。注意:pos不作为参数进行传递,仅仅是为了标识链表的实际情况。如果链表中存在环,则返回true。否则,返回false。示例描述:示例1:示例2:示例3:个人理解:该题使用fast,slow快慢双指针,首先在起始位置定义两个快慢指针。让f原创 2021-08-08 19:46:38 · 215 阅读 · 0 评论 -
链表面试-链表的回文结构(常考题)
题目描述:对于一个链表,请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法,判断其是否为回文结构。给定一个链表的头指针A,请返回一个boolean值,代表其是否为回文结构。保证链表长度小于等于900。示例描述:示例1::1->2->2->1返回:true示例2:1->2->3->2->1返回:true...原创 2021-08-08 15:40:55 · 134 阅读 · 0 评论 -
链表面试-删除链表中重复的节点(常考题)
题目描述:在一个排序的链表中,存在重复的节点,请删除该链表中重复的节点,重复的节点不保留,返回链表头指针。例如,链表1->2->3->3->4->4->5处理后为1->2->5示例描述:输入:{1,2,3,3,4,4,5}返回值:{1,2,5}最后一个节点不是重复的节点的情况:最后一个节点也是重复的节点的情况:此时就需要把最后的节点的next置为null,所以最后要增加一步,无论是这两种中的那种情况,一律在最后加一个tmp.next =原创 2021-08-07 21:45:31 · 477 阅读 · 2 评论 -
链表面试-链表分割(常考题)
题目描述:编写代码,以给定值x为基准将链表分割成两部分,所有小于x的节点排在大于或等于x的节点之前,给定一个链表的头指针ListNode* pHead,请返回重新排列后的链表的头指针。注意:分割以后保持原来的数据顺序不变。示例描述:x=12,原链表如下:两个线段存放节点过程:分割后的链表如下:个人理解:本题用两个线段来存放比x小的节点和大于等于x的节点,刚开始的时候两个线段的头尾bs,be;as,ae;先置为null定义一个cur,在原来的链表中进行遍历如果cur.val<x原创 2021-08-07 17:20:07 · 724 阅读 · 3 评论 -
数据结构-顺序表的应用(增,删,改,查,获取顺序表长度,清空顺序表)
顺序表概念顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数据的增删查改。顺序表一般可以分为:静态顺序表:使用定长数组存储。动态顺序表:使用动态开辟的数组存储。静态顺序表适用于确定知道需要存多少数据的场景。静态顺序表的定长数组导致,空间开多了浪费,空间开少了不够用。相比之下动态顺序表更灵活,根据需要动态的分配空间大小。测试文件:public class TestDemo1 { public static void main(S原创 2021-08-01 15:53:31 · 949 阅读 · 0 评论 -
数据结构线性表
线性表:是n个具有相同特性的数据元素的有序序列,它是一种在实际中广泛使用的数据结构。常见的线性表:顺序表,链表,栈,队列,字符串…线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储。数组的形式存储链式结构的形式存储...原创 2021-07-31 20:16:30 · 53 阅读 · 0 评论 -
什么是字典序?
这是一种排序方法:对于字符串,先按首字符排序,如果首字符相同,再按第二个字符排序,以此类推。如aa,ab,ba,bb,bc就是一个字典序。原创 2021-05-04 23:55:24 · 9918 阅读 · 0 评论 -
哈希表
哈希表:数据结构中的压轴戏,面试中出场频率极高的内容,同时也是工作中出场频率极高的内容,更是现代分布式系统的基础。给定若干个整数[0,99],再给定一个数字N,判定N是否在刚才的集合中出现?基于顺序表:可以用一个数组保存若干个整数,拿着N在数组中依次遍历,进行比较。时间复杂度为:O(N)基于链表:可以用一个链表保存若干个整数,拿着N在数组中依次遍历,进行比较。时间复杂度为O(N)基于二叉搜索树:可以用二叉搜索树来保存这些整数,按照二叉搜索树的方式进行查找比较。时间复杂度最坏O(N),比较理想的情况原创 2021-05-06 22:06:35 · 228 阅读 · 4 评论