摘要: 题目描述:有一个rand5()随机数生成器,可以生成1-5的随机数,且每个概率都是1/5,如何利用这一个随机数生成器均匀的生成1-7的随机数,即实现一个rand7(),每一个的概率是1/7。 这道题目第一次碰到是在英特尔的笔试题中,(顺便吐槽一下英特尔的面试,简直扯淡,什么正经问题不问就跟我介绍他们 阅读全文
posted @ 2016-09-27 14:00 zhenhai 阅读(422) 评论(0) 推荐(0) 编辑
摘要: 今天学了一下socket编程的内容,看了很多资料和代码,然后自己做了一下实验,一台windows客户端和linux主机之间进行通信,这两者的socket编程部分稍微有一些差别,不过大体上还是一样的,windows要做的准备工作要多一些。linux服务器端代码:监听端口为6666View Code 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <errno.h> 5 #include <sys/types.h> 6 #include & 阅读全文
posted @ 2013-04-04 17:23 zhenhai 阅读(820) 评论(0) 推荐(0) 编辑
摘要: 给出一段序列,要求任意区间内最大连续和所在的区间,首先肯定是要用线段树去解决,并不是要求直接输出和,这样一来就要麻烦一点,如果不要求输出下标,那么一段区间的最大连续和可能来自三部分,左半部分的最大连续和,右半部分的最大连续和,左半部分从最右端开始的和的最大值和右半部分从最左端开始的和的最大值的和,所以,需要每个节点需要记录本节点的最大连续和,左端开始的最大连续和,右端开始的最大连续和,而要得到父节点的左端开始的最大连续和,还需要子节点整个区间的和,所以还要记录节点整个区间的和,现在要求输出下标,那么就要记录每一个和的起始位置,在合并选择的时候就可以直接得到了,所以一个节点需要记录10项,合并的 阅读全文
posted @ 2013-03-25 16:18 zhenhai 阅读(559) 评论(0) 推荐(0) 编辑
摘要: 第一道后缀数组的题目,求得height之后,二分答案就可以,后缀数组的数组绕来绕去,实在感觉有点乱七八糟啊,整体复杂度为nlogn,包过View Code 1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 using namespace std; 5 #define N 20005 6 #define M 100005 7 #define max(a,b) ((a)>(b)?(a):(b)) 8 int s[N]; 9 int sa[N],rank[N],height[N] 阅读全文
posted @ 2013-03-19 15:03 zhenhai 阅读(161) 评论(0) 推荐(0) 编辑
摘要: 后缀数组,是指对给定序列(可以是字符串或者普通的数字数组,甚至可以是某些任意带权值的可比较数据),所有的后缀的排序,数据结构方面,主要包括两个数组:sa[i],rank[i],sa[i]记录当前排到第i的是谁,其实存储的就是其他的排序(如快排或者插入排序这一类依靠比较的排序算法)的最后结果,rank[i]则表示i这个字符开始的子串排第几,在这里,得到sa[i]利用了计数排序,关于计数排序,所以先介绍一下计数排序:计数排序所用到的数据结构:a[i]表示原始的序列,c[i]用来存储中间结果,sa[i]存储最后的结果,计数排序开始时需要用c[i]来存储数字i出现了几次,所以要求数据的范围不能过大,否 阅读全文
posted @ 2013-03-15 21:44 zhenhai 阅读(299) 评论(0) 推荐(0) 编辑
摘要: 确实是一道字符串好题,用AC自动机做的,不过思路比较简单,并且AC自动机还要加一些优化,要找的是串是否出现在了模式串中,这样有很多位置不用去比较,比如说,要考虑一行的时候,这一行的子串就不用再次验证了,因为出现在了这一行的一部分中一定会出现在整个这一行中的,这样能减少处理时间View Code 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 using namespace std; 5 #define N 1005 6 struct node 7 { 8 bool istail 阅读全文
posted @ 2013-03-14 20:28 zhenhai 阅读(213) 评论(0) 推荐(0) 编辑
摘要: 字符串哈希的入门题目,字符串哈希算法,大部分用的其实是进制表示,通过转换成不同进制的整数来表示一个字符串,因为计算机存储整数是有最大限度的,所以按照这种方法进行字符串哈希得到的整数有可能会越界,越界处理之后产生的结果,就是可能会造成冲突:两个字符串的值会相同,这道题不用考虑那么多,不过因为字符串太长,所以要对一个数取模,最多出现NC个不同的字符,可以像整数一样利用NC进制来表示,参照二进制的数值表示也能知道,要对NC^N取模View Code 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring 阅读全文
posted @ 2013-03-06 21:10 zhenhai 阅读(200) 评论(0) 推荐(0) 编辑
摘要: 这本书开发的操作系统,用到了下面的内存分布图:0x00000000 - 0x000fffff : 启动中多次使用,存放VRAM等内容(1MB)0x00100000 - 0x00267fff : 用于保存软盘的内容。(1440KB)0x00268000 - 0x0026f7ff : 空(30KB)0x0026f800 - 0x0026ffff : IDT(2KB)0x00270000 - 0x0027ffff : GDT(64KB)0x00280000 - 0x002fffff : bootpack.hrb(512KB)0x00300000 - 0x003fffff : 栈及其他(1MB)0x0 阅读全文
posted @ 2013-02-27 19:27 zhenhai 阅读(539) 评论(0) 推荐(0) 编辑
摘要: 设置好鼠标和键盘对应的中断之后,这时候操作系统已经对键盘有了反应,只是我们看不到而已,为了能看到按下键盘上按键的编码,需要利用缓冲区接收键盘传过来的数据,并在自己的操作系统上显示出来。首先我们定义一个缓冲区才接收键盘传过来的内容:char keybuf[32],每次按键最多会传过来两个字节的内容,开到32为CPU留下一定的响应时间足够了。然后定义一个缓冲区的结构体,其缓冲区地址的指针赋值为keybuffifo8_init(&keyfifo,32,keybuf);然后我们在主函数中要一直检测缓冲区中是否有数据到来,有就输出到画面上:for(;;) { io_cli(); if(fifo8 阅读全文
posted @ 2013-02-25 17:53 zhenhai 阅读(443) 评论(0) 推荐(0) 编辑
摘要: 为了能够更好的响应中断,要制作缓冲区存储外部设备传送过来的数据,为了能让缓冲区更具有灵活性并且能够充分利用缓冲区,首先要制作成一般样式的缓冲区,可以自由指定大小和起始位置,要能实现循环的读和写,所以需要利用指针来指定缓冲区的起始位置:struct FIFO8 { unsigned char *buf; int p,q,size,free,flags;/*分别表示下一个数据写入位置,下一个数据读取位置,缓冲区大小,以及空闲缓冲区的数量*/};buf指定的是缓冲区的起始地址缓冲区的初始化:void fifo8_init(struct FIFO8 *fifo,int size,unsigned ch 阅读全文
posted @ 2013-02-24 10:53 zhenhai 阅读(359) 评论(0) 推荐(0) 编辑