- 博客(69)
- 收藏
- 关注
原创 旋转数组的最小数字
把一个数组最开始的若干个元素搬到数组的末尾 称之为数组的旋转 输入一个递增排序的数组的一个旋转 输出旋转数组的最小元素例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转 该数组最小元素为1#include using namespace std;int a[]={3,4,5,1,2,3};int n=5;int findbyorder(int *a,int low,i
2015-06-09 10:09:18
388
原创 用两个栈实现队列
题目:用两个栈实现一个队列 队列的声明如下 请实现它的两个函数appendTail 和deleteHead 分别完成在队列尾部插入结点和队列的头部删除结点的功能栈中元素先进后出 队列中元素先进先出 假设队列q ,元素1 2 3 先后进入队列 123 如果栈s1 中 1 2 3 先后进入栈
2015-06-06 17:08:34
419
原创 重建二叉树
题目:输入某二叉树的前序遍历和中序遍历的结果 请重建出该二叉树 假设输入的前序遍历和中序遍历的结果中都不含重复的数字 例如输入的前序遍历{1,2,4,7,3,5,6,8,}和中序遍历{4,7,2,1,5,3,8,6} 则重建出来的二叉树如图所示 并输出他们的头结点 二叉树的节点定义如下struct BinaryTreeNode{ int m_nValue; B
2015-06-06 16:58:05
427
原创 从尾到头打印链表
题目:输入一个链表的头结点 从尾到头反过来打印出每个结点的值从头到尾遍历链表 然后将遍历结果压入栈 最后弹出栈的顺序即为从尾到头遍历顺序 while(p!=NULL) { s.push(p); p=p->m_pNext; } while(s.size()) { coutm_nKey<<' '; s.pop(); }假设链表结点为
2015-06-06 14:20:49
336
原创 替换空格
题目:请实现一个函数 把字符串中的每个空格替换成“%20”,例如输入“we are happy."则输出”we%20are%20happy."从前向后 可以遍历字符串遇到空格则将空格后的字符移动两位并替换为%20 但是这种方法时间复杂度为O(N*N)从后向前?遍历一遍字符串可以知道字符串中空格的个数 比如“we are happy."中 字符串长度为14(包括结
2015-06-06 14:04:32
429
原创 二维数组中的查找
题目:在一个二维数组中 每一行都按从左到右递增的顺序排序 每一列都按照从上到下递增的顺序排序 请完成一个函数 输入这样一个二维数组和一个整数 判断数组中是否含有该整数128924912471013681115假设要查找的是7 如上图的一个二维数组 每一行从左到右递增
2015-06-06 13:27:48
344
原创 赋值运算符函数
题目:如下为类型CMyString 的声明 请为该类型添加赋值运算符函数class CMyString{public: CMyString (char *pData=NULL); CMyString (const CMyString & str); CMyString & operator=(const CMyString &str) ; ~CMyString(void);pr
2015-06-05 22:12:15
338
原创 快速找出故障机器
假设一个机器仅存储一个标号为ID的记录(假设ID是小于10忆的整数) 假设每份数据保存两个备份 这样就有两个机器存储了同样的数据1.在某个时间 如果得到一个数据文件ID的列表 是否能够快速找出这个表中仅出现一次的ID2.如果已经知道只有一台机器死机(也就是说只有一个备份丢失)?如果两台机器死机(假设同一个数据的两个备份不会同时丢失)?问题1:直接遍历表 利用一个数组记录下每
2015-05-30 22:14:41
343
原创 一摞烙饼的排序
假设有n块大小不一的烙饼 那最少要翻几次 才能达到最后大小有序的结果?为了把最大的烙饼摆在最下面 先把最上面的烙饼和最大的烙饼之间的烙饼翻转 这样最大的烙饼就在最上面了 接着 把所有烙饼翻转 最大的烙饼就摆在了最下面之后我们队上面n-1、n-2个饼重复这个过程两次翻转就可以把最大的烙饼翻转到最下面 最多需要把上面的n-1个烙饼一次翻转两次 因此 最多需要2(n-1)次翻
2015-05-30 22:13:15
566
原创 象棋将帅问题
输出将帅的所有合法位置 要求代码中只使用一个变量用1-9的数字按照优先顺序来表示每个格点的位置要求出A(将)、B(帅)所满足的合法位置 即AB不能在一条竖线上循环遍历AB 81次 然后判断AB是否在一条竖线上 就可以得到所有的合法信息 两个嵌套循环即可但是只允许使用一个变量?按照两层循环的思想 固定一个点 A 然后再遍历九次B 判断AB
2015-05-30 20:19:49
554
原创 判断两个链表是否相交
给出两个单行链表的头指针 判断这两个链表是否相交 为了简化 这里假设两个链表均不带环方法1:判断第一个链表的每个节点是否在第二个链表中 这种方法的时间复杂度为O(lenth(l1)*lenth(l2))方法2:如果两个链表相交 那么这两个链表就会有共同的节点 而节点地址又是节点的唯一标识 所以我们能够判断两个链表是否有存在地址一致的节点 就可以判断两个链表是否相交
2015-05-21 16:54:11
451
原创 字符串移位包含
给定两个字符串s1和s2 要求判定s2是否能够被通过s1作循环移位 得到的字符串包含 假设给定s1=AABCD s2=CDAA 返回true 给定s1=ABCD s2=ACBD false方法1:穷举法将长度为N的s1移动N次 每次移动1为 查看是否包含s2方法2:将长度为N的s1移动N次 保留每次前面移动的数据如s1=ABCDABCD->ABCD
2015-05-21 16:40:29
413
原创 区间重叠
给定一个源区间【x,y】(y>=x) 和N个 无序的目标区间[x1,y1] [x2,y2] ....[xn,yn] 判断源区间[x,y]是不是在目标区间内方法1:一个直接的思路即将源区间[x,y]和N个无序的目标区间逐个投影到坐标轴上 只考察源区间未被覆盖的部分 如果所有的目标区间全部投影完毕 仍有源区间没有被覆盖 那么源区间就不在目标区间之间方法2:对现有
2015-05-21 16:20:47
624
原创 数组分割
有一个没有排序、元素个数为2n的正整数数组 要求如何能把这个数组分割为元素个数为n的两个数组 并使两个字数组的和最接近 方法1:将数组的所有元素排序为a1将它们划分为两个数组s1=[a1,a3....a2n-1] ,s2=[a0,a2,....a2n]从s1和s2中找出一对数进行交换 是的sum(s1) 和sum(s2)之间的值尽可能的小 直到无法交换 这种想法的缺陷是s1和s2
2015-05-21 11:20:08
420
原创 数组循环位移
设计一个算法 把一个含有N个元素的数组循环右移K位 要求时间复杂度为O(N ) 且只允许使用两个附加变量方法1:将长度为N的数组 每次移动一位 移动k次 如abc移动三次 为abc ->cab->bca->abc. 当移动为N此时 与原数组相同 因此 当k>N 时 移动结果与 k%N 相同 for (int i=0;i<k%N;i++) { char t=a[0];
2015-05-21 09:59:31
524
原创 最大公约数
求两个正整数的最大公约数方法一:辗转相除法假设两个正整数x,y ,令x/y=p ,x%y=q 即 x=p* y +q 则 如果一个数能整除x,y 则一定能够整出y 和q 如果一个数能够整除y和q 则一定能够整除x,y ,所以x,y和y ,q具有相同的公约数gcd(x,y)=gcd(y,x%y)....比如 x=18 y=12gcd(18,12)=gcd(12
2015-05-19 16:48:33
517
原创 寻找数组中的最大值和最小值
同时找出一个数组的最大和最小的数 对于一个由N个整数组成的数组 需要比较多少次才能把最大和最小的数找出来面试的时候面试官有闻过此题 但是我一直不明白当时问的是什么意思 没有考虑到比较次数 以为时间复杂度为O(N)了还想怎么样,Naive、、、直到在书上看见此题。。。比较次数 最直接的是比较2N次 ,找最大最小数各比较N 一般最大数和最小数不会是同一个 可以考虑将数组分成两
2015-05-19 16:15:24
676
原创 快速寻找满足条件的两个数
快速找出一个数组中的两个数字 让这两个数字之和等于一个给定的数字(假设这个数组中肯定存在这样一组或以上的数方法一:穷举法: for(int i=0;i<n;i++) { for(int j=i;j<n;j++) { if (a[i]+a[j]==m) cout<<a[i]<<' '<<a[j]<<endl; } }算法时间复杂度为O(N*N)
2015-05-19 15:25:03
684
原创 求数组的字数组之和的最大值
先看一维数组的情况:方法1:遍历所有可能的sum:时间复杂度为O(N*N*N)int maxsum1(int *a,int n){ int M=-100000; int s=0; for (int i=0;i<n;i++){ for(int j=i;j<n;j++) { for(int k=i;k<j;k++) { s=s+a[k]; }
2015-05-19 11:39:42
616
原创 最长递增子序列
找出一维数组中的最长递增子序列 也就是找到一个标号的序列b[0],b[1],...b[m](0方法一:从i开始 遍历先前所有的递增子序列 判断当前的a[i] 与最长子序列中的每一个元素的大小 如果满足递增则将i加入 int *LS=new int[n]; for(int i=0;i<n;i++) { LS[i]=1; for(int j=0;j<i;j++) {
2015-05-19 09:49:48
387
原创 编程之美-电梯调度算法
1、简单的双重循环可以解决O(N )2、书中提出另一种想法 假设电梯停在i层 爬楼梯的总数为Y 若电梯停在i-1层 则i层以上的N3人 需要多爬一层 i层的N2也需多爬一层 i-1层的N1人则少爬一层 所以总共走的数目为 Y-N1+N2+N3 即 Y-(N1-N2-N3)若在i+1层停下 则i+1层的N3人少一层 i层和i-1层多走N2+N1 总的数目为Y-N3+N1+N2 即
2015-05-15 13:07:01
1116
原创 分治算法 求数组逆序数
http://blog.csdn.net/xiaofengsheng/article/details/5491090int Meg(int *t,int *a,int x,int y,int m,int n){int k=0;int order=0;int i=x;int j=m;for(i=x;i{while(ja[j])j++;ord
2015-05-14 21:57:59
1160
原创 motion estimation
运动估计:基本思想是将图像序列的每一帧分成许多互不重叠的宏块,并认为宏块内所有像素的位移量都是相同,然后对每个宏块内到参考帧某一给定特定搜索范围内根据一定的匹配准则找出与当前块最相思的块,即匹配块,匹配块与当前快的相对位移即为运动矢量。视频压缩的时候只需要保存运动矢量和残差数据就可以完全恢复当前块。常见的运动估计匹配准则有三种:MAD、MSE和NCCF,由于MAD没有乘除操作,不需要做
2015-04-22 15:28:27
2600
原创 hiho1039字符消除
http://hihocoder.com/problemset/problem/1039没有想到什么好的方法 列出所有情况然后对每一种情况求解最后求出最大值
2015-04-17 18:01:42
490
转载 求解最长回文子串 之Manacher算法
回文串包括奇数长的和偶数长的,一般求的时候都要分情况讨论,这个算法做了个简单的处理把奇偶情况统一了。算法的基本思路是这样的,把原串每个字符中间用一个串中没出现过的字符分隔开来(统一奇偶),用一个数组p[ i ]记录以 str[ i ] 为中间字符的回文串向右能匹配的长度。原串:w a a b w s w f d新串: # w # a
2015-04-13 11:09:47
535
转载 KMP算法
问题描述:有一个文本串S,和一个模式串P,查找P在S中的位置暴力破解法:int ViolentMatch(char* s, char* p) { int sLen = strlen(s); int pLen = strlen(p); int i = 0; int j = 0; while
2015-04-12 16:08:46
457
转载 void const f() vs void f() const
void const f() is equivilent to const void f(), which means the return type (in this case a void) is const. This is totally meaningless not only because it's a void (there is nothing there that need
2015-04-10 20:36:49
531
转载 [转]基类与派生类,父类指针指向子类对象
http://m.blog.csdn.net/blog/wangzengdi/30028013先来看一段程序(来自趋势科技笔试):#include using namespace std;class Base_J {public: Base_J() { cout << "Base Created" << endl; } ~Base_J(
2015-04-10 20:18:38
990
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人