算法
LUK流
大数据/java web
展开
-
(25)复杂链表的复制
1.问题 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空) 2. 思路 (1)先将原来的链表复制一份,具体赋值方式如下: (2)根据原来的节点的random确定复制节点的random (3)最后将蓝色的节点和绿色的节点分开 3.代...原创 2019-11-17 17:01:10 · 108 阅读 · 0 评论 -
(24)二叉中和为某一个值的路径
1. 题目 输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前) 2.思路 由题目中的“数组长度大的数组靠前”可知,需要使用dfs 3.代码 /** * 问题:输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。 *...原创 2019-11-17 16:16:00 · 161 阅读 · 0 评论 -
(23)二叉搜索树的后序遍历序列
1.题目 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。 2.思路 每一轮递归实现的功能: 然后遍历蓝色的左子树和绿色的右子树。 3.代码 /** * 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。 * 如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。 *...原创 2019-11-17 16:04:08 · 102 阅读 · 0 评论 -
(22)从上往下打印二叉树
1. 题目 从上往下打印出二叉树的每个节点,同层节点从左至右打印。 2.思路 分为两步: (1)将根节点加入队列 (2)循环出队: 如图1节点出队。变成红色,出队时判断该节点是否有左子树和右子树。 如果有左子树和右子树就将左子树和右子树加入到队列中。然后循环从头结点开始出队。 3. 代码 /** * 题目:从上往下打印出二叉树的每个节点,同层节点从左至右打印。 */ public cl...原创 2019-11-12 13:54:10 · 154 阅读 · 0 评论 -
(21)站的压入、弹出顺序
1. 题目 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的) 2. 思路 以int pushA[] = {1,2,3,4,5};和int popA...原创 2019-11-09 22:05:43 · 135 阅读 · 1 评论 -
(20)包含min函数的栈
1.问题 定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。 2.思路 这个题目要解决的是,每次从stack里面删除一个数据,如何o(1)的时间复杂度输出一个最小值。如下图,从左边变成右边以o(1)的时间复杂度输出最小值。 采用两个stack,如图,左边的stack用于数据处理,右边的stack用于备份左边的stack的最小值的版本。当左边的s...原创 2019-11-08 17:54:08 · 131 阅读 · 0 评论 -
(19)顺时针打印矩阵
1. 题目 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10. 2.思路 如下图所示,每次遍历, (1)如果是第一层就像红色的线的路径一样,并记录此时layer-0来标示着是第一层...原创 2019-11-08 14:50:27 · 90 阅读 · 0 评论 -
(18)二叉树的镜像
1. 题目 操作给定的二叉树,将其变换为源二叉树的镜像。 二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / \ 10 6 / \ / \ 11 9 7 5 2. 思路 对于每个...原创 2019-11-07 20:51:46 · 82 阅读 · 0 评论 -
(17)树的子结构
1.题目 输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构) 2.思路 先写一个函数isIncludeTree(TreeNode root1, TreeNode root2)判断以root1和root2两个根节点为起点,root1是否包含root2,如下图,右边的图包含左边的图 然后写一个函数遍历右边的树每个节点,如下: (1)比较两个绿色的8,查看是右边...原创 2019-11-07 15:01:28 · 98 阅读 · 0 评论 -
(16)合并两个排序的链表
1. 题目 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。 2. 思路 每次选举出两个链表较小的头节点,插入新链表的尾部 3. 代码 /** * 题目:输入两个单调递增的链表,输出两个链表合成后的链表, * 当然我们需要合成后的链表满足单调不减规则。 */ public class Test16 { public static void...原创 2019-11-05 13:08:45 · 94 阅读 · 0 评论 -
(15)反转链表
1. 题目 输入一个链表,反转链表后,输出新链表的表头。 2. 思路 重复下面的过程: 3.代码 /** * 题目:输入一个链表,反转链表后,输出新链表的表头。 */ public class Test15 { public static void main(String[] args) { ListNode node = new ListNode(10); ...原创 2019-11-05 12:58:20 · 92 阅读 · 0 评论 -
(14)链表倒数第k个节点
1. 题目 输入一个链表,输出该链表中倒数第k个结点。 2. 思路 使用快慢指针,一个指针比另一个指针快k步,当其到末尾时,最后一个数恰好到达了倒数第k步 3. 代码 /** * 题目:输入一个链表,输出该链表中倒数第k个结点。 */ public class Test14 { public static void main(String[] args) { } p...原创 2019-11-05 12:48:01 · 75 阅读 · 0 评论 -
(13)调整数组使奇数位于偶数前
1. 题目 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。 2.思路 将所有的奇数放入一个数组,偶数放入一个数组,再将偶数数组加到奇数数组上。 3.代码 /* * @author qianliu on 2019/4/22 10:50 * @Discription: * 1...原创 2019-11-05 11:01:33 · 112 阅读 · 0 评论 -
(12)数值的整数次方
1.题目 给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。 保证base和exponent不同时为0 2.思路 如果是exponent大于0,那么就是exponent个base相乘,如果exponent小于0就再次取倒数。 3.代码 /* * @author qianliu on 2019/4/21 19:26 * @Discrip...原创 2019-11-05 10:40:32 · 108 阅读 · 0 评论 -
(11)二进制中1的个数
1.问题 输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。 2. 思路 方法一:n乘以n-1会把n的二进制最右边的第一个1变成0 方法二:n的最后一个位 & 1,如果是1就是就说明最后一位是1 3.代码 /* * @author qianliu on 2019/4/21 15:47 * @Discription: * 1.问题: * 输入一个整数,输出该数二进制表示...原创 2019-11-05 10:29:14 · 290 阅读 · 0 评论 -
从01背包问题论回溯和动态规划
1. 回溯问题 回溯就是穷举法的一种,也就是举出所有可能性。 回溯法的思路: 1.如果当前节点放入数据An满足要求,那么继续检查下一个节点是否可以加入A1-An中的其他数据 2.如果当前节点不满足要求,直接放下一个数据An+1 下面是八皇后的一种深度优先遍历实现。所有的回溯法都满足该框架。 void backtrack (int t) { if (t>n) //放完八颗棋子,输出结果...原创 2019-09-15 21:32:36 · 684 阅读 · 0 评论 -
ccf考试201712_2之游戏
问题描述 有n个小朋友围成一圈玩游戏,小朋友从1至n编号,2号小朋友坐在1号小朋友的顺时针方向,3号小朋友坐在2号小朋友的顺时针方向,……,1号小朋友坐在n号小朋友的顺时针方向。 游戏开始,从1号小朋友开始顺时针报数,接下来每个小朋友的报数是上一个小朋友报的数加1。若一个小朋友报的数为k的倍数或其末位数(即数的个位)为k,则该小朋友被淘汰出局,不再参加以后的报数。当游戏中只剩下一个小朋友时...原创 2019-03-13 15:04:43 · 318 阅读 · 0 评论 -
关于常见大数据算法以及思考
给定a、b两个文件,每个文件中有海量的数据,内存不足,让你找出a、b文件共同数据? 思考: (1) 布隆过滤器: 在输入数据时就将a文件的所有的数据的hashcode映射到一个集合(这里假设是一个数组arr[max]),此时b文件每次读取一条数据就计算出它的hashcode,加入此时为i,去数组中查找arr[i],如果arr[i]存在,则表示a文件中也有这个数据。 缺点:如果两个数据的hashco...原创 2019-01-15 14:24:19 · 499 阅读 · 0 评论 -
初识协同过滤算法,以及hadoop中Mahout实现
1.推荐系统简介 推荐系统广泛存在于各类网站中,作为一个应用为用户提供个性化的推荐。它需要一些用户的历史数据,一般由三个部分组成:基础数据、推荐算法系统、前台展示。基础数据包括很多维度,包括用户的访问、浏览、下单、收藏,用户的历史订单信息,评价信息等很多信息;推荐算法系统主要是根据不同的推荐诉求由多个算法组成的推荐模型;前台展示主要是对客户端系统进行响应,返回相关的推荐信息以供展示。 基础数据主...原创 2019-01-15 15:39:02 · 922 阅读 · 0 评论 -
brent算法为什么比floyd算法快
floyd 以龟兔赛跑来解释这一算法,寻找单链表中是否含有一个圈。 一、思想: 龟和兔子同时出发,龟走一步,兔子走两步,兔子比龟快,所以兔子一定可以追上龟,就好像在环形跑道中跑的快的运动员会从后面超过跑得慢的运动员。龟兔的行走距离差,恰好是龟的行近距离,龟的行近距离即是循环的倍数。 二、尋找循環起點: 龜退回起點,兔原地待命,龜兔同時出發,龜走一步、兔走一步。龜兔相遇之處即是循環起點。 三、尋找...原创 2019-01-21 22:32:58 · 2336 阅读 · 1 评论 -
ccf考试201809_3元素选择器
代码评分:40 总结:(1)还是那个意思,如果在较短的时间内拿到差不多的分数就够了,其他时间可以放在第4题上面试试能不能也拿几十分。 import java.util.ArrayList; import java.util.Arrays; import java.util.Scanner; public class Main { public static void main(S...原创 2019-03-08 16:34:15 · 165 阅读 · 0 评论 -
ccf考试201812-1之小明上学
题目背景 小明是汉东省政法大学附属中学的一名学生,他每天都要骑自行车往返于家和学校。为了能尽可能充足地睡眠,他希望能够预计自己上学所需要的时间。他上学需要经过数段道路,相邻两段道路之间设有至多一盏红绿灯。 京州市的红绿灯是这样工作的:每盏红绿灯有红、黄、绿三盏灯和一个能够显示倒计时的显示牌。假设红绿灯被设定为红灯 r 秒,黄灯 y 秒,绿灯 g 秒,那么从 0 时刻起,[0,r) 秒内亮红...原创 2019-03-06 14:45:15 · 191 阅读 · 0 评论 -
ccf考试201812_2之小明放学
题目背景 汉东省政法大学附属中学所在的光明区最近实施了名为“智慧光明”的智慧城市项目。具体到交通领域,通过“智慧光明”终端,可以看到光明区所有红绿灯此时此刻的状态。小明的学校也安装了“智慧光明”终端,小明想利用这个终端给出的信息,估算自己放学回到家的时间。 问题描述 一次放学的时候,小明已经规划好了自己回家的路线,并且能够预测经过各个路段的时间。同时,小明通过学校里安装的“智慧光明”终端,...原创 2019-03-06 14:49:26 · 172 阅读 · 0 评论 -
ccf考试201812_3之 CIDR合并
代码评分:60 总结:考场中这种代码的工程量很大,需要不断地调试很费时间,不如得一部分分数就放手 import java.util.ArrayList; import java.util.List; import java.util.Scanner; public class test2 { public static void main(String[] args) { ...原创 2019-03-06 14:52:36 · 861 阅读 · 0 评论 -
ccf考试201803_1之跳一跳
问题描述 近来,跳一跳这款小游戏风靡全国,受到不少玩家的喜爱。 简化后的跳一跳规则如下:玩家每次从当前方块跳到下一个方块,如果没有跳到下一个方块上则游戏结束。 如果跳到了方块上,但没有跳到方块的中心则获得1分;跳到方块中心时,若上一次的得分为1分或这是本局游戏的第一次跳跃则此次得分为2分,否则此次得分比上一次得分多两分(即连续跳到方块中心时,总得分将+2,+4,+6,+8…)。 现...原创 2019-03-08 21:21:56 · 144 阅读 · 0 评论 -
ccf考试201803_2之碰撞的小球
问题描述 数轴上有一条长度为L(L为偶数)的线段,左端点在原点,右端点在坐标L处。有n个不计体积的小球在线段上,开始时所有的小球都处在偶数坐标上,速度方向向右,速度大小为1单位长度每秒。 当小球到达线段的端点(左端点或右端点)的时候,会立即向相反的方向移动,速度大小仍然为原来大小。 当两个小球撞到一起的时候,两个小球会分别向与自己原来移动的方向相反的方向,以原来的速度大小继续移动。 ...原创 2019-03-09 13:05:24 · 152 阅读 · 0 评论 -
ccf考试201809_1之卖菜
问题描述 在一条街上有n个卖菜的商店,按1至n的顺序排成一排,这些商店都卖一种蔬菜。 第一天,每个商店都自己定了一个价格。店主们希望自己的菜价和其他商店的一致,第二天,每一家商店都会根据他自己和相邻商店的价格调整自己的价格。具体的,每家商店都会将第二天的菜价设置为自己和相邻商店第一天菜价的平均值(用去尾法取整)。 注意,编号为1的商店只有一个相邻的商店2,编号为n的商店只有一个相邻的商...原创 2019-03-07 14:21:10 · 137 阅读 · 0 评论 -
ccf考试201809_2之买菜
问题描述 小H和小W来到了一条街上,两人分开买菜,他们买菜的过程可以描述为,去店里买一些菜然后去旁边的一个广场把菜装上车,两人都要买n种菜,所以也都要装n次车。具体的,对于小H来说有n个不相交的时间段[a1,b1],[a2,b2]…[an,bn]在装车,对于小W来说有n个不相交的时间段[c1,d1],[c2,d2]…[cn,dn]在装车。其中,一个时间段[s, t]表示的是从时刻s到时刻t这段...原创 2019-03-07 14:46:46 · 360 阅读 · 0 评论 -
ccf考试201812_4之数据中心
样例输入 4 5 1 1 2 3 1 3 4 1 4 5 2 3 8 3 4 2 样例输出 4 样例说明 下图是样例说明。 代码评分:20 总结:(1)这个题目的难度就在于kruskal算法的编写以及优化。可以看出,我们只需要直接找出kruskal的最小生成树,然后找出树中最大的边即可。 (2)至于为什么评分这么低,可以通过代码的评分细则可以知道,都是因为超时惹的祸,代码做出来以后系统的...原创 2019-03-07 16:55:30 · 232 阅读 · 0 评论 -
ccf考试201803_3之URL映射
问题描述 URL 映射是诸如 Django、Ruby on Rails 等网页框架 (web frameworks) 的一个重要组件。对于从浏览器发来的 HTTP 请求,URL 映射模块会解析请求中的 URL 地址,并将其分派给相应的处理代码。现在,请你来实现一个简单的 URL 映射功能。 本题中 URL 映射功能的配置由若干条 URL 映射规则组成。当一个请求到达时,URL 映射功能会将...原创 2019-03-13 13:33:43 · 192 阅读 · 0 评论 -
ccf考试201812_1之URL映射
问题描述 给定n个数,请找出其中相差(差的绝对值)最小的两个数,输出它们的差值的绝对值。 输入格式 输入第一行包含一个整数n。 第二行包含n个正整数,相邻整数之间使用一个空格分隔。 输出格式 输出一个整数,表示答案。 样例输入 5 1 5 4 8 20 样例输出 1 样例说明 相差最小的两个数是5和4,它们之间的差值是1。 样例输入 5 9 3 6 1 3 样例输出 0 样例说...原创 2019-03-13 13:37:27 · 258 阅读 · 0 评论 -
a[i]=a[i+1]+a[i-1]-a[i]求最大值
题目:有一个长度为n的实数数组a,可以进行任意轮的操作,每一轮选择一个i(0<i<n-1),操作为a[i]=a[i+1]+a[i-1]-a[i],最终a[0]+a[2]+…+a[n-1]最大可以是多少? 分析:题目的难点不是编码的问题,而是数据证明怎么样可以得到这样a[0]+a[2]+…+a[n-1]最大值问题。 证明如下: ...原创 2019-01-15 12:51:59 · 1552 阅读 · 0 评论