以前有一个方法叫如来神掌,也是类似地工作。
我只是简单说说,一个在聊天的时候能够得到别人IP的原理和方法。
首先,需要明白IM的通信原理。现在P2P的通信工具基本不能发展起来了(In China),你所说的每一句话都是需要接受国家政府机构的监控。但是你仍然拥有言论的自由,一种受限的自由,无规则不成方圆也许能解释这个东西。只有你发出去的消息通过IM的服务器转发,服务器才能记录你的IP、账号信息和言论,然后转发到对方客户端。这样别人就得到消息了。但是从这个转发过程中你是不是不能得到对方客户端的IP的,只有服务器才知道,而你只能得到服务器的IP。那么,什么时候才能得到对方的IP呢?
这个肯定是服务器告诉你对方的IP你才知道,因为对方客户端未必也知道你的IP,所以不能直接通信。文字消息是需要监控和记录的,这个很容易,但是传输图片和大文件的时候,服务器就不可能做到一一监控了。因为文件传输需要占用很多带宽,而服务器也不可能应付得了那么多长连接,加上这些文件的内容监控起来也不容易,服务器也没那么多空间去存放,所以此时一般的IM都会让客户端之间进行P2P通信——即客户端直接向另外一个方发送数据。这种情况下,你就必须要得到对方的IP了。
阅读剩余部分...
July 21, 2010
| 作者:白菜
|
分类:编程算法
这两个题网上都有,我只是整理了下,顺便提出了自己的一些思路
小题目1:
现有长为144cm的铁丝,要截成n小段(n>2),每段的长度不小于1cm,
如果其中任意三小段都不能拼成三角形,则n的最大值为?
小题目2:
对于给定的三个正整数a,b,c,计算a的b次方除以C的余数。
a=452,b=23166,c=29875
对于题目1,关键是临界条件就是两边之和等于第三边。
两边之和等于第三边,可以理解为f(n-2)+f(n-1)=f(n)[n>=3].
斐波那契数列出来了,然后此题解答完毕。
由于斐波那契数列存在黄金分割,1.618^10~=144.
答案是10.
echo floor(log(144)/log(1.618));
阅读剩余部分...
July 21, 2010
| 作者:白菜
|
分类:编程算法
下面这篇文章是从StackOverflow来的。LZ面试的时候遇到了一道面试题:“如果有三个Bool型变量,请写出一程序得知其中有2个以上变量的值是true”,于是LZ做了下面的这样的程序:
1 boolean atLeastTwo(boolean a, boolean b, boolean c) {
2 if ((a && b) || (b && c) || (a && c)) {
3 return true;
4 } else {
5 return false;
6 }
7 }
面试官接着问到,请对你的这个程序改进一下,但LZ不知道怎么改进,于是上StackOverflow上问了一下,下面是 StackOverflow上的众网友的回答。再往下看的时候,希望你自己能先想一想怎么改进。
有人说,如果你有下面这样的代码?
1 if (someExpression) {
2 return true;
3 } else {
4 return false;
5 }
你应该改成:
1 return someExpression;
所以,LZ的代码应该写成:
1 return ((a && b) || (b && c) || (a && c));
当然,解法不单单只有一种,还有下面的这些解决:
阅读剩余部分...
July 21, 2010
| 作者:白菜
|
分类:编程算法
下面是一些比较重要的算法,罗列了32个,但我觉得有很多是数论里的,和计算机的不相干,所以没有选取。下面的这些,有的我们经常在用,有的基本不用。有的很常见,有的很偏。不过了解一下也是好事。也欢迎你留下你觉得有意义的算法。(注:本篇文章并非翻译,其中的算法描述大部份摘自Wikipedia,因为维基百科描述的很专业了)
- A*搜寻算法
俗称A星算法。这是一种在图形平面上,有多个节点的路径,求出最低通过成本的算法。常用于游戏中的NPC的移动计算,或线上游戏的BOT的移动计算上。该算法像Dijkstra算法一样,可以找到一条最短路径;也像BFS一样,进行启发式的搜索。
- Beam Search
束搜索(beam search) 方法是解决优化问题的一种启发式方法,它是在分枝定界方法基础上发展起来的,它使用启发式方法估计k 个最好的路径,仅从这k 个路径出发向下搜索,即每一层只有满意的结点会被保留,其它的结点则被永久抛弃,从而比分枝定界法能大大节省运行时间。束搜索于20 世纪70 年代中期首先被应用于人工智能领域,1976 年Lowerre 在其称为HARPY的语音识别系统中第一次使用了束搜索方法,他的目标是并行地搜索几个潜在的最优决策路径以减少回溯,并快速地获得一个解。
阅读剩余部分...
July 21, 2010
| 作者:白菜
|
分类:编程算法
对我来说,一个好的程序员的定义应该是追求无错的代码。 一些人也许认为好的程序员是那些懂得多门编程语言,懂得很牛技术的程序员,是的,这在某些情况下是对的。但归根到底,无论你用什么样的技术,什么样的语言,所有的程序被写出来,其功能都要尽可能地没有错误。 我们可以想像一下,如果一个能力普通的程序员有足够多的时间来做测试,那么,其也可以保证他的代码的质量。所以,要达到质量高的代码只需要有足够多的时间来做测试。
但是,很明显,所有的已经开发出来项目都是在不完美的条件下开发出来的,一般来说,几乎所有的项目都是在最大化程序员软件的开发速度。而且,很多情况下,我们似乎对深度测试和压力测试并不是很关心,所以,我们总是在精神上期望那些赶工出来的代码可以正常工作。 其实,开发速度和软件产品质量并不矛盾。。下面是是五个程序员可以在这种不完美的情况下做得更好的观点(它们都和语言和技术没什么关系,只不过是一种你的工作行为,能够和所有的行业相通),这五个观点也许可以让你成为这样的好程序员。
阅读剩余部分...
July 21, 2010
| 作者:白菜
|
分类:编程算法,C语言
这几天,本站推出了几篇关于C语言的很多文章如下所示:
我们可以看到很多C语言相关的一些东西。比如《语言的歧义》主要告诉了大家C语言中你意想不到的错误以及一些歧义上的东西。而《谁说C语言很简单》则通过一些看似你从来不可能写出的代码来告诉大家C语言并不是一件容易事情。《6个变态的hello world》和《如何弄乱C的源代码》则以一种极端的方式告诉大家,不要以为咱们自己写不出混乱的代码,每个程序员其实都有把代码搞得一团乱的潜质。通过这些文章,相信你对编程或是你觉得很简单的C语言有了一些了解。是的,很不容易吧,以前是不是低估了编程和C语言?今天是否我们又在低估C++和Java呢?
本篇文章《C语言的谜题》展示了14个C语言的迷题以及答案,代码应该是足够清楚的,而且我也相信有相当的一些例子可能是我们日常工作可能会见得到的。通过这些迷题,希望你能更了解C语言。如果你不看答案,不知道是否有把握回答各个谜题?让我们来试试。
阅读剩余部分...
July 21, 2010
| 作者:白菜
|
分类:编程算法,C语言
昨天同事问了我一个,有两个循环语句:
for(i = n; i > 0; i--)
{
…
}
for(i = 0; i < n; i++)
{
…
}
为什么前者比后者快?
我当时的解释是:
i--操作本身会影响CPSR(当前状态寄存器),CPSR常见的标志有N(结果为负), Z(结果为0),C(有进位),O(有溢出)。i > 0,可以直接通过Z标志判断出来。
i++操作也会影响CPSR(当前程序状态寄存器),但只影响O(有溢出)标志,这对于i < n的判断没有任何帮助。所以还需要一条额外的比较指令,也就是说每个循环要多执行一条指令。
(这是五年前tjww告诉我的,当时他在AVR上写一个LCD驱动程序,使用后者LCD会闪烁,使用前者则没有问题。)
阅读剩余部分...
July 21, 2010
| 作者:白菜
|
分类:编程算法
题目:
一群猴子排成一圈,按1,2,...,n依次编号。然后从第1只开始数,数到第m只,把它踢出圈,从它后面再开始数,再数到第m只,在把它踢出去...,如此不停的进行下去,直到最后只剩下一只猴子为止,那只猴子就叫做大王。要求编程模拟此过程,输入m、n, 输出最后那个大王的编号。
来源:
http://topic.csdn.net/u/20090327/15/eb87c0f9-75e1-4977-b1ee-fdb9a7a34b7e...
分析:
此题是约瑟夫环问题,实际上如果去网上搜有经典的解决方法和解释。这种算法的特点是复杂度低。
代码:非原创,这我是以看懂为目标的.
function kickMonkey ($n,$m) {
$s = 0;
for ($i=2; $i<=$n; $i++) {
$s = ($s+$m)%$i;
}
$win = $s+1;
return $win;
}