数据结构与算法
li_mengjun
这个作者很懒,什么都没留下…
展开
-
链表中连续k个结点反转
算法实现一个函数,输入链表头部和整数K,实现功能:链表从后往前,每K个结点反转一下,假如头部有剩余结点,则保持不变,如输入:1 -> 2 -> 3 -> 4 -> 5, k = 2输出:1 -> 3 -> 2 -> 5 -> 4与leetCode:K 个一组翻转链表类似,只不过这里的k个元素是从后往前思路1. 先遍历一次链表,求链表长度,复杂度O(n)2. n % k求得开始反转的链表结点,并将当前指针cur移动到此3.原创 2021-03-17 16:12:12 · 284 阅读 · 0 评论 -
找出数组中重复的元素
题目:int[] array, length of array is k, [0, k-1]实现函数:void printDup(int[] array, int k),打印重复元素,不限顺序;一个元素若出现多次,可打印多次。输入:array = [2,2,1,1], k = 4输出:21解法:思路1:维护一个HashSet,存储出现过的元素。空间复杂度O(N),时间复杂度O(N)思路2:由于数组元素的值在0~k-1之间,可以维护一个int数组times用于记录元素出现的次数。比原创 2021-03-17 16:06:43 · 3606 阅读 · 1 评论 -
合并两棵二叉树
给定两棵任意的二叉树,将其合并,返回合并后的根节点。思路: 基于先序遍历,如果root1存在就和root2的val相加,如果root1不存在,就把root2的引用直接赋值给root1。代码如下:public class Main { public static void main(String args[]) { TreeNode root1 = new TreeNode(原创 2017-10-12 18:10:11 · 2396 阅读 · 1 评论 -
判断一颗树是否为平衡二叉树
题意描述:给定一个棵树的根节点,判断该树是否为平衡二叉树?什么是平衡二叉树?平衡二叉树(AVL, Self-balancing binary search tree)是一棵所有节点的左右子树深度差不超过1的二叉搜索树。这表明AVL首先是一个二叉搜索树,在节点的数值上有约束,同时对树形有严格要求,具有以下性质:一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。p原创 2017-10-23 13:00:49 · 431 阅读 · 0 评论 -
求出不超过n的幸运数
题目描述:对于某一个数m,如果它只包含数字4或者7(如44,47,77),我们称之为幸运数。现在输入一个自然数x,求出不超过x的幸运数的个数。 注意:结果可能非常大,请将答案除10^9+7取余数。思路一:1. 引入队列queue,开始时将4,7入队。2. while(queue.peek() <= x) 则将queue头部元素top出队,并且将top*10+4和top*10+7入队原创 2017-10-15 12:40:29 · 960 阅读 · 0 评论 -
判断某年月日是当年的第几天
题目描述: 输入三个整数year,month,day分别表示当前年月日,输出该天是当年的第几天思路: * 由于只有十二个月,所以可以枚举每个月的天数 * 需要单独考虑的是当前年份是否是闰年&&当前月份是否大月2月,如果都满足,则在总天数上+1原创 2017-10-11 10:40:32 · 2665 阅读 · 0 评论 -
求一个环内连续m个数的最大和
题目描述:有n个小朋友,围成一个圈,玩丢手绢的游戏。现输入一个数组表示每个小朋友被丢中的次数,同时输入一个整数m(1<=m<=n),求出连续m个小朋友被丢中次数的和的最大值。 示例:input:5//数组大小n12345//数组的个元素值3//连续m个小朋友output:12思路:思路还是比较简单的:假定输入数组为arr,连续m个小朋友1. 求出一个基本值sum,maxfo原创 2017-10-15 15:51:35 · 1147 阅读 · 3 评论 -
和为S的连续正数序列
题目描述:现在要求有多少种连续的正数序列的和为100(至少包括两个数)。其中一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? 思路:由于题目要求至少包含两个数,那么所有可能的序列的最大值均不会超过(sum + 1) >> 1;1, 2, start-1, start, start+1, start+2, ..., end-原创 2017-10-24 16:36:00 · 212 阅读 · 0 评论 -
丑数
这是剑指offer上的一道算法题:把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。思路:比较容易想到的是,对于数组arr,某些位置t2,t3,t5的数分别乘以2,3,5以后取最小值即为下一个丑数。比如:arr[0] = 1;开始时,t2 = 0,t3 = 0, t5原创 2017-10-16 22:22:06 · 180 阅读 · 0 评论 -
第一次只出现一次的字符
题目描述一个字符串全部由字母组成,如果存在只出现一次的字符,则返回第一个字符的位置,如果不存在怎返回-1.思路:因为要寻找第一个只出现一次的字符,所以必须全部遍历,用某个数据结构保存每个位置字符的信息。第二次遍历要在该数据结构中查找值,并且是常熟时间,那么可以采用HashSet。1. 先用一个HashSet保存字符串中所有的字符+去重;2. 用第二个HashSet保存出现过多次的字符;代码如下:原创 2017-10-17 11:04:34 · 269 阅读 · 0 评论 -
一个字符串包含的所有回文串
题目描述:输入一个字符串str,输出str包含的所有回文串的个数。如ABA,包含的回文串有A,B,A,AA,ABA共5个。思路: 长度为N的str的不打乱原始顺序所有可能的字符子串个数为2^N个,再判定每一个子串是否是回文串。原创 2017-10-11 15:44:13 · 3478 阅读 · 0 评论 -
栈的压入、弹出序列
Description: 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)原创 2017-10-04 19:52:55 · 301 阅读 · 0 评论 -
二叉树的镜像
题目描述 操作给定的二叉树,将其变换为源二叉树的镜像。二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / \ 10 6原创 2017-10-04 19:49:02 · 622 阅读 · 0 评论 -
二叉搜索树转化为双向链表
题目描述: 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。思路一: 按中序遍历,借助中间队列用于存储树种的各个节点,然后遍历队列,给相邻节点建立关系;思路二: 不引入新得变量。只能采用递归的方式: 假设root节点的左右子树已经是双向链表,那么只用将root和左右子树对应链表的最大值和最小值建立连接;原创 2017-10-07 17:29:52 · 365 阅读 · 0 评论 -
排序算法Java实现
java实现排序算法原创 2017-10-04 19:44:33 · 236 阅读 · 0 评论 -
对象的复制:浅复制(clone()方法的使用)+深复制
首先需要了解对象深、浅复制的概念: 浅复制:将一个对象复制后,基本数据类型(如int,String,boolean)的变量都会重新创建,而引用类型,指向的还是原对象(或数组)所指向的。原创 2017-10-04 19:50:23 · 848 阅读 · 0 评论 -
把数组排列成最小的数
题目描述 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。原创 2017-10-09 18:29:35 · 578 阅读 · 0 评论 -
求数字在非降序数组中出现的次数
题目描述:在一个非降序排列的数组中,找出数字target出现的次数。非降序数组,比如{1,1,1,2,3,4,5,5,6}思路一:先通过二分查找,找到arr[index]等于target的index,在分别向前后遍历,直到arr[index] != target为止。算法实现简单,但是当数组形如{x,x,...,x},此时查找x的时间复杂度就退化为线性的O(n).思路二:1. 首先通过二分查找,原创 2017-10-18 23:06:20 · 597 阅读 · 0 评论 -
循环数组-找出最小值
今天面试遇到一个有意思的题,记录一下如下。题目一: 一个循环数组,数组中原始值按升序排列(假设所有值不相等),但是现在从某个位置截断,该位置后面的元素移动到数组的最前面,找出这样的数组的最小值。如 arr = { 1,2,3,4,5,6},移动后arr = {4,5,6,1,2,3},其中最小值为1.原创 2017-10-10 22:18:11 · 4474 阅读 · 1 评论 -
Java中Arrays.sort()实现
对基本类型用的快速排序,对对象类型是归并排序。 原因可能和稳定性有关。 一般来说,快速排序效率最高,不过快速排序是不稳定的,就是比如说数组中的值相同的两个整数,排序前和排序的先后顺序可能不一致,这对基本类型来说是完全可以接受的。 但对对象类型来说,用户可能有稳定性方面的要求,于是使用了效率和稳定都能兼顾的归并排序。 查看源代码,选取其中一个,对int数组的排序 1. 升序 2.原创 2017-10-04 19:51:36 · 1593 阅读 · 0 评论 -
可以回跳的台阶跳
题目一: 青蛙跳台阶有两种方式:一次跳1级,一次跳两级,问从0级阶梯跳到n级阶梯共有多少种方式?原创 2017-10-11 12:17:01 · 514 阅读 · 0 评论 -
合并两个排序后的链表
算法描述: 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。原创 2017-10-04 19:47:33 · 289 阅读 · 0 评论 -
复杂链表的复制
题目描述 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的头结点。 思路: 1. 首先根据链表的next遍历一遍,在每个node节点的后面复制一个与node的label相等的节点,如图所示; 2. 再遍历新链表,为复制的节点指定random指针(黄色箭头所示); 3. 将新链表拆分=原链表+复制后的链表原创 2017-10-06 19:52:45 · 254 阅读 · 0 评论