数据结构与算法
文章平均质量分 71
承诺的永远
这个作者很懒,什么都没留下…
展开
-
打印所有和为s的连续正序列
题目描述:输入正整数s,打印出所有和为s的连续序列。解题思路:将正整数序列1-s按照升序排列,分别用small和big指向序列中的最小值和最大值,计算从small至big这一范围内所有值的和。如果计算的和大于s,则将small指针向前移动,即删除此时序列中的最小值;如果经计算的和小于s,则将big指针向后移动,即增大序列的和;直至small指针指到原序列的中间为止。初始化时,small和big原创 2016-08-16 20:43:20 · 651 阅读 · 0 评论 -
二叉搜索树转换为双向链表
二叉搜索树转换成对应的双向链表,不能生成新的节点,只允许改变节点的的指针。解题思路:由于按照中序遍历方法遍历二叉搜索树得到的结果是有序的,因此可以按照中序遍历方法遍历搜索树。定义函数BinaryTreeNode* Transfer(BinaryTreeNode* root),该函数将以节点root为根节点的二叉树转换为对应的有序双向链表,并返回该双向链表的头节点指针。具体代码如下:// Conso原创 2016-08-31 21:38:45 · 311 阅读 · 0 评论 -
归并排序的应用
在数组中的两个数如果前一个数大于后面的数,则这两个数组成逆序对。解题思路:将数组中的元素两两划分为单一数组元素,用high1和high2分别表示相邻两个数组中末尾元素的位置,如果数组1中的high1的元素大于数组2中high2的元素,则high1与数组2中的所有元素构成逆序对(数组1和数组2均为递增数组),统计逆序对个数,high1--;否则,high2--;同时对数组1和数组2中的元素作归并原创 2016-08-22 16:33:07 · 700 阅读 · 0 评论 -
键树
键树又称数字查找树,它是一棵度大于等于2的树,树中的节点不是包含一个或几个关键字,而只是包含组成关键字的符号。如果关键字是数值,则节点中的元素为一位的数字;如果关键字为字符,则节点中的元素为26个字符。如下是一棵键树。从根节点到叶子结点路径上的元素组成一个关键字,其中叶子结点的特殊字符表示字符串的结束。叶子节点中有指向关键字记录的指针。为了查找的方便,我们约定同一层兄弟原创 2016-08-24 10:17:12 · 1883 阅读 · 0 评论 -
把数组中的数字拼接起来组成最小的数
例如输入数组{3,32,321},则拼接起来的最小数为321323。假设有两个数m和n,我们定义mnm,则有m>n。m和n都是int范围内的数字,它们拼接起来的数字很可能超出int所能表示的范围。在这里,我们把数字转换为字符串。将数字按上面定义的比较方式从小到大排序,那么得到的组合数字最小。相关数学证明可以网上搜寻。源码如下:// ConsoleApplication60.cp转载 2016-08-24 19:12:01 · 6168 阅读 · 1 评论 -
打印从1到最大n位数
剑指Office上的一道题打印从1到最大位数解题思路:由于n的值未知,我们必须考虑n位数的溢出问题。在这里我们并没有使用int型的数组保存最大值,而是使用char型数组保存数值。具体代码如下:// ConsoleApplication20.cpp : 定义控制台应用程序的入口点。//打印从1到最大的n位数#include "stdafx.h"#include#i原创 2016-09-15 16:27:00 · 478 阅读 · 0 评论 -
Bit-Map
位图(Bit-Map)使用位数组来存取元素,判断某些元素是否存在。由于使用位为单元来存取元素,因此大大节省了存取空间。适用于海量数据的查找,删除及判重。先介绍比特编位方法,比特位从右往左位数升高,第一位编号为0,最高位编号为N-1。对于一个int a[4]的数组而言,由于一个int型占用4字节,一字节占8bit,因此一共有128bit,其中a[0]:0----31a[1]:32----原创 2016-09-04 14:14:03 · 316 阅读 · 0 评论 -
链表中的公共节点
求取来拿表中的第一个公共节点。由于链表中的节点都有一个指向下一个节点的指针,当某个节点公共时,意味着该公共节点指向的下一个节点也公共,即第一个公共节点后的所有节点公共。因此,两条链表按公共节点重叠后呈现Y型。我们可以先计算两条链表的长度差,该长度差就是长链表优先要走的步数,之后两链表就一个一个对应比较,直到找到第一个公共节点为止。具体代码如下:// ConsoleApplicati原创 2016-08-25 16:31:46 · 2793 阅读 · 0 评论 -
丑数
我门把只含有因子2,3,5的数称为丑数。求按从小到大排列的第1500个丑数。习惯上,我门把1当作第一个丑数。假设前i个丑数已经按序排列,现在求第i+1个丑数。很显然,第i+1个丑数为前i个丑数分别乘以2或乘以3或乘以5后大于第i个丑数的最小丑数。假设T2为前i个数乘以2后第一个大于第i个丑数的数,T3为前i个数乘以3后第一个大于第i个丑数的数,T5为前i个数乘以5后第一个大于第i个丑数的数,那么第原创 2016-08-25 20:39:01 · 251 阅读 · 0 评论 -
第一个只出现一次的字符
在字符串中找出只出现一次的字符。我们可以使用哈希表结构解决此问题。以哈希表的键值作为字符,对应的出现次数为值。具体代码如下:// ConsoleApplication3.cpp : 定义控制台应用程序的入口点。//计算只出现一次的字符#include "stdafx.h"#include#includeusing namespace std;char FirstNotR原创 2016-08-25 21:14:11 · 280 阅读 · 0 评论 -
循环有序数组中查找指定值
循环数组中查找是否存在指定值的思想是:由于是循环有序数组,那就说明该数组通过循环移位可以成为有序数组,即该数组可以划分为两个有序的部分,且前一部分的元素都不小于后一部分元素,也就是形如{7,8,9,1,2,3,4}的数组。我门可以借鉴二分查找的方法解决。使用low和high指针分别指向数组首尾部元素,当low所指元素小于high所指元素时,此时数组为有序数组,可以直接使用二分法查找;当low所指元原创 2016-08-21 20:43:03 · 2172 阅读 · 0 评论 -
原路归并
// ConsoleApplication55.cpp : 定义控制台应用程序的入口点。//原地归并排序#include "stdafx.h"#include#includeusing namespace std;//将长度为n的数组逆转void reverse(int *arr, int n){ for (int i = 0; i < (n / 2); i++){ int原创 2016-08-21 20:01:43 · 300 阅读 · 0 评论 -
原地归并排序
传统二路归并排序在进行排序的过程中,需要使用长度为n的辅助空间存储原序列,再次,本文介绍一种新的排序方法---原地归并排序,该方法不需要使用额外的存取空间,空间复杂度为o(1)。原地归并排序是在二路归并的基础上进行的改进,在二路归并的归并操作中,原地归并不再使用不再使用长度为n的辅助空间,而是在原地进行归并操作。其具体步骤是;首先在已排好序的左序列中找到第一个数i,使其大于已排好序的右序列中的第一原创 2016-08-21 19:11:24 · 1253 阅读 · 1 评论 -
统计序列中出现一次的数字
数字序列中找出其中只出现一次的数字,而序列中的其他数字出现两次。原创 2016-08-16 16:00:50 · 914 阅读 · 0 评论 -
shell排序
Shell排序核心思想:首先将原序列划分为具有多个相同步长的子序列,对每个子序列进行插入排序,排完序列之后缩短步长值,再次进行划分并排序,直至序列基本有序为止。到目前为止,对于步长的取值仍没有特定的规则,一般而言,步长值每次缩短一半,直至为1.// ConsoleApplication50.cpp : 定义控制台应用程序的入口点。//shell sort#include "stdafx.h"原创 2016-08-18 19:32:51 · 435 阅读 · 0 评论 -
quicksort
快速排序核心思想:选择原序列中的某个数作为基准值,通过某种操作,使得基准值的左边的序列都小于基准值,基准值右边的序列都大于基准值,然后分别将左右两边的序列按照同样的操作进行排序,直至整个序列有序为止。// ConsoleApplication51.cpp : 定义控制台应用程序的入口点。//QuickSort#include "stdafx.h"#include#includeusin原创 2016-08-18 20:42:43 · 884 阅读 · 0 评论 -
排序
将由1,2,3组成的乱序序列数排序,使得排序后的顺序为1,2,3.核心思想:使用begin,end,current三个指针,初始时begin,current指向序列首部,end指向序列尾部。当current指向1时,current++;当current指向0时,current与begin指针的内容交换,current++,begin++;当current指向2时,current与end的内容交原创 2016-08-19 16:26:10 · 340 阅读 · 0 评论 -
后缀树
后缀树的构建及查询等应用原创 2016-08-29 21:12:46 · 533 阅读 · 0 评论 -
堆排序
堆排序---以二叉树的结构存储堆中元素,对于树中任一根节点而言,它的左子树和右子树要么都比它大或者比它小。堆排序分为两步:初始建堆,交换数据,重新建堆。原创 2016-08-20 15:00:46 · 349 阅读 · 0 评论 -
找出数组中出现超过1/4的三个数
原题:已知数组中有三个数超过了数组长度的1/4,请找出这三个数。// ConsoleApplication6.cpp : 定义控制台应用程序的入口点。//找出数组中出现1/4的三个数#include "stdafx.h"#include#include#includeusing namespace std;//数组中有三个数出现超过数组长度1/4,求这三个数void原创 2016-08-30 19:26:36 · 2051 阅读 · 0 评论 -
二路归并排序
二路归并排序的核心思想是对两个已排序的子序列进行两两归并合成一个子序列的过程。它是利用分治法求解的一个典型应用。设归并排序的当前区间是R[low..high],二路归并排序的主要步骤如下:1 将当前区间一分为二。2 分别对左右区间排序。3 对左右区间执行归并操作。其中归并操作的具体过程如下:首先申请辅助空间,将两个子序列相邻地复制到辅助空间中,然后依次在辅助空间中从左右区间取值原创 2016-08-20 19:06:56 · 1336 阅读 · 0 评论 -
华为笔试题
一、题目某软件需要实现建议的CD-KEY算法,输入3个正整数,以空格隔开,根据这3个整数生成CD-KEY字符串,输出格式XXXX-XXXX-XXXX-XXYY,包括16个字符,以短划线分开,其中,CD-KEY最后两个YY是用于CD-KEY的自校验,确保CD-KEY本身是合法的。CDKEY使用的字符表23456789ABCDEFGHJKLMNPQRSTUVWXYZ(由原创 2016-09-11 13:10:29 · 822 阅读 · 0 评论 -
复杂链表的复制
复杂链表的结构struct RandomListNode {int label;struct RandomListNode *next, *random;RandomListNode(int x) :label(x), next(NULL), random(NULL) {}};//其中random指向链表中的任意一个节点或者为空要在o(n)时间内完成链表的复原创 2016-09-07 13:05:10 · 338 阅读 · 0 评论