- 博客(17)
- 资源 (1)
- 收藏
- 关注
原创 打印1到最大的n位数
解析:打印1到最大的n位数,首先因为n的大小没有确定,所以就得分两种情况考虑,假如n在整数范围内,当n小于INT_MAX时,直接用处理整数的方式来计算,否则就得将n转化成字符串来处理,具体整数处理,请看代码//打印1到最大的n位数bool print_number(char *str,int n){ int top=0; //从个位开始算起 for(int i=n-1; i>=0;
2016-06-29 01:49:22 1899
原创 进程和线程的区别
操作系统面试题1、进程和线程的区别?解析:(1)进程是资源的分配和调度的一个独立单元,而线程是CPU调度的基本单元 (2)同一个进程中可以包括多个线程,并且线程共享整个进程的资源(寄存器、堆栈、上下文),一个进行至少包括一个线程。 (3)进程的创建调用fork或者vfork,而线程的创建调用pthread_create,进程结束后它拥有的
2016-06-27 20:53:51 86441 7
原创 Linux 进程间通信(IPC)
Linux 进程间通信(IPC)说明:首先要声明一点,我接下来要写的都针对在面试的时候被问的一些详解1、为什么要有进程间通信?解析:因为进程间通信主要是强调在不同的进程间交换数据,而数据的交换必须依靠内核来实现,任何一个进程的全局变量在另一个进程中都是看不见的,所以内核开辟了一块缓冲区,进程A将数据放入内核,进程B从内核将数据取走,就实现了进程间通信2、进程间通信有几种通信
2016-06-27 20:49:31 2848
原创 非递归实现二叉搜索树转化成双链表
题目:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。要求不能创建任何新的结点,只调整指针的指向。 10 / \ 6 14 / \ / \4 8 12 16 转换成双向链表4=6=8=10=12=14=16。分析:代码难理解的地方我都已经注释了,为什么要写非递归的实现,是因为我在看剑指offer的时候,上面是递归实
2016-06-24 15:32:48 1633 1
原创 二叉搜索树的后序遍历序列
题目:输入一个整数数组,判断该数组是不是一颗二叉搜索树的后续遍历的结果,如果是返回true,否则返回false分析:由于二叉搜索树的特性,左子树一定小于根节点,右子树一定大于根节点,所以在一颗二叉搜索树中不会出现两个相同的节点bool IsBST(int arr[],int len){ assert(arr !=NULL); if(len < 0) return fals
2016-06-24 10:04:36 1353 1
原创 输入两个整数m和n,计算m需要改变多少位才能得到n
题目:输入两个整数m和n,计算m需要改变多少位才能得到n?解析: 这个题我最开始是没有思路的,想了很久才有点思路,思路的来源是把他们转化成二进制后才有的 例如:(5)的二进制:0101 (3)的二进制:0011 如果要把5变成3的话,需要改变:2次,因为第一位0和最后一位1都相同 所以不需要改变,做法,先将两个数
2016-06-22 21:36:55 3514
原创 旋转数组的最小值
题目:把一个数组最开的若干个元素搬到数组的末尾,我们称之为数组的旋转,输入一个递增排序的的数组的一个旋转,输出旋转数组的最小元素,例如:数组{3,4,5,1,2}旋转后为{1,2,3,4,5},该数组的最小值为:1解析: 这是最近在看剑指offer,然后就看到这道题了,然后上面的解法有两种:1、也是最容易想到的一种,将数组按升序排序一下,然后数组的第一个数就是最小值,
2016-06-22 21:03:55 1733
原创 只创建在堆上生成的变量详解
解析:今天在看Effective C++时,看到了抽象函数详解那块,于是很自然的就想到了以前看过的一道题:创建只在堆上生成的变量。这题换句话说:只能用指针创建变量,即Type *value=get_point();类似于这样的问题,有两种方法可以完成这个问题:1、第一种,也是最能先想到的一种,将构造函数放在private(私有)里,这样就无法在栈上定义变量了,这种很简单,基本学过class
2016-06-20 22:36:55 2727
原创 打印1到最大的n位数
解析://打印1到最大的n位数//最开始是看剑指offer实现的,但看着有点晕,于是自己经常调试后总结出来的//所以如果看不怎么懂的时候将代码写出来然后调试,调试后就知道它是怎么运行的//注释的部分是剑指offer上实现的,bool increment(char *str){ //bool is_over_flow=false; int tmp=0; //int nTake
2016-06-19 01:29:53 565
原创 连续子数组的最大和
1、分析://之前在剑指offer上看到这个问题,感觉它实现的代码让我有一些难理解,所以看了它上面的思路自己实现了一下,个人感觉比他写的代码好理解点,所以就分享哈,如果有不正确的,欢迎提出意见 2 #include 3 #include 4 using namespace std; 5 6 //连续子数组中最大和 7 //思想:从第一个第一个数开始往
2016-06-17 22:05:01 1812 1
原创 两个链表是否相交详解
//两个链表是否相交?//常规解法,但时间复杂度为O(N1*N2)bool intersct(node *des,node *src){ if(des==NULL || src==NULL) return false; node *cur_des=des; while(cur_des !=NULL) { node *cur_src=src; while(cur_src
2016-06-07 19:55:00 742
原创 链表面试题详解
struct node{ int value; struct node *next; node(int key=0):value(key){}};//无头的单链表void init(node *&head){ if(NULL==head) head=NULL;}//两种情况,head==NULL或者没有找到都返回NULL//否则返回找到的节点node* find(no
2016-06-07 19:07:27 519
原创 二分查找详解
int search(int *arr,int size,int key){ assert(arr !=NULL); assert(size>0); int high=size-1; int low=0; while(low <=high) { int mod=low+(high-low)/2; if(arr[mod]==key) return mod; if(ke
2016-06-07 19:02:20 538
原创 双链表插入 删除详解
节点结构:struct both_node{ int key; struct both_node *prev; struct both_node *next; both_node(int k) :key(k),prev(NULL),next(NULL) {}};不带头节点的双链表实现插入 删除,双链表//插入void insert_both(both_no
2016-06-07 18:09:49 4525
原创 memcpy优化 实现高效
1:函数原型void * memcpy ( void * des, const void * src, size_t size );它是实现对内存的拷贝,所以还是很高效的,我这里没有考虑字符重叠的情况,只是实现它的高效性,废话不多说直接上代码1 2 #include 3 #include 4 using namespace std; 5 6 void* Me
2016-06-04 18:33:36 10617 2
原创 数组中出现次数超过一半的数
分析:6//找出在一个数组中出现次数超过一半的数,可以这样理解,找一个数的中位数 7 //基于这样思想最直观的做法是排序后找中间的数既可,但最好时间复杂度也得O(NlogN) 8 //所以用一种简单的办法来解决 9 //定义两个变量,从第一个数开始找,并记录第一个数为result为需要找的数,它出现的次数初始化为:times=1 10 //以后只要找到和result相
2016-06-17 21:16:06 3656
转载 红黑树详解
转载请标明出处,原文地址:http://blog.csdn.net/hackbuteer1/article/details/7740956一、红黑树概述 红黑树和我们以前学过的AVL树类似,都是在进行插入和删除操作时通过特定操作保持二叉查找树的平衡,从而获得较高的查找性能。不过自从红黑树出来后,AVL树就被放到了博物馆里,据说是红黑树有更好的效率,更
2016-06-07 20:27:15 446
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人