c/c++
文章平均质量分 76
nothing is worse
long long ago,there is nothing
展开
-
2014年爱奇艺的校招题目-大题第八题
爱奇艺的一道笔试题目:给定一个数组A中有N个元素,元素范围为1到N,1到N中元素有的没有出现,有的出现多次要求:统计数组A中没有出现的元素和出现多次的元素个数时间复杂度O(n),空间复杂度O(1)思路:对于数组A = {1, 2, 2, 3}A[1] = 1 > 0 时 A[1] == 1 ,A[1] = 1是新出现的数字,并且A[i]=1等于其下标,所以A[1] =原创 2013-09-28 23:04:21 · 798 阅读 · 0 评论 -
判断某数组是不是某二元查找树的后序遍历的结果
//////题目:输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果。//////如果是返回true,否则返回false。//////例如输入5、7、6、9、11、10、8,由于这一整数序列是如下树的后序遍历结果.////// 8////// / \////// 6 10////// / \ / \////// 5 7原创 2013-08-25 22:56:12 · 599 阅读 · 0 评论 -
hdu3874Necklace--树状数组
#include #include #include using namespace std;//思路:1) 首先将询问的区间[L,R]按照R从小到大排序,这样R前面的都小于等于R// 2) 利用树状数组求解,m_hash{value] = index;表示值value存放在m_hash数组的index位置// 并且在m_hash数组中index之前原创 2013-09-04 22:21:05 · 430 阅读 · 0 评论 -
hdu1708Fibonacci String
#include using namespace std;#define NSIZ 40char str1[NSIZ];char str2[NSIZ];int num[27];int num_n_1[27];int num_n_2[27];int main(){int t, i, n1, n2, j,k;scanf("%d", &t);原创 2013-08-31 23:06:21 · 507 阅读 · 0 评论 -
hdu3336Count the string
#include using namespace std;#define NSIZ 200100#define MODE 10007char str[NSIZ];int Next[NSIZ];int num[NSIZ];//本题是KMP加DP,详细考查了next[]数组的意义// next[i] = k,表示当字符串第i个字符出现不匹配,应该从该原创 2013-08-31 14:37:12 · 457 阅读 · 0 评论 -
hdu2609How many
#include #include #include using namespace std;#define SIZ 110//思路:在给定字符串中的所有左移字符串中选择字典序排列最小的一个放到map容器中//最后map容器的大小就是给定的拥有的不同字符串的大小map Hash;void rotate(char * s, char * e)原创 2013-08-30 16:11:55 · 427 阅读 · 0 评论 -
hdu3746 Cyclic Nacklace
#includeusing namespace std;#define MAXSIZ 100010//题意://给一串珠子,在首尾处加入最少的珠子,成为循环串,循环串的循环次数大于1//思路:首先求出一节珠子的长度,就是len - next[len], len为字符串长度//然后在根据next[len]的长度求出应该补充的最小珠子数int Next[MA原创 2013-08-30 11:35:42 · 396 阅读 · 0 评论 -
有序数组(升序)转换为二叉排序树
#includeusingnamespace std;int arr[] = {1, 2, 3, 4, 5, 6};typedefstruct Node_{int data;Node_ *left, * right;}Node;//将有序数组arr转换为二叉排序树void Convert(Node *原创 2013-08-27 17:46:16 · 1264 阅读 · 0 评论 -
C++ 类初始化列表的成员初始化顺序
#include using namespace std; class A{private : int n1, n2;public: A():n2(0),n1(n2 + 2) { } void print() { cout"n1:""n2:原创 2013-08-27 17:15:37 · 753 阅读 · 0 评论 -
二叉树的路径和为给定数值的所有路径
#include#includeusingnamespace std;int preOrder[] = {1, 2, 4, 5, 7};int inOrder[] = {4, 2, 5, 1, 7};typedefstruct Node_{int data;Node_ * left, * right;原创 2013-08-27 11:16:20 · 640 阅读 · 0 评论 -
最大公约数-欧几米德,二进制方法
#include using namespace std;//方法1:欧几米德公式int gcd1(int a, int b){if (b == 0){return a;}return gcd1(b , a % b);}//方法2:若一个整数同时能被a, b整除,那么一定也能够同时能被a-b,b整除//即gcd(a, b) = gcd原创 2013-09-16 22:10:48 · 1177 阅读 · 0 评论 -
求子数组的最大乘积
题目:给定一个长度为N整形数组,只能用乘法不能用除法,计算任意N-1个数的组合中乘积最大的一组,并写出时间复杂度;#include #include #include using namespace std;#define NSIZ 10000int a[NSIZ];int pre[NSIZ]; //pre[i] = a[0] * a[1] * ..原创 2013-09-18 22:50:15 · 543 阅读 · 0 评论 -
hdu3018Ant Trip【并差集】
#include using namespace std;//题意:图的欧拉回路或者欧拉通路,通过图中每条边一次且仅一次,并且过每一顶点的通路,要多少画才能完成//思路:1、若某个连同图的所有节点的度数都是偶数,则需要一笔// 2、若某个连通图的节点有n个节点度数为奇数,则需要n/2笔// 3、若某个节点度度数为0, 忽略#define原创 2013-05-15 20:48:38 · 641 阅读 · 0 评论 -
第三章 顺时针打印矩阵
第三章 顺时针打印矩阵1、面试题目38、顺时针打印矩阵 题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。 例如:如果输入如下矩阵: 1 2 3 4 5 6 7 8 9原创 2013-06-18 11:25:47 · 514 阅读 · 0 评论 -
线性时间复杂度求数组第n大
算法理论基础见《算法导论》的第9章#include #include using namespace std;#define NSIZ 1000int partision(int arr[], int left, int right){int tmp = arr[left];while(left {while(left arr[l原创 2013-08-24 22:37:15 · 556 阅读 · 0 评论 -
判断二叉树是否包含另一棵二叉树或者树的子结构
#include #include using namespace std;//根据前序遍历和中序遍历还原构造二叉树//判断二叉树A是否包含二叉树B//思路:1)首先遍历树A,找到一个节点值与B的根节点值相同// 2)再以步骤1)找到的节点值,开始比较树A的子树是包含树B//树的前序遍历int preOrder1[] = {8, 8, 9原创 2013-08-25 17:05:28 · 1056 阅读 · 0 评论 -
栈的push和pop 序列
#include #include #include using namespace std;#define NSIZ 1200//思路://模拟栈, 让栈顶元素和pop序列比较,若相等则出栈, 若不等则入栈//结果:若栈空,则是,非空则不是。int IsPushPop(int push[], int pop[], int n){int i原创 2013-08-25 21:08:08 · 892 阅读 · 0 评论 -
编程之美-电话号码对应的英文单词
题意:电话号码盘一般可以用于输入字母,如用2可以输入A,B,C用3可以输入D,E,F等。对于电话号码5869782,可以依次输出其代表的所有字母组合,如:JTMWTPA,JTMWTPB,...总共有3 * 3 * 3 *4 * 3* 4 * 3 = 3888种#include #include #include #include using namespace std;原创 2013-09-19 16:24:52 · 860 阅读 · 0 评论 -
前序和中序重建二叉树, 树的前序递归,中序递归,后序递归遍历和前序非递归,中序非递归,后序非递归遍历
#include #include using namespace std;int preOrder[] = {10, 6, 4, 8, 14, 12, 16};int inOrder[] = {4, 6, 8, 10, 12, 14, 16};typedef struct Node_{Node_ * left, * right;int data;原创 2013-08-24 19:55:07 · 477 阅读 · 0 评论 -
罗马数字转换为十进制数
//例子:罗马数字和十进制例子////I - 1 //II - 2 //III - 3 //IV - 4 //V – 5 //VI - 6 //VII – 7 //VIII - 8 //IX - 9 //X – 10 //XI – 11 //XII – 12 //XIII – 13 //XIV – 14 //XV – 15 //XVI原创 2013-09-26 11:38:55 · 1916 阅读 · 0 评论 -
树的子结构遍历
思路:1.在原数中进行遍历每个节点,查看该节点值是否和给定子树节点值相同,若相同则比较比较子结构 1)若子结构相同,则返回 2)若子结构不相同,则继续比较原树中根节点和给定子树根节点值。2.遍历直到整个原树中所有节点都被遍历过,或者找到给定子树的子结构#include using namespace std;int preOrder[] = {10, 6, 4, 8,原创 2013-09-26 14:12:20 · 656 阅读 · 0 评论 -
颠倒栈中元素--栈的逆置
思路:1.使用递归pop出栈中元素,直到栈中元素只剩下一个元素2.当前第一次递归返回的时候,栈中有2个元素,我们再利用另一个递归函数putItem把两个元素逆置3.以此递归下去,直到栈中元素全部逆置。过程如下1)1 , 2, 3, 4 第一个递归不断出栈,第一次满足返回条件时,栈中元素只有 12)回到第一个递归的上一层,利用putItem把 2 压入栈中,当putItem返原创 2013-09-26 11:58:51 · 6867 阅读 · 1 评论 -
单向链表相交的第一个公共结点, 判断链表是否有环以及环的入口节点
//////题目:两个单向链表,找出它们的第一个公共结点。////////////链表的结点定义为:////////////struct ListNode////////////{//////////// int m_nKey;//////////// ListNode* m_pNext;////////////}原创 2013-06-12 22:21:13 · 697 阅读 · 0 评论 -
寻找数组中的最大值和最小值
//思路来自编程之美上,留个纪念吧//比较次数:1.5N -2//思路:先求左边部分,再求右边部分的最大值和最小值、//#include using namespace std;typedef struct Value_{ int max, min;}Value;Value getMaxMin(int arr[], int left, int right){ if原创 2013-09-23 18:16:15 · 657 阅读 · 0 评论 -
C++ Set和multSet
最近发现C++ STL Set 容器是个好东东,所以学习了一下以下博客内容转自:http://blog.sina.com.cn/s/blog_779cf3410101389s.html有些地方自己稍微补充了一下1 set的含义 set是集合,它是一个有序的容器,里面的元素都是排序好的,支持插入,删除,查找等操作,就 像一个集合一样。所有的操作的都是严格在转载 2013-10-09 12:22:12 · 1164 阅读 · 0 评论 -
hdu 4545 魔法串
思路:假设小西字符串为str1[i] , 小明的字符串为str2[j] 遍历一次str1[i] ,查看对于每一个str1[i] 是否有str2[j] == str1[i] 或者 hash[str2[j]][str1[i]] == 1若都存在则输出happy, 否则输出unhappy.注意:每一个输入后要加一个getchar(); 这点wrong了好几次#include using n原创 2013-10-08 23:10:32 · 606 阅读 · 0 评论 -
hdu1056 HangOver - 二分查找
思路:先打表,然后再二分查找,此时的二分查找要找到满足条件的最小的一个数代码如下:#include using namespace std;#define N 300double dist[N];void init(){ int i = 0; dist[0] = 0; for (i = 1;i < N; ++i) { dist[i] = dist[i - 1] +原创 2013-10-08 11:20:37 · 638 阅读 · 0 评论 -
hdu 4544 叛逆的小明 -- 数字反转 和 hdu 2074 叠筐(水题)
水题:数字的反转,123变成321, 复数时前导0去掉 比如-100变成-1#include using namespace std;#define N 10000int Reverse(int inNum){ int sum = 0; if (inNum < 10) { return inNum; } while(inNum%10 == 0) inNum /=原创 2013-10-07 23:14:18 · 639 阅读 · 0 评论 -
hdu1198Farm Irrigation -并查集
思路:求无向图的联通分量个数方法:1.对于从A,到K四个正方形,每一条边的中点若有水管则为1,没有水管则为0,按照逆时针方向从上,左,下,右依次排序例如:正方形A可以表示为{1, 1, 0, 0}2. 我们只要判断每一个小正方形的四条边的中点是不是等于其左侧和上侧的正方形的中点,并且同时为1,若相等则归为一类, 此时我们要以给每一个小正方形一个编号 i * n + j 其中(i原创 2013-09-21 22:34:08 · 467 阅读 · 0 评论 -
hdu1023Train Problem II --卡特兰数
#include using namespace std;//大数求解卡特兰数 打表法//公式:C(n + 1) = (4*n - 2)C(n - 1)/(n + 1)#define N 110#define BASE 10int num[N][N];void multi(int a[], int b){int i = 0, carry原创 2013-09-20 16:06:48 · 560 阅读 · 0 评论 -
hdu2067小兔的棋盘--卡特兰数
#include using namespace std;//大数求解卡特兰数 打表法//公式:C(n + 1) = (4*n - 2)C(n - 1)/(n + 1)#define N 40#define BASE 10int num[N][N];void multi(int a[], int b){ int i = 0, carry = 0; for (i = 1;i原创 2013-09-20 16:31:46 · 537 阅读 · 0 评论 -
hdu1130How Many Trees? 卡特兰数
#include using namespace std;//大数求解卡特兰数 打表法//公式:C(n + 1) = (4*n - 2)C(n - 1)/(n + 1)#define N 110#define BASE 10int num[N][N];void multi(int a[], int b){int i = 0, carry =原创 2013-09-20 11:53:07 · 596 阅读 · 0 评论 -
hdu 4544 湫湫系列故事——消灭兔子, 贪心算法+小顶堆
思路:贪心算法1)把所有兔子的血量安从大到小排序,并且把箭的伤害从大到小排序2)排序后,从第一只兔子开始,把每支能杀死该兔子的箭的价格放到一个小顶堆里3)若堆不空,获得小顶堆的堆顶元素,删除之,直到所有兔子都能被射死或者找不到一支射死兔子的箭结束代码如下:#include #include #include #include using namespace st原创 2013-10-05 19:06:05 · 782 阅读 · 0 评论 -
hdu 4221 Greedy 贪心算法
题意:做任务,每一个任务i都有花费时间ci, 截止时间di, penalty = max(Ti - di) Ti为第i个任务的实际完成时间,di为其截至时间,要求所有任务的penalty尽可能的小一个思路:贪心算法:要求截至日期最小的应该最早完成,因为拖得越晚,penalty越大#include #include using namespace std;#define N 10原创 2013-10-05 17:08:46 · 842 阅读 · 0 评论 -
hdu 4286 Alice and Bob --贪心
思路:(参考网络上的思路)先对坐标排序,若h不等,则对h升序排序,否则对w进行升序排序排序后之后,扫描Alice的手牌,把所有Bob[j].h等于Alice[i].h的Bob[j].w放入一个集合中,并且在该集合中找到第一个大于Alice[i].w的Bob[x].w那么Bob[x-1].w就是跟Alice[i].w最接近的牌,若存在则删除之。#include #inclu原创 2013-10-05 11:28:45 · 760 阅读 · 0 评论 -
重建二叉树和树的层次遍历
#include #include using namespace std;#define NSIZ 1000//利用队列的先进先出特性,从根节点开始入队,出队,输出节点值,左孩子不空,左孩子入队;右孩子不空,右孩子入队//循环直到队列为空;//树的前序遍历int preOrder1[] = {10, 6, 4, 8, 14, 12, 16};原创 2013-08-26 22:03:06 · 548 阅读 · 0 评论 -
hdu2689Sort it树状数组
#include using namespace std;//思路:树状数组://例子:输入: 4, 3, 2 ,1//下标: 1,2, 3, 4//由于求逆序对,所以我们看到给出数列4,3, 2, 1下标正好是他们的正序对//所以使用树状数组算法以下标为中心://当输入4之前,此时tree[]数组为{0, 0, 0, 0},我们获得此时逆序个数ge原创 2013-09-03 23:18:47 · 407 阅读 · 0 评论 -
单向链表归并排序
//利用归并排序的思想进行链表排序//因为数组的归并排序,只有判断大小和赋值给一个新的数组//这个很适合链表,并且不用申请新的节点。#include #include using namespace std;#define NSIZ 1000typedef struct Node_{ int m_nvalue;原创 2013-09-14 22:54:13 · 627 阅读 · 0 评论 -
有序数组转为二叉查找树
我们用递归方法遍历有序数组来建立二叉查找树,每次都把[left, right]中间的数看成根节点建树由于二叉查找树的中序遍历是有序的,所以我们用中序遍历二叉查找树时,可以获得数组是有序的,那么确定数组是有序的。#include usingnamespace std; int arr[] = {1, 2, 3, 4, 5, 6}; typedef原创 2013-09-16 18:40:02 · 1095 阅读 · 0 评论 -
一个整数数组,长度为n,将其分为m份,使得各分的和相等
//题意://一个整数数组,长度为n,将其分为m份,使得各分的和相等//比如:{3,4,2,3,6}可以分成{3,2,4,3,6} m=1;或者 {3,6},{2,4,3} m=2;//{3,3},{2,4}{6} m=3,所以m最大值为3//思路:使用多重背包//首先遍历一次数组arr[n],把数组中最大值maxN和总和sum记录下来//那么可能的等分为m = sum /原创 2013-09-19 12:55:34 · 2214 阅读 · 0 评论