10 2011 档案

摘要:完美笔试的最后一题,只写了个+,准备用+模拟*的,回来看网上的资料,发现自己写得不对,于是回来花写时间写了下,各种心得。实现思路很简单,用数组实现,同时用一个len表示占用空间,由于加法和乘法都要求对齐,所以按照数字的逆序表示要方便些,若要输出的话逆向输出即可(在此复习了下ostream 和friend 语义)。数组是字符串的集合,要保持字符串的特有的'\0'结尾符。下面的代码不求完美,但求思路,所以用了固定数组,同时不支持负数形式。加法的实现比较简单,有点类似于归并的代码,注意最后要更新len和末尾结束符。乘法借用的是网上的思路,用了一个临时数组(注意大小,如何证明不会溢出? 阅读全文
posted @ 2011-10-16 23:27 westfly 阅读(1298) 评论(0) 推荐(0)
摘要:求1+2+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字以及条件判断语句题目比较变态。起初不愿意多想,只知道模板的发现是由于某人发现在编译打出的错误信息计算出了值,于是才有后面的故事。第一想法的静态模板编译递归计算。后来看到一个比较好的,是用表达式作为防御性编程——作为递归的条件(无判断),比较巧妙,于是sharing一下。#include <stdio.h>int sum(int n){ int tmp = 0; (n)&&(tmp = sum(n-1)); return n+tmp;}int main(){ p 阅读全文
posted @ 2011-10-11 09:59 westfly 阅读(564) 评论(1) 推荐(0)
摘要:给定一个未知长度的整数流,如何从中随机选取个m随机数。解决方法:定义长度为m的数组,对于数据流中的前1000个关键字,显然都要放到数组中。对于数据流中的的第n(n>m)个关键字,则这个关键字被随机选中的概率为 m/n。故以 m/n 的概率用这个关键字去替换数组中的一个。这样就可以保证所有关键字都以 m/n的概率被选中。对于后面的关键字都进行这样的处理,这样就可以保证数组中总是保存着m个随机关键字。可以用归纳法证明关键字都以 m/n的概率被选中。void swap(int* p, int* q){ int tmp = *p; *p = *q; *q = tmp;}void sh... 阅读全文
posted @ 2011-10-07 22:10 westfly 阅读(385) 评论(0) 推荐(0)
摘要:TCP三次握手 TCP协议提供可靠的连接服务,采用三次握手建立一个连接。以下步骤概述了通常情况下客户端计算机请求与服务器计算机简历TCP的过程:TCP三次握手图解TCP图解3次握手1. 客户端向服务器发送一个SYN置位的TCP报文,其中包含连接的初始序列号x和一个窗口大小(表示客户端上用来存储从服务器发送来的传入段的缓冲区的大小)。2. 服务器收到客户端发送过来的SYN报文后,向客户端发送一个SYN和ACK都置位的TCP报文,其中包含它选择的初始序列号y、对客户端的序列号的确认x+1和一个窗口大小(表示服务器上用来存储从客户端发送来的传入段的缓冲区的大小)。3. 客户端接收到服务器端返回的S. 阅读全文
posted @ 2011-10-03 16:18 westfly 阅读(453) 评论(0) 推荐(0)
摘要:题目:You are given an array A that contains integers. Every integer occurs 3 times in A leaving one integer that appears only once. Fastest way to find that single integer.分析:如果这里的数组A的规模比较小,在内存的可以容纳的范围之内,可以建立hash表,顺序扫描A中的每一个 数,统计每个数的出现次数,最后找出仅出现一次的数即可,时间复杂度为O(N),空间复杂度为O(N)。如果数组A的规模很大呢?难道是进行外排序,然后 通过me 阅读全文
posted @ 2011-10-03 16:14 westfly 阅读(290) 评论(0) 推荐(0)