- 博客(24)
- 资源 (5)
- 收藏
- 关注
原创 面试题23:从上往下打印二叉树(层序遍历) && 面试题25:二叉树中和为某一值的路径
/************************************************************************* > File Name: inorder-tree.cpp > Author: liudong > Mail: [email protected] > Created Time: Thu 28 Apr 2016 12:
2016-04-28 15:35:17 423
原创 面试题18:树的子结构
/************************************************************************* > File Name: subtree.cpp > Author: liudong > Mail: [email protected] > Created Time: Fri 22 Apr 2016 10:40:35
2016-04-25 10:26:42 293
原创 面试题06:在二元树中找出和为某一值的所有路径(未完待续)
题目:输入一个整数和一棵二元树。从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。打印出和与输入整数相等的所有路径。 例如输入整数22和如下二元树 10 / \ 5 12 / \ 4 7 则打印出两条路径: 10,12和10,5, 7。 二元树结点的数据结构定义为:struct BinaryTreeNode
2016-04-18 23:31:02 295
原创 面试题05:求子数组的最大和
题目:输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为O(n)。 例如输入的数组为1,-2,3,10,-4,7,2,-5,和最大的子数组为3,10,-4,7,2,因此输出为该子数组的和18。//求子数组的最大和int MaxSubArray(int a[],int n){ if(a==NUL
2016-04-18 22:52:52 293
原创 内存泄漏
内存泄漏,系统长时间运行之后,可用内存越来越少,甚至导致了某些服务失败。内存泄漏是最难发现的常见错误之一,因为除非用完内存或调用malloc失败,否则都不会导致任何问题。实际上,使用C/C++这类没有垃圾回收机制的语言时,你很多时间都花在处理如何正确释放内存上。1、内存泄漏在计算机科学中,内存泄漏指由于疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并非指内存在物理上的消失,而是应用程
2016-04-18 13:11:04 401
原创 面试题04:找出两个单向链表的第一个公共节点
问题描述:给定两个单向链表,找出它们的第一个公共节点。链表的节点定义如下:struct ListNode{ int Key; ListNode* pNext;};ListNode* FindFirstCommonNode(ListNode* list1,ListNode* list2){ ListNode* pCommon=NULL; i
2016-04-17 21:22:48 663
原创 面试题02:数组中出现次数超过一半的数字
题目:数组中有一个数字出现的次数超过了数组长度的一半,找出这个数字。 分析: 1,如果无序,是不是可以先把数组中所有这些数字进行排序,最常用的快速排序O(N*logN)即可。然后把那个出现次数超过一半的数字直接输出,题目便解答完成了。总的时间复杂度为O(N*logN)。 一个数字在数组中的出现次数超过了一半,那么在已排好序的数组索引的N/2处(从零开始编号),就一定是这个数字。自此,我们只需要对
2016-04-17 20:25:41 338
原创 面试题01:二元查找树转变成排序的双向链
目:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。要求不能创建任何 新的结点,只调整指针的指向。 比如将二元查找树10 / \ 6 14 / \ / \ 4 8 12 16 转换成双向链表 4=6=8=10=12=14=16#include <iostream>using namespace std;struct Node{ int value
2016-04-16 23:49:46 418
原创 确定主机字节序的程序
小端(little-endian)字节序:将低序字节存储在起始地址。 大端(big-endian)字节序:将高序字节存储在起始地址。 主机字节序:某个给定系统所用的字节序。short 数据,占2个字节,给它赋值0x0102。 若采用的大端法,则其低地址端应该存放的是0x02; 若采用的小端法,则其低地址端应该存放的是0x01; 通过联合体来获得其高低地址的数据。参考《Unix网络编程.卷1
2016-04-15 17:33:39 552 1
原创 面试题03:反转链表
题目:输入一个链表的头结点,反转该链表,并返回反转后链表的头结点。链表结点定义如下:struct List{ int value; ListNode* next;};1、循环方法//反转链表List* ReverseList(List* pHead){ List* pNode = pHead; List* pPre = NULL; L
2016-04-15 14:04:44 212
原创 串的模式匹配算法
1、Brute-Force模式匹配算法(暴力匹配) 如果用暴力匹配的思路,并假设现在文本串S匹配到 i 位置,模式串P匹配到 j 位置,则有: 如果当前字符匹配成功(即S[i] == P[j]),则i++,j++,继续匹配下一个字符; 如果失配(即S[i]! = P[j]),令i = i - (j - 1),j = 0。相当于每次匹配失败时,i 回溯,j 被置为0。int In
2016-04-14 22:54:46 2229
原创 希尔排序
基本思想: 先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对全体记录进行依次直接插入排序。//希尔排序(属于插入排序),也叫缩小增量排序void ShellSort(int A[],int n){ int i,j,gap; for(gap=n/2;gap>0;gap/=2){ for(i=gap;i<n;i++
2016-04-13 11:26:28 231
原创 删除链表中等于给定值val的所有节点
(1)删除链表中等于给定值val的所有节点 给出链表 1->2->3->3->4->5->3, 和 val = 3, 你需要返回删除3之后的链表:1->2->4->5。 (2)删除链表中重复的结点 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5 (3)从尾到头打印链
2016-04-06 22:02:28 2034
原创 冒泡排序
冒泡排序是非常容易理解和实现,,以从小到大排序举例: 设数组长度为N。 1.比较相邻的前后二个数据,如果前面数据大于后面的数据,就将二个数据交换。 2.这样对数组的第0个数据到N-1个数据进行一次遍历后,最大的一个数据就“沉”到数组第N-1个位置。 3.N=N-1,如果N不为0就重复前面二步,否则排序完成。//冒泡排序void Swap(int& a, int& b){ int t
2016-04-06 19:16:43 226
原创 插入排序
插入排序(Insertion Sort)的基本思想是:每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子序列中的适当位置,直到全部记录插入完成为止。//插入排序,从小到大void InsertSort(int a[], int n){ for (int i = 1; i < n; i++){ int temp = a[i]; for (int j
2016-04-06 17:33:14 208
原创 快速排序
快速排序算法的基本特性: 时间复杂度:O(n*lgn) 最坏:O(n^2) 空间复杂度:O(n*lgn) 不稳定。快速排序是一种排序算法,对包含n个数的输入数组,平均时间为O(nlgn),最坏情况是O(n^2)。 通常是用于排序的最佳选择。因为,基于比较的排序,最快也只能达到O(nlgn)。//快速排序void QuickSort(int a[], int left, int right
2016-04-06 17:29:56 194
原创 二进制中1的个数
//整数n的二进制表示中1的个数int NumberOf1(int n){ int cnt = 0; while (n != 0){ cnt++; n = n&(n - 1); } return cnt;}测试int n = -1;cout << n << " has 1 is " << NumberOf1(n) << endl;
2016-04-06 11:45:46 183
原创 字符串的排列、组合
迭代方法1、全排列#include <iostream>using namespace std;void Swap(char* c1, char* c2){ char temp = *c1; *c1 = *c2; *c2 = temp;}void Permutation(char* str, char* begin){ if (*begin == '\0'){
2016-04-06 11:02:57 335
原创 最小的K个数
题目:输入n个整数,找出其中最小的k个数。例如输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。1、最简单的思路:对输入的n个整数排序,输出位于前面的K个数。 时间复杂度为O(nlogn)2、O(n)的算法,会修改输入的数组
2016-04-05 22:06:11 265
原创 蛇形矩阵(百度2016实习招聘)
#include "stdafx.h"#include <iostream>#include <vector>using namespace std;int _tmain(int argc, _TCHAR* argv[]){ int m,n; cin >>m >> n; vector<vector<int> > vec(m, vector<int>(n)); in
2016-04-04 11:52:39 226
原创 动态数组
1、一维数组 int *p1 = new int[10]; //一维数组 //todo delete[] p1;2、二维数组m*n int m = 10; int n = 5; int **p2 = new int*[m]; for (int i = 0; i < m; i++){ p2[i] = new int[n]; }
2016-04-04 11:00:10 389
原创 最大公约数
1、辗转相除法 也叫欧几里德算法。//迭代法int GCD1(int a,int b) //GreatestCommonDivisor{ /*if(b==0) { return a; } else { int tem=a%b; return GCD(b,tmp); }*/ return b
2016-04-03 11:17:11 323
原创 数制转换(十进制、二进制、八进制、十六进制)
十进制整数N向其它进制数d(二、 八、 十六)的转换是计算机实现计算的基本问题。 转换法则: n=(n div d)*d+n mod d 其中: div为整除运算,mod为求余运算 例如 (1348)10= (2504)8, 其运算过程如下: n n div 8 n mod 8 1348
2016-04-02 10:35:07 1863
Head First Design Patterns
2015-11-13
深度探索C++对象模型
2015-11-13
STL源码剖析
2015-09-23
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人