数据结构
zhuqianUESTC
这个作者很懒,什么都没留下…
展开
-
NowCoder的密码
nowcoder是个数学迷,他最喜欢研究“哥德巴赫猜想”,因此他的计算机密码也都采用素数。 但一直用同一个密码是不安全的,所以他要经常更换他的密码。但他只允许自己的密码中出现某些数字,且密码的每一位都不相同。比如1 2 4,则有6种情况124 142 214 241 412 421。其中241 和 421为素数。为了获得他的密码(他的机器上存放了第4届舜禹杯大学生程序设计竞赛的题目!),需要生原创 2016-09-07 15:34:25 · 595 阅读 · 0 评论 -
表示数值的字符串
//请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串“+100”、//“5e2”、"-123"、"3.1416"及"-1E-16"都表示数值,但“12e”,"1a3.14",“+-5”,"12e+5.4"都不是。#include "iostream"using namespace std;bool isNumber(char* str){ if (str =原创 2016-06-30 11:07:14 · 130 阅读 · 0 评论 -
用C++写一个不能被继承的类
//用c++设计一个不能被继承的类//方法1:把构造/析构函数设为私有,但这样就不能实例化了。//于是定义公有的静态函数来创建和释放类的实例。class sealedClass0{private: sealedClass0() {} ~sealedClass0() {}public: static sealedClass0* GetInstance() { return原创 2016-06-14 11:43:39 · 191 阅读 · 0 评论 -
有限制条件的求1+2+...+n
//求1+2+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字//及条件判断语句(A?B:C)//解法1:利用构造函数求解。关键是static的应用。class Temp{private: static unsigned int n; //static数据成员独立于该类的任意对象而存在,每个static数据成员是与类关联的对象 s原创 2016-06-14 10:56:34 · 330 阅读 · 0 评论 -
不用加减乘除做加法
//写一个函数,求两个整数之和,要求在函数体内不得使用 +,-,*,/ 四则运算符号。#include "iostream"using namespace std;//分三步:1.不算进位相加sum,2.仅算进位carry。3.sum与carry相加,这里循环了,如果carry为0,over。int add(int a, int b){ int sum_without_carry原创 2016-06-14 11:24:11 · 144 阅读 · 0 评论 -
圆圈中最后剩下的数字
//0,1,...,n-1这n个数字排成一个圆圈,从数字0开始每次从这个圆圈里删除第m个数字。//求出这个圆圈里剩下的最后一个数字。比如0,1,2,3,4,从0开始每次删除第3个数字,最后剩下3。#include "list"#include "iterator"using namespace std;//传统的环循环找,时间复杂度O(nm),空间复杂度O(n)int LastRe原创 2016-06-13 20:54:30 · 248 阅读 · 0 评论 -
扑克牌的顺子
//从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。//2~10为数字本身,A为1,J为11,Q为12,K为13,而大、小王可以看成任意数字。#include "iostream"using namespace std;//判断,大王小王用0表示 {0, 0, 1(A), 2~10, 11(J), 12(Q), 13(K)}const int maxLength原创 2016-06-13 17:26:23 · 301 阅读 · 0 评论 -
正则表达式的匹配
//请实现一个函数用来匹配包含‘.’和‘*’的正则表达式。模式中的字符‘.’表示任意一个字符,//而‘*’表示它前面的字符可以出现任意次(含0次)。在本题中,匹配是指字符串的所有字符匹配//整个模式。f:字符串“aaa”与模式“a.a”和“ab*ac*a”匹配,但与“aa.a”及“ab*a”均不匹配。#include "iostream"using namespace std;boo原创 2016-06-29 15:51:46 · 159 阅读 · 0 评论 -
数组中重复的数字
//在一个长度为n的数组里的所有数字都在0到n-1的范围内。数组中某些数字是重复的,但不知道哪几个//数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。例如://如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是重复的数字2或者3。#include "iostream"using namespace std;//hashtable,空间复杂原创 2016-06-29 15:50:49 · 225 阅读 · 0 评论 -
二叉树的下一结点
//给定一颗二叉树和其中一个结点,如何找出中序遍历顺序的下一个结点?树中//的结点除了有两个分别指向左右子结点的指针外,还有一个指向父结点的指针。#include "iostream"using namespace std;struct treeNode{ treeNode* left; treeNode* right; treeNode* parent; int valu原创 2016-07-01 15:06:07 · 131 阅读 · 0 评论 -
对称的二叉树
//请实现一个函数,用来判断一颗二叉树是不是对称的。如果一颗二叉树和它的镜像一样,//那么,它是对称的。#include "iostream"struct treeNode{ treeNode* left; treeNode* right; int value;};bool symmetricalSubtree(treeNode* rightTree, treeNode*原创 2016-07-01 15:51:48 · 200 阅读 · 0 评论 -
把二叉树打印成多行
//请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,//第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。#include "iostream"using namespace std;struct treeNode{ treeNode* left; treeNode* right; int value;};#inclu原创 2016-07-01 16:25:56 · 216 阅读 · 0 评论 -
机器人的运动范围
//地上有一个m行n列的方格。一个机器人从坐标(0,0)的格子开始移动,它每一次可以向//左右上下移动一格,但不能进入行坐标和列坐标的数位之和大于k的格子。例如,当k为//18时,机器人能够进入方格(35,37),因为3+5+3+7=18。但它不能进入方格(35,38),因为//3+5+3+8=19。请问该机器人能够到达多少个格子?#include "iostream"#include原创 2016-07-07 17:21:27 · 810 阅读 · 0 评论 -
矩阵中的路径
//请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。//路径可以从矩阵中任意一格开始,每一步可以在矩阵中向左、右、上、下移动一格。如果一条//路径经过了矩阵的某一格,那么该路径不能再次进入该格子。#include "iostream"#include "vector"using namespace std;//回溯法void construct_ca原创 2016-07-07 16:28:46 · 216 阅读 · 0 评论 -
回溯法
好久没看回溯法了,复习一下。回溯法最朴素的框架:根据需要,各部分可以稍加变动。直接看例子:1. 找子集。Constructing all subsets.#include "iostream"using namespace std;//1.constructing all subsets//how many subsets are there of an n-原创 2016-07-05 16:54:38 · 214 阅读 · 0 评论 -
滑动窗口的最大值
//给定一个数组和滑动窗口的大小,请找出所有滑动窗口里的最大值。例如,//如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,//它们的最大值分别是{4,4,6,6,6,5}。#include "iostream"#include "vector"#include "deque"using namespace std;vector max原创 2016-07-04 21:24:09 · 245 阅读 · 0 评论 -
数据流中的中位数
//如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是//所有数值排序后位于中间的数值。如果从数据流中读出偶数个数组,那么中位数就是//所有数组排序后中间两个数的平均值。//用两个堆来实现,维护一个最大堆和一个最小堆。两个堆的数目之差最多为1,//同时维护max(最大堆)<min(最小堆)#include "istream"#include "queue"原创 2016-07-04 18:29:14 · 547 阅读 · 0 评论 -
二叉搜索树的第K个结点
//给定一颗二叉搜索树,请找出其中的第K大的结点。#include "iostream"struct treeNode{ treeNode* left; treeNode* right; int value;};treeNode* kthNode(treeNode* pRoot, int k, int *ith){ if (pRoot == NULL) return原创 2016-07-03 16:57:57 · 208 阅读 · 0 评论 -
二叉搜索树的序列化和反序列化
//请实现两个函数,分别用来序列化和反序列化二叉树。#include "ostream"#include "istream"using namespace std;struct treeNode{ treeNode* left; treeNode* right; int value;};//前序遍历,遇null化特殊字符$。void serialize(treeN原创 2016-07-03 16:37:32 · 579 阅读 · 0 评论 -
按之字形顺序打印二叉树
//请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,//第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。#include "iostream"#include "stack"using namespace std;struct treeNode{ treeNode* left; treeNode* right; int原创 2016-07-01 17:15:42 · 187 阅读 · 0 评论 -
n个骰子的点数以及出现概率
//把n个骰子扔在地上,所有骰子朝上一面的点数之和为s。输入n,打印出s的所有可能//的值出现的概率。#include "stdio.h"#include "cmath"#include "helper.h"using namespace std;//方法1:递归思路。把骰子分成两堆,一堆1个,另一堆n-1个。int diceSurface = 6;void probabili原创 2016-06-13 11:42:15 · 630 阅读 · 0 评论 -
数组中出现次数超过一半的数字
/*数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,输出2.*/#include "iostream"#include "map"using namespace std;void MoreThanHalfNum0(int* numbers, int le原创 2016-05-23 11:38:25 · 136 阅读 · 0 评论 -
和为s的两个数字&&和为s的连续正数序列
//问题1:输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s.//如果有多对数字的和等于s,输出任意一对即可。#include "iostream"using namespace std;bool findNumWithSum(int* a, int n, int s){ if (a == NULL || n <= 0) return false;原创 2016-06-03 10:28:58 · 194 阅读 · 0 评论 -
数组中的逆序对
//在数组中的两个数字如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。//输入一个数组,求出这个数组中的逆序对的总数。#include "iostream"using namespace std;//最直观的,O(n^2)int inversePairs0(int* data, int n){ if (data == NULL || n <= 0) return原创 2016-05-27 22:23:49 · 239 阅读 · 0 评论 -
第一次只出现一次的字符
//在字符串中找出第一个只出现一次的字符。如输"abaccdeff",则输出'b'.#include "string"#include "map"#include "iostream"using namespace std;//法1:用map O(nlogn)char firstNotRepeatedChar0(char* str){ if (str == NULL) //一定原创 2016-05-27 20:22:50 · 236 阅读 · 0 评论 -
丑数
/*我们把只包含因子2、3和5的数称为丑数(Ugly number)。求按从小到大的顺序的第1500个丑数。例如6、8都是丑数,但14不是,因为它包含因子7.习惯上我们把1当做第一个丑数。*/#include "iostream"using namespace std;//最直观的方法,写一个丑数判断函数,从1开始count,count到1500输出。bool isUglyNu原创 2016-05-27 19:28:59 · 293 阅读 · 0 评论 -
把数组排成最小的数
/*输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这3个数字能排成的最小数字321323*/#include "iostream"#include "sstream"#include "vector"#include "algorithm"using namespace std;//实质原创 2016-05-27 16:57:08 · 139 阅读 · 0 评论 -
数值的整数次方
//实现函数double Power(double base, int exponent),求base的exponent次方。//不得使用库函数,同时不需要考虑大数问题。#include "iostream"using namespace std;//因为计算机存储的原因,在一定范围内算相等bool equal(double num1, double num2){ if ((n原创 2016-05-15 15:10:54 · 194 阅读 · 0 评论 -
二进制中1的个数
//输入一个整数,输出该二进制表示中1的个数。#include "limits"#include "iostream"using namespace std;int binCountOne0(int value) { int bits = sizeof(int) * 8; int count = 0; for (int i = 0; i < bits; i++) //循环原创 2016-05-14 21:03:12 · 179 阅读 · 0 评论 -
旋转数组找最小值
/*把一个组织最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。*/#include "iostream"#include "algorithm"using namespace std;int minRotatedArray0(int a[], int l, int u){ if (l == u) return原创 2016-05-14 20:05:03 · 195 阅读 · 0 评论 -
员工年龄排序算法
//对公司几万员工年龄排序#include "vector"#include "iostream"using namespace std;void arrayPrint(int a[], int N){ for (int i = 0; i < N; i++) cout << a[i] << " "; cout << endl;}void sortAges0(int age原创 2016-05-13 10:16:05 · 448 阅读 · 0 评论 -
打印1到最大的n位数
//输入数字n,按顺序打印出从1最大的n位十进制数。//比如输入3,则打印1、2、3一直到最大的3位数即999.#include "iostream"#include "string"#include "vector"using namespace std;//用一个string做加法器void stringAdd(string &str){ if (str.empty(原创 2016-05-16 13:09:25 · 247 阅读 · 0 评论 -
在O(1)时间删除链表结点
//给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点。#include "stdlib.h" //包含了null,free()等struct ListNode{ int m_nValue; ListNode* m_pNext;};void DeleteNode(ListNode ** pListHead, ListNode * PToBeDeleted原创 2016-05-16 15:08:59 · 143 阅读 · 0 评论 -
调整数组顺序使奇数位于偶数前面
//输入一个整数数组,实现一个函数来调整该数组中数字的顺序,//使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。#include "helper.h"//前后指针void reorderArray0(int a[], int n){ if (a == NULL || n == 0) return; int evenFirst = 0; while (a[evenF原创 2016-05-16 16:40:15 · 191 阅读 · 0 评论 -
二叉搜索树变双向链表
//输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。//要求不能创建任何新的结点,只能调整树中结点指针的指向。#include "stdlib.h"struct BinaryTreeNode{ int m_nValue; BinaryTreeNode* m_pLeft; BinaryTreeNode* m_pRight;};//第一种需要额外空间,先中序,再连。原创 2016-05-20 16:56:16 · 203 阅读 · 0 评论 -
复杂链表的复制
//请实现函数ComplexListNode* Clone(ComplexListNode* pHead),复制一个复杂链表。//在复杂链表中,每个结点除了有一个m_pNext指针指向下一个结点外,还有一个m_pSlibling//指向链表中的任意结点或者NULL。#include using namespace std;struct ComplexListNode{ int m原创 2016-05-20 15:36:16 · 175 阅读 · 0 评论 -
栈的压入、弹出序列
//输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。//假设压入栈的所有数字均不相等。例如序列1、2、3、4、5是某栈的压栈序列,序列4、5、3、2、1是//该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。#include "iostream"#include "stack"using namespace std;原创 2016-05-18 19:50:23 · 172 阅读 · 0 评论 -
顺时针打印矩阵
//输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字#include "stdio.h"void PrintMatrixClockwisely(int **a, int cols, int rows){ int i_end = cols; int j_end = rows; int i_start = 0; int j_start = 0; while (i_end原创 2016-05-18 18:45:06 · 170 阅读 · 0 评论 -
数组中值只出现一次的数字
//一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现//一次的数字。要求时间复杂度是O(n),空间复杂度是O(1).#include "iostream"using namespace std;//以异或后第x位是否为1分为两组,分别找出只出现一次的数void FindNumsAppearOnce(int a[], int n){ if (a =原创 2016-05-31 15:05:14 · 214 阅读 · 0 评论 -
二叉树的镜像
//请完成一个函数,输入一个二叉树,该函数输出它的镜像#include "stdlib.h"struct BinaryTreeNode{ int m_nValue; BinaryTreeNode* m_pLeft; BinaryTreeNode* n_pRight;};void MirrorRecursively(BinaryTreeNode *pNode){ if (pN原创 2016-05-18 15:15:33 · 161 阅读 · 0 评论