算法
文章平均质量分 80
kongmin_123
每天进步一点点。
展开
-
BitSet的实现原理
1.BitSet介绍Bitset是Java中的一种数据结构。Bitset中主要存储的是二进制位,做的也都是位运算,每一位只用来存储0,1值,主要用于对数据的标记。Bitset的基本原理是,用1位来表示一个数据是否出现过,0为没有出现过,1表示出现过。使用的时候可以根据某一个位是否为0表示此数是否出现过。JDK中的BitSet集合对是布隆过滤器中经常使用的数据结构Bitmap的相对简单的实现...原创 2018-08-31 15:19:35 · 21728 阅读 · 2 评论 -
连续子数组的最大和
题目描述HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。给一个数组,返回它的最大连续子序...原创 2018-09-05 23:06:04 · 20543 阅读 · 5 评论 -
“和为S的两个数字”和“和为S的连续正数序列”
题目描述和为S的两个数字:输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。输出描述:对应每个测试案例,输出两个数,小的先输出。因为给出的数组是排好序的,所以我们就可以在有序数组中放两个指针用于查找符合条件的两个数字。首先定义两个指针,第一个指针指向数组的第一个(最小的)数字,第二个指针指向数组的第二...原创 2018-09-09 09:36:42 · 283 阅读 · 0 评论 -
序列化二叉树
题目描述请实现两个函数,分别用来序列化和反序列化二叉树。根据树的前序遍历序列和中序遍历序列可以唯一的构造出一棵二叉树。受此启发,我们可以先把一棵二叉树序列化成一个前序遍历序列和中序遍历序列,然后在反序列化时通过这两个序列重构出原二叉树。这种思路有两个缺点:一是该方法要求二叉树中不能有重复的节点,二是只有当两个序列中的所有数据都读出后才能开始反序列化。如果两个遍历序列的数据是从一个流里读...原创 2018-09-08 21:09:58 · 834 阅读 · 0 评论 -
对称的二叉树
题目描述请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。例如,在下图所示的三棵二叉树中,第一棵二叉树是对称的,而另外两棵不是。我们通常有3种不同的二叉树遍历算法,即前序遍历、中序遍历和后序遍历。在这三种遍历算法中,都是先遍历左子结点再遍历右子结点。那么我们是否可以定义一种遍历算法,先遍历右子结点再遍历左子结点?比如我们针...原创 2018-09-02 17:56:02 · 430 阅读 · 0 评论 -
二叉树的镜像
题目描述操作给定的二叉树,将其变换为源二叉树的镜像。输入描述:二叉树的镜像定义: 源二叉树 镜像二叉树 8 8 / \ / \ 6 10 10 6 / \...原创 2018-09-02 16:25:15 · 771 阅读 · 0 评论 -
两个链表的第一个公共节点
问题描述输入两个链表,找出它们的第一个公共结点。含有公共节点的两个链表的结构类似于下图中的链表:可以看到两个链表中有一个公共节点,其中橙色的节点就是这两个链表的公共节点。 看到这个题目,容易想到的方法是使用蛮力法解决:在第一个链表上顺序遍历每一个节点,每遍历到一个节点,就在第二个链表上顺序遍历每个节点。如果在第二个链表上有一个节点与第一个链表上的节点一样,则说明两个链表在这个...原创 2018-09-02 15:34:28 · 18539 阅读 · 13 评论 -
链表中环的入口节点
问题描述给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。有环链表类似于下图中的链表:可以看到该链表中有一个环,其中橙色的节点就是这个链表中环的入口节点。 解决这个问题可以分三步。(1)第一步是确定一个链表中是否包含环。我们可以用两个指针来解决这个问题。定义两个指针,同时从链表的头结点出发,一个指针一次走一步,另一个指针一次走两步。如果走得快的指针追...原创 2018-09-02 13:44:11 · 5570 阅读 · 3 评论 -
判断链表是否有环?
题目描述有一个单向链表,链表当中有可能出现“环”,就像下图这样。如何用程序判断出这个链表是有环链表? 方法一:首先从头节点开始,依次遍历单链表的每一个节点。每遍历到一个新节点,就从头节点重新遍历新节点之前的所有节点,用新节点ID和此节点之前所有节点ID依次作比较。如果发现新节点之前的所有节点当中存在相同节点ID,则说明该节点被遍历过两次,链表有环;如果之前的所有节点当中不存在相同的节点...原创 2018-09-02 11:03:52 · 1504 阅读 · 0 评论 -
反转链表
题目描述输入一个链表,反转链表后,输出新链表的表头。链表的数据结构如下:public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; }}[反转链表]也叫做[链表逆置].比如一个链表是这样的:1->2-&...原创 2018-08-30 12:36:31 · 273 阅读 · 0 评论 -
Bitmap算法简介
Bitmap算法中文又叫做位图算法。那么什么是Bitmap算法呢?位图算法中的位图是内存中连续的二进制位(bit),用于对大量整形数据做去重和查询。举个例子,给定一块长度是10bit的内存空间,想要依次插入整形数据4,2,1,3。我们需要怎么做呢?1. 给定长度是10的bitmap,每一个bit位分别对应着从0到9的10个整型数。此时bitmap的所有位都是0。2. 把整型数4...原创 2018-09-01 23:23:16 · 15816 阅读 · 3 评论 -
BitSet的应用
1.BitSet介绍BitSet是用于存储二进制位和对二进制进行操作的Java数据结构,BitSet从jdk1.0开始就有了。它存储的是二进制位在BitSet中状态,根据对这些状态的判断,可以有很多应用。以前对数据的操作都是先把数据都是存储在内存中间的,现在可以通过设置BitSet的相应位达到存储数据信息的目的,极大的节省了内存空间。2.BitSet应用BitSet可以做的事情主要分为...原创 2018-09-01 22:32:28 · 3478 阅读 · 1 评论 -
青蛙变态跳台阶问题
题目描述一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。分析:因为n级台阶,第一步有n种跳法:跳1级、跳2级、到跳n级跳1级,剩下n-1级,则剩下跳法是f(n-1)跳2级,剩下n-2级,则剩下跳法是f(n-2)所以f(n) = f(n-1) + f(n-2) + ... + f(1)因为f(n-1) = f(n-2)...原创 2018-08-29 23:17:21 · 3256 阅读 · 2 评论 -
青蛙跳台阶问题
题目描述一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。首先我们考虑最简单的情况。如果只有1级台阶,那显然只有一种跳法。如果有两级台阶,那就有两种跳法:一种是分两次跳,每次跳1级;另一种就是一次跳2级。接着我们再谈论一般情况。我们把n级台阶时的跳法看成n的函数,记为f(n)。当n>2 时,第一次跳的时候就有两种...原创 2018-08-29 21:41:45 · 2388 阅读 · 0 评论 -
二叉树的前序中序和后续遍历及应用场景
二叉树的结构定义public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; }}二叉树的遍历通常有前序,中序和后续三种。遍历算法通常使用递...原创 2018-08-25 21:42:37 · 14760 阅读 · 1 评论 -
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
题目描述输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。分析:首先需要判断n是不是负数,当n为负数的时候,直接用while循环判断会导致死循环,因为负数向左移位的话最高位补1 。针对这种情况,要不就是对正数和负数的操作应该分开处理,要不就是找到一个对正数和负数都可以处理的方法。如果是第二种方法可以把int型转成二进制的string类型,再统计string类型中1的个...原创 2018-08-25 20:12:38 · 8721 阅读 · 2 评论 -
“二叉树的深度”和“平衡二叉树”
题目描述二叉树的深度:输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。二叉树的节点定义如下:public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public Tre...原创 2018-09-10 09:38:35 · 2186 阅读 · 0 评论