数据结构
一米阳光 zs
这个作者很懒,什么都没留下…
展开
-
查找一个字符串中第一个只出现两/一次的字符
题目:查找一个字符串中第一个只出现两/一次的字符一、查找一个字符串中第一个只出现两次的字符。比如:“abcdefabcdefabc”中第一个只出现两次为‘d’,要求时间复杂度为O(N),空间复杂度为O(1)。分析问题:方法1、O(N^2) 看到这道题时,最直观的想法是从头开始扫描这个字符串中的每个字符。当访问到某字符时拿这个字符和后面的每个字符相比较,如果后面出现两次该字符,那原创 2017-07-26 20:47:39 · 1631 阅读 · 0 评论 -
希尔排序(Shell Sort)
希尔排序(Shell Sort)希尔排序(Shell Sort)又称为“缩小增量排序”。该方法的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量gap”的元素组成的)分别进行直接插入排序,然后依次缩减增量(最小为1时就变成直接插入排序),再进行排序,待整个序列中的元素基本有序(此排序可称为预排序)(增量足够小)时,再对全体元素进行一次直接插入排序。因为直接插入排序在元素基本原创 2016-11-19 09:40:25 · 513 阅读 · 0 评论 -
B-树
B-树是一种平衡的多叉树,称为B树。(有些地方写的是B-树,注意不要误读 成"B减树") 一棵M阶(M>2)的B树,是一棵平衡 的 M路平衡搜索树,可以是空树或者满足一下性质: 1. 根节点至少有两个孩子 2. 每个非根节点有[ M/2,M]个孩子 3. 每个非根节点有[M/2 -1,M-1]个关键字,并且以升序排列原创 2016-11-13 22:41:58 · 399 阅读 · 0 评论 -
大数据处理
首先分析几道看似相似解法不同的面试题: 一、 题给两个⽂文件,分别有100亿个整数,我们只有1G内存,如何找到两个⽂文件交集!用近似法和精确法来处理。 二、给两个⽂文件,分别有100亿个字符,我们只有1G内存,如何找到两个⽂文件交集!用精确法和近似法来处理。 1)题目给有内存大小限制,所以打消直接存储的方法,当然也不现实。 2)有存储原创 2016-11-10 12:48:42 · 694 阅读 · 0 评论 -
分享一次调试bug遇到的问题及解决方法
一次调试遇上了这样的bug: error C2679: 二进制“=”: 没有找到接受...类型的右操作数的运算符(或没有可接受的转换)原创 2016-11-10 10:54:55 · 783 阅读 · 0 评论 -
文本文件和二进制文件的区别
特别说明:由于大家在 I/O 存取上以 txt 文件为主,且读取比存储更麻烦(存储的话 fwrite, fprintf 基本够用),因此下面的讨论主要集中在“txt 文件的读取”上。除了标注了“转”之外,其余心得均出于本人经验之结果,欢迎大家指正、补充。一. 基本知识:对于文本文件和二进制文件,很多人依然稀里糊涂,即使懂了些编程的东西。有些有有些开发经验的,也不一定能说的清楚。对于初学者来原创 2016-11-10 10:43:22 · 815 阅读 · 0 评论 -
位图BitMap与布隆过滤器BloomFilter
首先先看一下下面有关大数据的面试题:给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在这40亿个数中。 思路一: 最容易想到的解法就是遍历所有的40多亿个整数,然后一个一个判断。但是这个需要花费的内存是多大呢?将40亿数据保存起来(保存在数组、链表、树中),再和该数判断是否相等?那我们来计算下需要消耗多少内存:原创 2016-11-10 10:38:20 · 2025 阅读 · 0 评论 -
据前序遍历和中序遍历重建二叉树
这是一道面试题由前序遍历和中序遍历重建二叉树(前序序列:1 2 3 4 5 6 - 中序序列:3 2 4 1 6 5)数据不含重复值这个可以分析一下前序遍历序列1 2 3 4 5 6,前序遍历规则是根--左--右中序遍历序列3 2 4 1 6 5,中序遍历规则是左--根--右由前序遍历可知根节点为第一个元素1,在中序遍历序列中找到1对应位置,则1的左边就是左子树324,右边原创 2016-11-24 18:08:00 · 469 阅读 · 0 评论 -
链表面试题之链表逆置、指定前k个逆置
单链表逆置我们大概很熟悉,但对于链表前k个逆置,可能不大常见,这是一道链表逆置的变种,其中变种的还有链表倒数第k个、链表k个组成一组,组内逆置,在这里我给大家分享一下我的想法。对于单链表的逆置有两种方法可以实现:(1)利用辅助指针基本思想:在遍历结点过程中,设置辅助指针,用于记录先前遍历的结点。这样依次编译的过程中只需修改其后继结点的next域即可。typedef int原创 2017-07-26 20:17:26 · 1011 阅读 · 0 评论 -
二叉树面试题之二叉树镜像
首先分析,互为镜像,也就是说,一个节点的左右子树互相交换位置,因此采用递归的方法较为简单,且方便理解,即镜像步骤:1)、交换根结点的左右子树节点。2)、交换左子树(以图中10为例)的左右节点。三、交换右子树(以图中6为例)的左右结点。总结上面过程,一颗树的镜像过程:先前序遍历树的每个节点,如果遍历到节点有子节点,就交换它的两个子节点,当交换完所有非叶子节点的左右子节点之后,就得到了原创 2017-07-26 19:06:09 · 468 阅读 · 0 评论 -
剑指offer--递归非递归合并两个有序链表
面试题:合并两个有序链表,合并之后需要变为有序对于此题,我想到的有两种解法:递归和非递归递归实现://递归Node *MergeList(Node *pHead1, Node*pHead2){ if (pHead1 == NULL) return pHead2; else if (pHead2 == NULL) return pHead1; else {原创 2017-07-13 23:09:26 · 927 阅读 · 0 评论 -
剑指offer---复杂链表复制
剑指offer面试题---复杂链表复制分析此题:1.首先要将链表的每一个节点复制一份,连在被复制节点后面。 2.将对应的指向关系也对应复制。 3.分离原链表、复制链表。代码实现:struct ComplexListNode{ int _data; ComplexListNode* _next;原创 2017-07-13 23:25:37 · 755 阅读 · 0 评论 -
二叉树面试题之判断一棵树是否为另一棵树的子树
判断一棵树是否为另一棵树的子树题目:二叉树的结点定义如下:struct TreeNode{ int m_nValue; TreeNode* m_pLeft; TreeNode* m_pRight;};输入两棵二叉树A和B,判断树B是不是A的子结构。例如,下图中的两棵树A和B,由于A中有一部分子树的结构和B是一样的,因此B就是A的原创 2017-07-26 13:10:57 · 1412 阅读 · 0 评论 -
链表面试题之链表相交问题
判断两个链表是否相交以及如果相交则求出交点 首先最容易想到就是分为不带环的链表相交问题和带环链表相交问题不带环链表相交在这里我提供两种种不带环链表判断相交的思路:既然两条链表相交且不带环, 思路1:那么两条链表的最后一个结点必然是同一个结点,我们就可以通过判断两条链表的最后一个结点来判断链表是否相交的问题了, 假设其中一条链表有m个结点而另一条链表有n个结点,原创 2017-07-25 10:08:29 · 1088 阅读 · 0 评论 -
C++创建一个类(1.只能在堆上创建; 2 只能在栈上创建; 3 不能被继承(堆上和栈上都可以创建))
1 只能在堆上创建对象(不能被继承,不能再栈上创建对象) 将类的构造函数声明为private,但是为了 创建该类的对象,则必须提供创建对象和释放对象的接口, 用static函数成员实现。 #include using namespace std; class HeapOnly { public: static HeapO原创 2017-07-15 21:55:25 · 1156 阅读 · 0 评论 -
判断单链表是否带环? 若带环, 求环的长度? 求环的入口点?
给定一个单链表,只给出头指针h:判断单链表是否带环? 若带环, 求环的长度? 求环的入口点?* 问题1:判断是否存在环?用快慢指针求,快指针一次两步,慢指针一次一步,如果带环的话那么两指针必定在环内有一个交点,如果快指针fast或者fast->next走到NULL的话,则说明链表不带环。//这里可以返回一个pair类型的值//因为后面求长度还需要用到这个交点pa原创 2017-07-15 20:59:06 · 848 阅读 · 1 评论 -
剑指offer--实现一个Add函数,让两数相加,不能使用+、-、*、/、++、--等四则运算符
分析:这又是一道考察发散思维的很有意思的题目。当我们习以为常的东西被限制使用的时候,如何突破常规去思考,就是解决这个问题的关键所在。看到的这个题目,首先我们可以分析人们是如何做十进制的加法的,比如是如何得出5+17=22这个结果的。实际上,我们可以分成三步的:第一步只做各位相加不进位,此时相加的结果是12(个位数5和7相加不要进位是2,十位数0和1相加结果是1);第二步做进位,5+原创 2017-07-14 23:10:00 · 2672 阅读 · 3 评论 -
二叉搜索树的基本功能实现
二叉查找树(Binary Search Tree),又被称为二叉搜索树。设x为二叉查找树中的一个结点,x节点包含关键字key,节点x的key值记为key[x]。如果y是x的左子树中的一个结点,则key[y] = key[x]。在二叉查找树中:(01) 若任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值;(02) 任意节点的右子树不空,则右子树上所有结原创 2016-10-18 18:51:16 · 578 阅读 · 0 评论 -
二叉树详解
一、三种遍历方式的递归实现(比较简单,这里不详细讲解1、先序遍历——按照“根节点-左孩子-右孩子”的顺序进行访问。 2、中序遍历——按照“左孩子-根节点-右孩子”的顺序进行访问。void in_traverse(BTree pTree){ if(pTree) { if(pTree->pLchild) in_traverse(pTree->pLchild);原创 2016-09-25 21:38:26 · 4970 阅读 · 0 评论 -
二叉树的递归与非递归实现
本文实现了二叉树的创建及其成员函数的实现成员函数包括:1)构造函数2)拷贝构造函数3)赋值运算符重载4)先序遍历(先根遍历)(递归与非递归)5)中序遍历(递归与非递归)6)后序遍历(后根遍历)(递归与非递归)7)层序遍历8)节点个数9)叶子节点个数10)二叉树深度11)查找二叉树节点12)第k层节点的个数(两种方法)二叉树的实现:原创 2016-09-25 21:33:52 · 734 阅读 · 0 评论 -
稀疏矩阵的对称矩阵的转置
SymmentryMatrix(对称矩阵) 对称矩阵和对称矩阵的压缩存储> 设一个N*N的方阵Array,Array中任意元素Arrayij,当且仅当Arrayij == Arrayji(0 <= i <= N-1 && 0 <= j 我们发现如果将该对称矩阵的每个元素都存入则会存在内存浪费问题,那仫如何解决? 这就提到了对称矩阵的压缩存储了原创 2016-09-24 17:40:24 · 828 阅读 · 0 评论 -
广义表的递归实现
广义表的定义广义表是非线性的结构,是线性表的一种扩展,是有n个元素组成有限序列。广义表的定义是递归的,因为在表的描述中又得到了表,允许表中有表。例如 A = () B = (a,b) C = (a,b,(c,d)) D = (a,b,(c,d),(e,(f),h)) E = (((),())小原创 2016-09-24 17:27:37 · 2374 阅读 · 1 评论 -
完整版二叉树
网上看一大神写的加上自己总结的分享给大家[cpp] view plain copy print?BinaryTree.h [cpp] view plain copy print?#ifndef BINARY_TREE #define BINARY_TREE #include #include #include #include原创 2016-10-10 15:18:44 · 343 阅读 · 0 评论 -
二叉树线索化实现
二叉树线索化 二叉树是一种非线性结构,遍历二叉树几乎都是通过递归或者用栈辅助实现非递归的遍历。用二叉树作为存储结构时,取到一个节点,只 能获取节点的左孩子和右孩子,不能直接得到节点的任一遍历序列的前驱或者后继。为了保存这种在遍历中需要的信息,我们利用二叉树中指向左右子树的空指针来存放节点的前驱和后继信息。enum PointerTag {THR原创 2016-10-10 11:17:12 · 445 阅读 · 0 评论 -
两个队列实现一个栈
两个队列实现栈实现一思路 q1是专职进出栈的,q2只是个中转站•入栈:直接入队列q1即可•出栈:把q1的除最后一个元素外全部转移到队q2中,然后把刚才剩下q1中的那个元素出队列。之后把q2中的全部元素转移回q1中原创 2016-09-16 09:54:27 · 481 阅读 · 0 评论 -
布隆过滤器详解
布隆过滤器(Bloom Filter)详解 布隆过滤器[1](Bloom Filter)是由布隆(Burton Howard Bloom)在1970年提出的。它实际上是由一个很长的二进制向量和一系列随机映射函数组成,布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率(假正例False positives,转载 2016-11-09 09:28:40 · 433 阅读 · 0 评论 -
二叉搜索树基本功能实现
二叉查找树(Binary Search Tree),又被称为二叉搜索树。它是特殊的二叉树:对于二叉树,假设x为二叉树中的任意一个结点,x节点包含关键字key,节点x的key值记为key[x]。如果y是x的左子树中的一个结点,则key[y] = key[x]。那么,这棵树就是二叉查找树。如下图所示:在二叉查找树中:(01) 若任意节点的左子树不空,则左子树上所有结点的值均小于它的根结原创 2016-10-23 21:12:57 · 219 阅读 · 0 评论 -
搜索二叉树基本功能实现(源代码)
功能实现已经介绍过了详见:http://blog.csdn.net/fangfang_666/article/details/52904520源代码:#include#includeusing namespace std;templatestruct BinarySearchNode{ BinarySearchNode * _left; BinarySearchNode *原创 2016-10-23 21:10:09 · 567 阅读 · 0 评论 -
实现一个栈(元素遵守先入后出顺序),能够通过 min 方法在 O(1)时间内获取栈中的最小元素。同时,栈的基本操作:入栈(Push)、出栈(Pop),也是在O(1)时间内完成的
实现一个栈(元素遵守先入后出顺序),能够通过 min 方法在 O(1)时间内获取栈中的最小元素。同时,栈的基本操作:入栈(Push)、出栈(Pop),也是在O(1)时间内完成的。此问题可分析为:方案一:建立两个栈,一个用来存放插入的数据datastack,一个用来存放最小的数据minstack;当最小栈不为空时,在datastack中插入一个数据,先用一变量tmp来存放minstack原创 2016-09-18 16:56:00 · 2105 阅读 · 0 评论