2014年11月10日

摘要: 判读两个链表是否相交以及如果相交它们的第一个公共节点的问题,主要分这么几种情况: 1)两个链表均不含有环 2)两个链表均含有环 对于一个有环一个没有,那么它们即不相交也没有公共节点 首先定义节点的结构struct Node{int value;Node *next;}; 判断链表是否有环... 阅读全文
posted @ 2014-11-10 00:31 碎雨 阅读(2204) 评论(0) 推荐(0) 编辑

2014年9月15日

摘要: 去一家IT公司面试,当时面试官问的,可惜没出来,后来上网搜了一下,找到了解决方案,问题:已知随机数函数rand5(),可以均匀随机生成1~5,编写随机函数rand7(),可以随机生成1~7,并且保持均匀性。当时,想的是rand5()+ rand5()%3,但是这样是无法保证期均匀性的。后来上网找到了... 阅读全文
posted @ 2014-09-15 15:57 碎雨 阅读(744) 评论(0) 推荐(0) 编辑

2013年6月4日

摘要: ubuntu alternate的安装比desktop复杂一点,因为alternate的安装过程有个步骤是检测cd-rom,如果你是刻盘安装,自然没问题,但是,现在的安装一般是将系统刻到U盘里,或者在硬盘中划出一个分区,将其制作成启动盘. 这里我是用U盘安装的... 安装前的准备: 1)在硬盘上分出一个空闲分区:在win7下用磁盘管理,划出一个空闲分区,不要格式化(这里我分出的是50G的空间) 2)下载ubuntu-12.04-alternate-i386.iso 将其刻录到U盘中,完成后,将ubuntu-12.04-alternate-i386.iso 源文件也拷贝到U盘的根目录下 具体安. 阅读全文
posted @ 2013-06-04 20:51 碎雨 阅读(1650) 评论(1) 推荐(0) 编辑

2013年5月5日

摘要: 1.异常控制 异常是一种形式的异常控制流,它的一部分是由操作系统实现,一部分是由硬件实现的.因为有一部分是有由硬件实现的,所以具体细节会随着操作系统的不同而不同,然而基本的思想都是相同的. 异常就是控制流中的突变,用来响应处理器状态中的某些变化.任何情况,当处理器检测到有事件发生时,它就通过一张异常表,进行一个间接过程调用(异常),到一个专门处理这类事件的操作系统子程序-异常处理程序: 当异常处理程序完成后,根据引起异常的事件类型,会发生以下三种情况之一: 1>处理程序将控制返回给当前指令 2>处理程序将控制返回给,如果没有发生异常时,将会执行的下一条指令 3>处理程序终止被 阅读全文
posted @ 2013-05-05 10:43 碎雨 阅读(1146) 评论(0) 推荐(1) 编辑

2013年5月4日

摘要: C语言程序的编译和链接过程1.程序的编译 一般而言,大多数编译系统都提供编译驱动程序(complier driver),根据用户需求调用语言预处理器,编译器,汇编器和链接器.例如有如下历程://main.cvoid swap();int buf[2]={1, 2};int main(){ swap(); return 0;} //swap.cint *bufp0 = &buf[0]int *bufp1;void swap(){ int temp; bufp1 = &buf[1]; temp = *bufp0; *bufp0 = *bufp1; *bufp1 = temp;} 驱 阅读全文
posted @ 2013-05-04 09:39 碎雨 阅读(18644) 评论(0) 推荐(1) 编辑

2013年5月2日

摘要: OO设计原则: 在程序设计领域,面向对象设计的设计原则有封装变化,面向接口而不是实现,优先使用组合而非继承,具体分为五个基本原则:单一功能原则SRP,开闭原则OCP,里氏替换原则LSP,接口隔离原则ISP,依赖反转原则DIP. 1>单一功能原则SRP: 单一功能原则SRP规定每个类都应该有一个单一的功能,并且该功能应该有这个类完全封装起来,所以这个类的服务都应该严密的和该功能平行(功能平行意味着没有依赖). 2>开闭原则OCP: 开闭原则OCP规定软件中的对象(类,模块,函数等)应该对于扩展是开放的,但是对于修改是封闭的,这意味着一个实体是允许在不改变它的源代码的前提下变更它的行为 阅读全文
posted @ 2013-05-02 09:55 碎雨 阅读(383) 评论(0) 推荐(0) 编辑

2013年3月12日

摘要: 二分搜索代码如下:int BinarySearch(int t, int a[], int n){ int l = 0; int u = n-1; int i = -1; while(1){ if(l > u){ i = -1; break; } int m = (l+u)/2; if(a[m] < t){ l = m + 1; }else if(a[m] == t){ i = m; break; }else{ u = m - 1; } } return i;} 如果在... 阅读全文
posted @ 2013-03-12 17:32 碎雨 阅读(148) 评论(0) 推荐(0) 编辑
摘要: 堆排序(HeapSort) 堆排序主要是利用了数据结构堆的相关性质来进行排序操作。简单来说,堆的结构图类似于二叉树,有两种堆,最大值堆和最小值堆,在最大值堆中,堆的每一个节点的值,都大于该节点的两个子节点(left,right)的值,所以,根节点的值最大,类似最小值堆则相反。代码如下:void HeapSort(int *A, int n){ BulidMaxHeap(A,n); for(int i = n-1; i>=1; i--){ Exchange(A[0],A[i]); heapsize[A]--; MaxHeapify(A, 0); }}void BuildM... 阅读全文
posted @ 2013-03-12 17:24 碎雨 阅读(292) 评论(0) 推荐(0) 编辑
摘要: 计数排序 计数排序的可以在线性时间O(n)内完成对长度为n的数组进行排序,但是,该算法的缺陷主要有两点,一是通过牺牲了空间来换取时间的高效,二是,对数组元素的范围有要求,不能过大。 代码如下://A[1...n] in the range of (0...k)void CountingSort(int *A, int *B, int k, int n){ int *C = new int[k]; memset(C, 0, sizeof(C)*sizeof(int)); for(int i = 0; i <= n-1; i++){ C[A[i]] = C[A[i]] + 1; } ... 阅读全文
posted @ 2013-03-12 16:30 碎雨 阅读(262) 评论(0) 推荐(0) 编辑
摘要: 1.快速排序 快速排序的基本思路属于分治算法的一种,通过选择数组中的某一个元素作为分界点(key),大于key的元素放置在数组右边,小于key的元素放置在数组的左边,然后通过递归调用该过程来实现排序算法。 代码如下:int Partition(int *A, int p, int q){ int i = p; int key = A[i]; for(int j = p+1; j <= q, j++){ if(A[j]<key){ i++; int temp = A[i]; A[i] = A[j]; A[j] = temp; } } ... 阅读全文
posted @ 2013-03-12 16:20 碎雨 阅读(3411) 评论(0) 推荐(0) 编辑

导航