- 博客(94)
- 收藏
- 关注
原创 寻找单链表的中间节点(可能包含环)
首先要判断链表是否有环,如果有环的话,要判断环的入口节点。#include #include #define N 9struct listNode{ int value; struct listNode* next; listNode(int v = 0, listNode* ne = NULL) { value = v; next = ne; }};void
2013-07-21 14:03:07
1008
转载 编译和链接的区别
在多道程序环境中,要想将一个用户源代码变成一个可以在内存中执行的程序,通常分为三个步骤:编译、链接、载入。 (1)编译:由编译程序将用户的源代码编译成若干个目标模块。 (2)链接:由链接程序将编译后形成的一组目标模块以及它们所需要的库函数链接在一起,形成一个完整的载入模块。 (3)载入:由载入程序将载入模块载入内存。
2013-06-24 10:59:03
851
转载 以指向函数的指针作为函数形参实现多个函数的替换
/*=============================================================以指向函数的指针作为函数形参实现多个函数的替换 ============================================================== 作者:最后的村长
2013-06-23 20:53:56
791
原创 多态继承的一个小例子,mark一下。
#include using namespace std;class Point2d{public: Point2d( float x = 0.0, float y = 0.0) : _x(x),_y(y){}; float x(){ return _x; } float y(){ return _y; } virtual float z(){ return 0.0
2013-05-08 15:53:18
858
转载 有关sizeof strlen typedef define的面试题
对字符串进行sizeof操作的时候,会把字符串的结束符“\0”计算进去的,进行strlen操作求字符串的长度的时候,不计算\0的。数组作为函数参数传递的时候,已经退化为指针了,Func函数的参数str_arg只是表示一个指针,那个100不起任何作用的。下面程序的输出结果为多少?void Func(char str_arg[100]) { printf("
2013-04-17 17:19:00
1650
原创 最大流问题
#include using namespace std;int M,N;int cost[205][205],r;int Min[205],pre[205];bool visit[205]; //搜索标记int bfs(){ int q[205], start = 0, end = 0; memset(visit,false,sizeof(visit)
2013-04-15 20:35:18
770
原创 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。 例如:如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1, 2, 3, 4, 8, 12, 16, 15, 14, 13, 9, 5, 6, 7, 11, 10。 #include #include using namespace std;
2013-04-11 19:52:06
1776
原创 Topk找出最大的K个数
使用了快速排序中的思想,期望时间复杂度为O(N)。#include using namespace std;void select(int* array, int k, int low, int high){ int i = low, j = high; int temp = array[i]; while (i < j) { while (array[j
2013-04-11 16:02:12
895
原创 二叉搜索树的一些基本操作
#include #include using namespace std;typedef struct BiTNode{ int data; struct BiTNode *lchild, *rchild;} BiTNode, *BiTree;bool searchBST(BiTree T, int key, BiTree f, BiTree *p){
2013-04-10 21:23:10
752
原创 旋转数组的最小数字
题目描述:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。#include using namespace std;int MinInOrder(int* numbers, int index1, int index2
2013-04-10 19:22:07
822
转载 位图运算
#include #define BITSPERWORD 32 #define SHIFT 5 #define MASK 0x1F #define N 10000000 int a[1 + N/BITSPERWORD]; /*** i / 32 对应具体数组元素 i % 32 对应具体数组元素的bit位 i >> SHIFT == i / 32 i & MASK == i %
2013-04-08 22:33:36
1074
原创 单链表结构域顺序存储结构优缺点
简单地对单链表结构和顺序存储结构作对比: 通过上面的对比,我们可以得到一些经验性的结论:1.若线性表需要频繁查找,很少进行插入和删除操作时,宜采用顺序存储结构。若需要频繁插入和删除时,宜采用单链表结构。比如说游戏开发中,对于用户注册的个人信息,出了注册时插入数据外,绝大多数情况都是读取,所以应该考虑用顺序存储结构。而游戏中的玩家的武器或者装备列表,随着玩家的游戏过程中,可能会随时增
2013-04-08 21:08:29
3217
原创 位操作符
一、传统的C方式位操作:1.基本操作: 使用一个unsigned int变量来作为位容器。2.操作符:| 按位或操作符:result=exp1|exp2;当exp1和exp2中对应位中至少有一个为1时,result中对应位为1,否则为0。& 按位与操作符::result=exp1&exp2;当exp1和exp2中对应位全为1时,result中对应位为1,否则为0。
2013-04-07 23:56:12
774
原创 给出一个函数来合并两个字符串A和B
给出一个函数来合并两个字符串A和B。字符串A的后几个字节和字符串B的前几个字节重叠。下面上代码:#include using namespace std;void copyStr(char pachar[], char pbchar[], int alen, int blen, char* &result){ int posa = 0; int posb = 0; in
2013-04-05 19:23:05
2838
原创 有一个整数数组,请求出两两之差绝对值最小的值
1.可以快排,然后遍历一遍排完序后的数组。时间复杂度为O(NlogN+N)。2.先遍历一遍数组a[ ],找出最大值max和最小值min。然后以建立一个(max+min-1)大小的数组b[ ],再次遍历原始数组,b[a[i]-min]++,试图建立一种映射关系,降低时间复杂度。代码如下:#include //#include using namespace std;int findM
2013-04-05 16:11:58
2253
原创 大整数的加法问题
题目列表 > A + B时间限制: 1000ms 内存限制: 1024MB描述输入两个正整数A和B, 求A+B的值输入两个正整数A, B输出A+B的和对于小数据, 0 100样例输入2 3样例输出5代码:#include #include #inclu
2013-04-05 14:38:04
899
原创 二叉查找树后继节点和前驱节点查找
二叉查找树按照二叉树进行组织。二叉查找树关键字的存储方式总是瞒住二叉查找树性质:设x为二查查找树种一个节点。如果y是x的左子树中的一个节点,那么key[x] >= key[y]。如果y是x的右子树的一个节点,那么key[x] 这样对二叉查找树进行中序遍历就可得到书中所有元素的一个非降序排列。查找某一个存在节点的前驱和后继。某一个节点x的后继就是大于key[x]的关键字中最小的那个节点,
2013-04-03 19:12:24
3042
原创 鸡蛋篮子算法题
题目:把N个鸡蛋放到M个篮子里,每个篮子不能为空,要求满足:任意给出一个不超过N的数量,都能找到其中某几个篮子的鸡蛋和等于它。请写一个程序,输入N,M,然后输出所有的鸡蛋放法。 题目解释:例如6个鸡蛋放3个篮子的一种可能为1,2,3,任意给出1该题目最早是我在网上看到一道600个鸡蛋放在10个篮子的放法,答案是给出了一个按2的乘积放的特例。我将其改编后用来招聘时考察工程师上机编程技
2013-04-03 15:50:06
2797
原创 如何在迅速匹配兄弟字符串(如,bad和adb就是兄弟字符串),目前只针对字母
针对字母,建立一种映射。#include using namespace std;const int MAX = 58;int isBrotherStr(char* str1, char* str2){ if (!str1 && !str2) { return -1; } else if (!str1 || !str2) { return 0; } else
2013-04-03 11:04:22
1009
原创 不开辟用于交换数据的临时空间,如何完成字符串的逆序
不开辟用于交换数据的临时空间,如何完成字符串的逆序(在技术一轮面试中,有些面试官会这样问)#include using namespace std;void change(char* str){ for (int i = 0, j = strlen(str)-1; i < j; i++,j--) { str[i]=str[i]^str[j]; str[j]=str[i]^s
2013-04-02 20:55:20
1107
原创 编写一个程序,把一个有序整数数组放到二叉树中
分析:本题考察二叉搜索树的建树方法,简单的递归结构。 关于树的算法设计一定要联想到递归,因为树本身就是递归的定义。 而学会把递归改称非递归也是一种必要的技术。 毕竟,递归会造成栈溢出,关于系统底层的程序中不到非不得以最好不要用。 但是对某些数学问题,就一定要学会用递归去解决。#include using namespace std;struct student{
2013-04-02 19:05:22
1083
原创 大整数的乘法问题
#include using namespace std;void multiple(char A[], char B[], char C[]){ int TMP, lenA = -1, lenB = -1; while (A[++lenA]!='\0') ; while (B[++lenB]!='\0') ; int Index, start = lenA+l
2013-04-02 18:24:03
755
原创 求最大连续递增数字串
求最大连续递增数字串(如―ads3sl456789DF3456ld345AA‖中的―456789‖)#include using namespace std;int getSubString(char src[], char rst[]){/* cout<<rst<<endl; cout<<"the length of the rst is : "<<sizeof(
2013-04-02 15:47:53
1460
原创 将字符串中的字符'*'移到串的前部分 的一个解法
2005年11月金山笔试题。编码完成下面的处理函数。函数将字符串中的字符'*'移到串的前部分,前面的非'*'字符后移,但不能改变非'*'字符的先后顺序,函数返回串中字符'*'的数量。如原始串为:ab**cd**e*12,处理后为*****abcde12,函数并返回值为5。(要求使用尽量少的时间和辅助空间)自己的算法分析:有两个指针q1和q2,从后向前遍历,q2始终指向*,q
2013-04-02 11:22:23
2529
1
原创 搜索引擎面试题
搜索引擎会通过日志文件把用户每次检索使用的所有检索串都记录下来,每个查询串的长度为1-255字节。假设目前一个日志文件中有一千万个记录(这些查询串的重复度比较高,虽然总数是1千万,但如果除去重复后,不超过3百万个。一个查询串的重复度越高,说明查询它的用户越多,也就是越热门),请你统计最热门的10个查询串,要求使用的内存不能超过1G。1000万条记录,每条记录最大为255Byte,那么日
2013-04-01 23:56:52
2393
原创 用C语言实现函数void * memmove(void *dest,const void *src,size_t n)
由于可以把任何类型的指针赋给void类型的指针 这个函数主要是实现各种数据类型的拷贝。 用C语言实现函数void * memmove(void *dest,const void *src,size_t n)。 memmove函数的功能是拷贝src所指的内存内容前n个字节到dest所指的地址上。 考虑到内存可能重叠的情况,要在函数中避免有以下方式 但是这里有个制约要考虑清楚
2013-04-01 11:49:21
1926
原创 一个文件,内含一千万行字符串,每个字符串在1K以内,要求找出所有相反的串对,如abc和cba。
现在已经是深夜了,再写个博就睡~题目据说是百度的一道面试题,找了个网上的代码,自己跑了一遍。分析如下:文件的大小上限是10G,不可能在内存操作了。考虑设计一种hash使得如果两个字符串维相反串能得出相同的hash值,然后用该hash将文件中的字符串散列到不同的文件中,再在各文件中进行匹配。比如这样的hash函数对字符串上所有字符的ascii求和,因为长度在1K以内,因此范围在int之内
2013-04-01 00:29:59
2420
原创 一个int数组,里面数据无任何限制,要求求出所有这样的数a[i],其左边的数都小于等于它,右边的数都大于等于它
首先汇总一下各种思路:1.最原始的做法,检测每一个元素,看它左边的元素是不是小于等于它,右边的元素是不是大于等于它。但这样做时间复杂度会比较大为O(N^2)。2.第二种做法是对Array[ ]进行快排,得到B[ ],当Array[i]与B[i]相等时,就得到了我们想要的元素。3.可以用两个辅助数组,Max[i]和Min[i],Max是存储数组中下标从0到i的最大值,Min是存储数组中下
2013-03-31 20:36:02
1605
原创 堆排序
首先简要的介绍一下堆排序。1.堆是具有下列性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,成为大顶堆;或者每个结点的值都小于或等于其左右孩子结点的值,成为小顶堆。2.堆排序算法的基本思想:将待排序的序列构成一个大顶堆。此时,整个序列的最大值就是堆顶的根节点。将它移走(其实就是将其与对数组的末尾元素交换,此时末尾元素就是最大值),然后将剩余的n-1个序列重新构造成一个堆,这样就
2013-03-30 11:22:42
679
原创 希尔排序
介绍一个概念,基本有序,就是小的关键字基本在前面,大的基本在后面,不大不小的基本在中间,像{2,1,3,6,4,7,8,2,4,6}这样可以称为基本有序了。下面给出代码:#include using namespace std;void shellSort(int L[], int len){ int i, j; int increment = len; do
2013-03-30 10:16:41
616
原创 单链中的归并排序和快速排序
1.先搞一个单链表的快速排序,不能靠交换value来进行排序。这是百度的一道电面题,当时答得不完整。说一下自己的思路:以表中的第一个结点为比较标准,进行分类,分成两个链表,第一个表中的value都比标准的value小,第二个表中的value都比标准的value要大,注意在分的过程中,要将两个链表切断。然后用递归的方法对两个子表进行排序。。。最后把整个表连接起来。下面给出代码,试了几个数据都可以
2013-03-29 22:19:21
896
原创 sizeof()用法汇总
首先对sizeof()进行介绍,它是C语言判断数据类型长度符的关键字。 用法:sizeof(类型说明符,数组名或表达式);或sizeof 变量名 定义:sizeof是C/C++中的一个操作符(operator),简单的说其作用就是返回一个对象或者类型所占的内存字节数。 1.与strlen()比较 strlen()计算字符数组的字符数,以"\0"
2013-03-29 18:37:34
781
原创 归并排序汇总
1.具体原理就不过多介绍了,先把C++程序设计上面的代码放上来#include using namespace std;void arraycopy(int source[], int sourceStartIndex, int target[], int targetStartIndex, int length);void merge(int list1[], int list1Le
2013-03-29 16:59:42
754
原创 贪心算法之活动选择问题
问题描述: 这是一个调度竞争共享资源的多个活动的问题,目标就是选出一个最大的互相兼容的活动集合。假定有一个n个活动的集合S={a1,a2,...,an},这些活动使用同一个资源,而这个资源在某一时刻只能供一个活动使用。每个活动ai都是有一个开始时间si和一个结束时间fi,其中0 =fj或sj>=fi,则ai和aj是兼容的。在活动选择问题中,我们希望选出一个最大兼容活动集。假定活动
2013-03-27 11:59:57
1396
原创 编程之美子数组之和的最大值
通过确定矩阵区域的上下边界,将二维问题转化为一维问题。时间复杂度转化为O(N*M*min(N,M))具体分析见编程之美。代码如下:#include #include int BC(int** A, int, int, int);int maxSum(int** A, int n, int m){ int maximum = INT_MIN; for (int i = 0;
2013-03-26 09:56:55
647
原创 时间复杂度为O(nlogn)的最长单调递增子序列
写一记,其中利用二分查找法,具体分析见编程之美。#include using namespace std;#define N 20int binarySearch(int src[], int des, int low, int high){ int i = low, j = high; while (low < high) { int mid = (lo
2013-03-25 19:54:19
1272
原创 动态规划之最长公共子序列
具体分析见算法导论,直接上代码了。#include using namespace std;int LCS_Length(string X, string Y, int** C, int XLen, int YLen){ int m = XLen, n = YLen; for (int i = 1; i <= m; i++) C[i][0] = 0; fo
2013-03-25 19:15:13
839
原创 动态规划之矩阵链乘法
Description给定n个矩阵{A1,A2,…,An},其中Ai与Ai+1是可乘的,i=1,2 ,…,n-1。如何确定计算矩阵连乘积的计算次序,使得依此次序计算矩阵连乘积需要的数乘次数最少。 Input有N个矩阵连乘,用一行有n+1个数数组表示,表示是n个矩阵的行及第n个矩阵的列,它们之间用空格隔开. Output你的输出应该有C行,即每组测试数据的输出占一行,它是
2013-03-25 10:49:49
1173
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人