算法
KevinIceFire
走在路上,跑起来。
展开
-
求两个数和为s,判断它是否在数组中存在,并且数组已经排好序
//和为s的两个数字(数字已经按照递增序列排列)bool FindNumberWithSum(int data[], int length, int sum, int *num1, int *num2){ bool found = false; if (length < 1 || num2 == NULL || num1 == NULL || data == NULL) return原创 2013-09-06 15:49:49 · 762 阅读 · 0 评论 -
二叉树的层次遍历,从上往下打印二叉树
struct BinaryTreeNode{ int m_nValue; struct BinaryTreeNode *m_nLeft, *m_nRight;};void PrintTopToBottomAndLeftToRight(BinaryTreeNode *pTreeRoot){ if (!pTreeRoot) return; std::deque dequeTr原创 2013-09-05 17:06:23 · 854 阅读 · 0 评论 -
求出一个字符串中出现一次的字符
//第一个只出现一次的字符char FirstNotRepeatingChar(char *pString){ if (pString == NULL) return '\0'; const int tableSize = 256; unsigned int hasTable[tableSize]; for (unsigned int i = 0; i < tableSize; i原创 2013-09-05 21:48:22 · 810 阅读 · 0 评论 -
5分钟搞定字节对齐问题
C struct 中字节对齐问题规则:1. 其实,这是VC对变量存储的一个特殊处理。为了提高CPU的存储速度,VC对一些变量的起始地址做了“对齐”处理。在默认情况下,VC规定各成员变量存放的起始地址相对于结构的起始地址的偏移量必须为该变量的类型所占用的字节数的倍数。各成员变量在存放的时候根据在结构中出现的顺序依次申请空间,同时按照上面的对齐方式调整位置,空缺的字节VC会自动填转载 2013-09-20 01:27:21 · 996 阅读 · 0 评论 -
归并排序
堆排序与快速排序,归并排序一样都是时间复杂度为O(N*logN)的几种常见排序方法。学习堆排序前,先讲解下什么是数据结构中的二叉堆。二叉堆的定义二叉堆是完全二叉树或者是近似完全二叉树。二叉堆满足二个特性:1.父结点的键值总是大于或等于(小于或等于)任何一个子节点的键值。2.每个结点的左子树和右子树都是一个二叉堆(都是最大堆或最小堆)。当父结点的键值总转载 2013-09-26 13:46:52 · 602 阅读 · 0 评论 -
在二元树中找出和为某一值的所有路径
题目:输入一个整数和一棵二元树。从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。打印出和与输入整数相等的所有路径。struct BinaryTreeNode{ int m_nValue; BinaryTreeNode *m_pLeft; BinaryTreeNode *m_pRight;};void FindPath (BinaryTreeNode *pTre原创 2013-09-26 19:37:56 · 545 阅读 · 0 评论 -
在排序数组中查找和为给定值的两个数字
题目:输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字。要求时间复杂度是O(n)。如果有多对数字的和等于输入的数字,输出任意一对即可。bool FindTwoNumbersWithSum(int data[], unsigned int length, int sum, int &num1, int &num2){ bool found原创 2013-09-26 21:09:30 · 683 阅读 · 0 评论 -
求子数组的最大和
题目:输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为O(n)。例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2,因此输出为该子数组的和18。bool FindGreatestSumOfArray(int *pData,原创 2013-09-26 17:18:24 · 787 阅读 · 0 评论 -
判断整数序列是不是二元查找树的后序遍历结果
题目:输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果。如果是返回true,否则返回false。例如输入5、7、6、9、11、10、8,由于这一整数序列是如下树的后序遍历结果:8 / \ 6 10 / \ / \ 5 7 9 11因此返回true。如果输入7、4、6、5,没有哪棵树的后序遍历的结果是这个序列,因此返回false。// Verify whethe原创 2013-09-26 20:13:26 · 828 阅读 · 0 评论 -
包含min函数的栈
定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数,在该栈中,调用min,push以及pop的时间复杂度都是O(1):#include #include using namespace std;templateclass StackWithMin{public: void push(const T& value); void pop(); const原创 2013-09-05 16:09:00 · 648 阅读 · 0 评论 -
排序算法的时间复杂度和空间复杂度
排序算法的时间复杂度和空间复杂度 常用的内部排序方法有:交换排序(冒泡排序、快速排序)、选择排序(简单选择排序、堆排序)、插入排序(直接插入排序、希尔排序)、归并排序、基数排序(一关键字、多关键字)。一、冒泡排序: 1.基本思想:两两比较待排序数据元素的大小,发现两个数据元素的次序相反时即进行交换,直到没有反序的数据元素为止。2.排序过程转载 2013-09-11 09:49:54 · 844 阅读 · 0 评论 -
稳定排序和不稳定排序
定排序和不稳定排序 这几天笔试了好几次了,连续碰到一个关于常见排序算法稳定性判别的问题,往往还是多选,对于我以及和我一样拿不准的同学可不是一个能轻易下结论的题目,当然如果你笔试之前已经记住了数据结构书上哪些是稳定的,哪些不是稳定的,做起来应该可以轻松搞定。本文是针对老是记不住这个或者想真正明白到底为什么是稳定或者不稳定的人准备的。 首先,排序算法的稳定性转载 2013-09-11 10:09:15 · 669 阅读 · 0 评论 -
数字在排序数组中出现的次数
int GetFirstK(int *data, int length, int k, int start, int end){ if (start > end) return -1; int middleIndex = (start + end) / 2; int middleData = data[middleIndex]; if (middleData == k) {原创 2013-09-06 14:23:12 · 604 阅读 · 0 评论 -
strcat,strcmp,memcpy,strcpy函数实现
1、Strcat函数原型如下char *strcat(char *strDest, const char *strScr) //将源字符串加const,表明其为输入参数{ char * address = strDest; //该语句若放在assert之后,编译出错 assert((strDest != NULL) && (str转载 2013-09-06 18:52:06 · 704 阅读 · 0 评论 -
扑克牌的顺子
//从扑克牌中随机抽取5张,判断是不是顺子,2-10为数字本身,A为1,J,Q,K为11,12,13//大小王可以为任意数字int compare(const void *arg1, const void *arg2){ return *(int*)arg1 - *(int*)arg2;}bool IsContinuous(int *numbers, int length){ i原创 2013-09-07 10:27:58 · 735 阅读 · 0 评论 -
strcpy和memcpy区别
strcpy和memcpy主要有以下3方面的区别。1、复制的内容不同。strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符数组、整型、结构体、类等。2、复制的方法不同。strcpy不需要指定长度,它遇到被复制字符的串结束符"\0"才结束,所以容易溢出。memcpy则是根据其第3个参数决定复制的长度。3、用途不同。通常在复制字符串时用strcpy,而需要复制其他类型数据时原创 2013-09-02 21:55:24 · 619 阅读 · 0 评论 -
排序
#include using namespace std;void BubbleSort(int *arr, int Count) //冒泡排序{ if (arr == NULL || Count <= 0) { return; } int i, j; for (i = 0; i < Count; i++) { int temp = 0; for (j = 0原创 2013-09-02 14:15:18 · 660 阅读 · 0 评论 -
求一个整数的次方
//求base的exponent次方,不能使用库函数,同时不需要考虑大数问题bool flag_InvalideInput = false;double Power(double base, int exponent){ flag_InvalideInput = false; if (equal(base, 0.0) && exponent < 0)//特殊条件,单独考虑,底数为0,指数原创 2013-09-02 20:45:56 · 841 阅读 · 0 评论 -
memcpy函数
面试中如问到memcpy的实现,那就要小心了,这里有陷阱。先看下标准memcpy()的解释:1void *memcpy(void *dst, const void *src, size_t n);2//If copying takes place between objects that o转载 2013-09-02 21:39:35 · 1451 阅读 · 0 评论 -
调整数组顺序使奇数位于偶数前面
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分:void ReorderOddEven(int *pData, unsigned int length){ if (pData == NULL || length <= 0) return; int *pBegin = pData; int *pEnd = pData原创 2013-09-03 10:58:21 · 618 阅读 · 0 评论 -
100 的阶乘末尾有多少个0?
原创】100的阶乘结果中末尾含有几个数字0【题目】今天在网上看到一道题目:100!结果数值中末尾有几个0?【分析】计算100!会溢出,所以使用将10分拆为10 = 2X5,在1~100中,寻找2的个数N(比如,4有两个2),以及5的个数M,结果 X = M > N ? N : M;【图表分析】 现在只分析5,转载 2013-09-27 16:03:53 · 1526 阅读 · 0 评论