C/C++基础知识和相关笔试算法
double_s_c
学生一枚
展开
-
N个人过河问题
问题描述:有一个大晴天,Oliver与同学们一共N人出游,他们走到一条河的东岸边,想要过河到西岸。而东岸边有一条小船。 船太小了,一次只能乘坐两人。每个人都有一个渡河时间T,船划到对岸的时间等于船上渡河时间较长的人所用时间,现在已知N个人的渡河时间T,Oliver想要你告诉他,他们最少要花费多少时间,才能使所有人都过河。 注意,只有船在东岸(西岸)的人才能坐上船划到对岸。解原创 2017-07-20 10:39:03 · 3440 阅读 · 0 评论 -
链表合并
题目:输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。 解题:本题可有循环也可由递归实现,代码给出了递归实现的方式。 代码: class Solution { public: ListNode* Merge(ListNode* pHead1, ListNode* pHead2) {if (pHead1 == NULL) return pHe原创 2017-07-26 21:55:17 · 204 阅读 · 0 评论 -
快速、插入、冒泡排序,二分查找
void swap(int *a,int*b) {int temp = *a;*a = *b;*b = temp;}void quicksort(int arr[],int left,int right) //快速排序 {if (left>right){ return;}int temp = arr[left];int i = left;int j = right;wh原创 2017-08-03 19:45:59 · 306 阅读 · 0 评论 -
最大子段和问题的动态规划解法
题目:给定一个一维数组,求出该数组最大字段和为多少? 解题:该题解法很多,本文仅提供一种动态规划的解法,复杂度为O(n), SUM=max{b[j-1]+a[j],a[j]} 其中: if b[j-1]>0 b[j]=b[j-1]+a[j] else b[j]=a[j];int MaxSum(int n, int *a)原创 2017-07-26 16:13:30 · 605 阅读 · 0 评论 -
数组中只出现一次的数字
题目:给定数组中只有两个数出现一次,其他的数都出现两次,请找出这两个数。 解题:0^0^1=1, 1^1^0=0可知,异或运算可以找出数组中出现一次的数字(如果只有一个数字的话),a^a^b^b^c^d=c^d,可知数组异或运算的结果为出现一次数字的异或的结果,那么结合数组异或结果的数字就能找出这两个数字,可根据c^d的结果的第一个为1的二进制位(c,d中该二进制为一个为0,一个为1),将数组分成原创 2017-07-25 22:18:27 · 233 阅读 · 0 评论 -
判断一个数组是不是二叉搜索树的后序遍历
题目:给定一个数组判断该数组是不是一个二叉搜索树的后序遍历结果 解题:后序遍历的最后一个数为该树的根,且二叉搜索树有个特点,就是左结点的数都比根结点小,右结点的数都比根结点大,根据此特性就可以判断数组是否是二叉搜索树的后序遍历。 代码如下: //判断一个数组是不是二叉搜索树的后序遍历 bool VerifySequenceOfBST(int sequence[],int length) {原创 2017-07-25 14:47:21 · 505 阅读 · 0 评论 -
1000!结果中0的个数
题目:计算出1000!结果中0的个数。解题:由于1*2*3*4*.....1000,0是有2*5产生,由于上式中2的个数远多于5,所以计算出5的个数,即是0的个数。程序如下:int ZeroNum(int n) {int num=0;for (int i = 0; i < n;i++){ int x = i; while (x/5!=0) { if原创 2017-07-24 20:00:08 · 426 阅读 · 0 评论 -
实现加法计算(不用加减乘除运算符)
题目: 不用加减乘除实现两个数相加。 解题:第一步:不考虑进位,两个数相加sum(例如:5+7=2) 第二步:求进位carry(例如:5+7有进位10) 第三步:sum加carry,若有进位返回第一步,若无进位,跳出。 代码实现中用异或(^)实现第一步,用与(&)实现第二步.int Add(int num1, int num2原创 2017-07-24 16:43:39 · 911 阅读 · 0 评论 -
内存池、进程池、线程池
池的概念由于服务器的硬件资源“充裕”,那么提高服务器性能的一个很直接的方法就是以空间换时间,即“浪费”服务器的硬件资源,以换取其运行效率。这就是池的概念。池是一组资源的集合,这组资源在服务器启动之初就完全被创建并初始化,这称为静态资源分配。当服务器进入正式运行阶段,即开始处理客户请求的时候,如果它需要相关的资源,就可以直接从池中获取,无需动态分配。很显然,直接从池中取得所需资源比动态分配资转载 2017-08-07 22:13:02 · 283 阅读 · 0 评论 -
大端存储与小端存储
在各种计算机体系结构中,对于字节、字等的存储机制有所不同,主要有两种存储模式:大端存储和小端存储,两种定义如下:大端存储:高字节数据存储在计算机内存的低地址上,低字节数据存储在计算机内存的高地址上。小端存储:高字节数据存储在计算机内存的高地址上,低字节数据存储在计算机内存的低地址上。下面给出一个实例:对于32为的数据:0x12345678,两种存储形式如下:原创 2017-07-22 11:32:24 · 423 阅读 · 1 评论 -
对称二叉树问题
题目:给定一个二叉树,判定是否是对称二叉树。 解题:若这个棵二叉树的先遍历左结点再遍历有结点和先遍历有结点后遍历左结点,访问到的结点值相同(包括null结点),则表明这个树为对称二叉树。 代码如下: #include “iostream” using namespace std; bool isSymmetrical(TreeNode*pRoot) {return isSymme原创 2017-07-21 14:57:00 · 259 阅读 · 0 评论 -
孩子们的游戏
题目描述 每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此。HF作为牛客的资深元老,自然也准备了一些小游戏。其中,有个游戏是这样的:首先,让小朋友们围成一个大圈。然后,他随机指定一个数m,让编号为0的小朋友开始报数。每次喊到m-1的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,并且不再回到圈中,从他的下一个小朋友开始,继续0…m-1报数….这样下去….直到剩下最原创 2017-07-20 21:24:36 · 340 阅读 · 0 评论 -
最长递减子序列问题
题目:求一个数组的最长递减子序列 比如{9,4,3,2,5,4,3,2}的最长递减子序列为{9,5,4,3,2}解题:利用一个辅助数组保存每一位及之前的数组所构成的最长递减子序列。void print(int arry[], int index, int *pb){for (int i = index - 1; i >= 0; i--){ if (pb[index] == pb[i] +原创 2017-07-20 14:36:14 · 1054 阅读 · 0 评论 -
顶层const和底层const
const是一个限定符,只有在限定指针的时候才存在顶层和底层const,例子如下:一、底层const 指向常量的指针: int const *p=8; 其中的const称为底层const,指针p指向的内容不可变,即 *p=10;是错误的,不可通过*p改变p指向地址中的内容。二、顶层const 常量指针:int* const p=&a; 其中的const称为顶层c原创 2017-07-27 21:40:13 · 322 阅读 · 0 评论