编程之战 - xp1024.com
《编程之战》


第四十七章分配奖金的详细说明

这章里面的“抽肥补瘦”或者说“劫富济贫”算法过程如下:

最开始负责人提出的分配方式像这样的列表:

[2,3,5,45,45]

我们要确保每个人至少有5k奖金,那么就把5看成基准,看每一项跟它差多少。

[-3,-2,0,40,40]

然后,开始“劫富济贫”,最穷的是-3,最富的是第一个40,从40减去一补给-3,得到:

[-2,-2,0,39,40]

然后,最穷的是第一个-2,最富的是40,40减去一补给-2,得到:

[-1,-2,0,39,39]

每次找最穷的和最富的,最富的补给最穷的1个点。

[-1,-1,0,38,39]

[0,-1,0,38,38]

[0,0,0,37,38]

此时,每一项都达到了基准,那么我们把每一项加上5,就得到最终结果:

[5,5,5,42,43]

哈哈^_^,怎么样,过程也不是很复杂吧~~

大家多跟小猿交流哈!

第五章百万级斐波那契的详细说明

f(2n)=f(n1)*f(n)f(n)*f(n-1)



f(2n)=f(n1)*f(n)f(n)*(f(n1)-f(n))

f(2n1)=f(n1)*f(n1)f(n)*f(n)

f(n)f(n1)f(2n)f(2n1)

飬u档

java120w~

本书参考引用的相关资料

书籍:

《编程珠玑续》人民邮电出版社

《java软件结构与数据结构第4版》清华大学出版社

《javascript语言精粹》电子工业出版社

《算法第4版》人民邮电出版社

《算法导论第3版》机械工业出版社

《java程序员的基本修养》电子工业出版社

《具体数学计算机科学基础第2版》人民邮电出版社

《javascript模式》中国电力出版社

网站:

codewars

leetcode

csdn博客

博客园

第一章 你好世界

杨成是一位普普通通的大学生。

作为一名计算机系的尖子生,他发现周边很多人都迷上了一款名为“代码战争”的游戏。

在好奇心的驱使下,他去了好久没去过的一家网吧。

现在的网吧跟以前的完全不是一个概念了。

由于vr技术的流行,原本的主机显示器模式被替换成了vr终端。

这一个个犹如摩托车头盔般的玩意儿。

杨成选择了一个座位,然后熟练地戴上一个“头盔”。

眼前的视觉一暗,迅速地在眼前成像出一个三维立体的菜单。

“选择进入代码战争”。

杨成发出指令。

眼前很快出现了一个巨大的进度条,下方则是一个个在切换的进度提示:

加载图片素材,加载ui特效,加载动画效果

估摸着过了五秒钟的样子,一阵轻微的眩晕感袭来,整个世界陷入一片黑暗,犹如混沌未开。

再下一刻,杨成站在了实地上,一阵寒意袭来,让他不禁打了个寒颤。

云雾缭绕的群山之巅,终年有积雪不化,眼前有一幢犹如笔架般的高山,比这山巅更高,更宽阔!

更令人啧啧称奇的是眼前这高山的绝壁,岩石如同镜壁般光滑,真真是鬼斧神工,巧夺天工!

出现在杨成面前的还有一个并不起眼的东西,一台貌似21世纪初期出现的古董电脑。

这电脑并没有连上电源,甚至没有类似电源线的东西,杨成好奇地走过去。

对于程序员而言,大自然的美妙奇观自然是不如一台古董电脑来得有吸引力。

这电脑显示器闪烁着蓝色微光,上面有一些文字,杨成定睛一看。

“欢迎来到代码战争,为了表明你的玩家身份,请用你最熟悉的编程语言,编写helloworld!”

杨成挠了挠头,觉得有些乏味,他毕竟不是刚入门的菜鸟了,对于这种小把戏不感兴趣。

不过,为了进一步了解这个世界,他还是拿起了键盘,在上面敲了一通。

alert(“helloworld!”);

显示器沉默了整整一分钟,似乎在进行艰难的解析。

wtf?

杨成本来想用javascript写个更通俗版的你好世界。

比方说用函数。

后者似乎更加和谐。

但他觉得不够刺激,就来了个alert警告,鬼知道会发生什么事呢?

在杨成这样的“复古派”程序员看来,“平稳退化”与“渐进增强”原则是绝对要遵循的。

(ie6,7,8浏览器)

比方说函数,这个玩意儿在老版本浏览器都不兼容。

又是这么老的电脑,天知道会报什么样的bug?

时间一分一秒地过去了,显示器还在一闪一闪地运转着。

杨成等得不耐烦了,走到一边。

“警告!警告!”

这时四面八方犹如无数个高音喇叭在播音,顿时吓了杨成一跳。

“什么鬼?!”

杨成四处张望,然后他看到眼前的绝壁上,大块大块的岩石纷纷跌落,滚落山崖。

一个个模模糊糊的英文字母和特殊符号逐渐成型,直到最后成为一个个肉眼可辨的字迹。

“helloworld!”

大气磅礴的几个字出现在了杨成的视线中。

“欧!我的上帝啊!”

杨成一声惊呼。

“尊敬的玩家,恭喜您完成了我们的测试”。

一个系统音出现在了杨成耳畔。

“由于您在测试中表现出色,我们为您开启了系列任务——斐波那契之旅。”

“期待您更加精彩的表现!”

第二章 斐波那契

神圣罗马帝国皇室图书馆,海量的书架井然有序。

一位头戴王冠的中年男子和一位学者在这里促膝长谈。

此时夜深人静,牛油烛散发出柔和的光芒,勉强能照亮一小块区域。

“斐波那契,你这兔子问题,寡人想了很久都没有头绪”。

中年男子挠了挠头。

腓特烈二世生平最大的业余爱好便是研究数学。

而眼前这位学者,便是他的座上客,大名鼎鼎的斐波那契。

“兔生二月便能繁衍,每月每对兔可生一对幼兔,则一年可得兔几何?”

腓特烈自言自语着,沉浸其中。

“二月之后可新生一对兔,故三月为两对兔,四月幼兔不足两月,故为三对兔,以此类推”

斐波那契耐心地解答道。

“哈哈哈哈!爱卿果然才思敏捷!”

腓特烈二世竖起了大拇指,眼中满是赞赏之色。

“孤欲编纂《算书》,卿可为之”。

说完,君臣两人离席。

斐波那契走在回住所的路上,脑海中却在回想刚才谈话的内容,似乎有所明悟。

“何不将该类问题,阐述为通项公式?”

他喃喃自语。

回到住所,斐波那契赶紧打开一个小册子,拿起鹅毛笔蘸了蘸墨水,写下刚才的想法。

“若有f(0)为0,f(1)为1,则f(n)为f(n-1)与f(n-2)之和”。

斐波那契抬头看了看窗外的月光。

那月下的树梢之上,停留着一只枯叶蝶,那蝴蝶似乎有所感应,循着灯光,翩翩飞舞。

斐波那契还在专注地思考着,根本没有察觉这只蝴蝶正朝着他飞过来。

那蝴蝶飞过了窗台,然后轻轻地落在了斐波那契的肩头。

下一刻,蝴蝶消失了,杨成的意识出现在了斐波那契脑海中。

“哇!”

杨成惊讶地看着自己这身古欧洲的学者服饰,然后摸了摸下巴。

他感觉自己的体貌特征来了个180度的大转变。

眼前的小册子在烛光下浮现出一行行字,顿时吸引了杨成的注意力。

“已知斐波那契通项公式f(n)=f(n-1)f(n-2),编写求第n项斐波那契数的函数,n在20以内”。

杨成瞪大了眼睛,这里电脑都没有,只有一枝鹅毛笔,怎么写啊?

手写?

似乎问题也不是很大,求20项以内的斐波那契数,完全可以用简单的递归啊!

杨成回忆了一下,然后用鹅毛笔蘸了蘸墨水,在小册子上写了寥寥几行。

这是一种“教科书式”的求解,要求第n项,那么就分解为求第n-1项和第n-2项,那n-1项又可以分解为求n-2和n-3项,以此类推,直到n为0,返回0,n为1,返回1。

但这种方法之所以被称作“教科书式”,一是因为通俗易懂,二是因为效率低下。

求重复的项数太多了,或者说重复计算太多了。

杨成很清楚这种方法的弊端,但应付20以内的,绰绰有余!

果不其然,在杨成写完最后一个括号后,手中的小册子绽放出一道金光。

小册子犹如脱离了重力的束缚一般,慢慢浮空,然后一页接一页地自动翻页,就好比有人在翻阅一般。

第三章 万级斐波那契

“啪嗒”。

小册子掉落在了桌子上。

杨成定睛一看,发现自己刚才手写的解题方法旁边多了一个小小的绿色对勾。

“唉,没啥挑战性啊”。

杨成活动了一下筋骨。

话音刚落,然后,他看到那个小册子自动地翻过了一页,上面又浮现了一些笔迹。

“依上题,若n大于10000,且小于20000,作何解?”

杨成念完这新内容,皱了皱眉头。

“传统的递归方法求斐波那契数列,只限于小数求解,到了万级再用一般性的递归,效率低不说,还有可能导致递归栈溢出”。

“那么如何在原来的代码上做修改,来达到提高性能的目的呢?”

杨成思索了片刻。

“既然递归方法慢的根本在于重复性的计算太多,那么我可以使用缓存!”

杨成很快想到了解答方法,这得益于他有经常上博客论坛向大牛请教的习惯。

在javascript中,对象常用作为缓存,对于斐波那契数列这样的固定序列,用全局对象来缓存是最好的方法。

(object{})

至于具体的逻辑,很好写:

假如缓存中没有这一项,那就缓存进去,如果存在,就直接取出来,无需重复计算。

javascript对象本质上是散列表,或者说哈希表,所以这对象的存取效率高的令人发指,几乎可以忽略性能方面的开销了。

杨成在原本的解答上加了一些代码,用上了缓存的思想。

“这个题目加深了一些难度啊”。

杨成揉了揉太阳穴,看着那小册子再次犹如中了“浮空术”一般晃悠悠地飞向了半空中,开始了不急不慢地翻页。

四周此时静寂无声,杨成看了看窗外,那高高的塔楼顶端,还有卫兵在守卫。

这一切的一切都显得无比真实。

他试着把手伸出窗外,却被一种无形的力量阻隔在了屋内。

一个系统音更是立刻响起:

“任务中,无法离开指定区域!”

他看了看四周,都是些寻常人家的东西。

不过,当他看到了一个小小的架在木炭上面的咖啡壶,一个精致的骨瓷咖啡杯,还有一碗研磨得细细的咖啡粉

杨成顿时有了一个不错的想法

我还需要一罐香浓的鲜牛奶

一盒高品质的方糖

一块最好的黑巧克力

嗯,这样就能度过一段快乐的时光。

等杨成把这些都搞到手了,他嘴角还叼着一根冒着袅袅炊烟的“软中华”。

他一下子恢复了精神,而且无比的振奋。

嘿!哥现在法力无边!

半空中,小册子的翻页速度越来越快,最后猛地一合拢,“啪嗒”一声又掉落在了桌面上。

“这下子应该结束了吧”。

杨成翻开小册子看了看。

在他刚才作答的那片区域旁边,又多了一个绿色对勾。

杨成感觉自己就像刚刚完成作业的小学生,等着老师的批阅。

这小册子果然没有辜负他的期待,稍等了片刻,一行行笔迹就再次出现在了空白的地方。

“啪嗒”。

香烟黯然跌落

杨成这次终于流露出凝重的表情,这下子不是小改了,是大整改了!

第四章 十万级斐波那契

“依上题所述,若n在100000到400000之间,作何解?”

杨成深吸一口气,他决定了,放弃递归,使用传统的线性方法,顺序遍历求解。

这里的递归不是顺序的,斐波那契数列的递归方法是一种深度遍历求解,递归栈中函数作用域对象的开辟和回收都需要很多额外的性能开销,而顺序遍历不存在这样的情况。

顺序遍历共享的是同一个作用域!

可以使用两个临时的变量,因为公式f(n)=f(n-1)f(n-2)的缘故,要求第n项你只需要分别保存第n-1项和第n-2项的结果。

这样做,将算法的空间复杂度降到了最低,和递归庞大的保存栈相比,优势就太大了。

想清了思路,杨成正打算提笔就写,他突然想到一个令人震惊的后果。

对于javascript,浮点数是有大小限制的,对于第几十万项的斐波那契数,它显然已经远远超出了浮点型的范围,那么,自己这个算法会不会导致溢出?

好在他很快想通了,关卡设计者怎么会想不到这样的问题,自己只要能写出正确的算法来就ok了。

这个算法其实并不难,杨成用了十几行代码就搞定了,他心里其实还是有些忐忑的,作为一名准程序员,有这种意识其实还是挺正常的。

不是有个笑话吗,假如有人问一名程序员:你的程序是不是出bug了?这个程序员听到后第一反应是:傻x你懂程序嘛?你会用嘛?而如果有人问程序员:这个效果和预期的有些不一致呢。那程序员肯定心想:糟了!肯定是出bug了!

杨成看着小册子第三次浮空,他有些习以为常了。

舒服地打了个哈欠,伸了伸懒腰,他发觉一个有趣的现象。

这窗外的月亮是不是太完美了,可以说是无暇的。

古人都常说:人有悲欢离合,月有阴晴圆缺,你这月亮做的也太假了一点吧?!

是不是美工姐姐被拖欠了工资啊?

杨成恶狠狠地想着,在心里恶搞了一番游戏团队。

然后他翘着二郎腿,再给自己来了一杯焦炭咖啡。

时间过得很慢,这次小册子被翻页的时间和次数都多得多,显然和数据量有关。

杨成甚至怀疑是台286电脑在充当服务器处理,现代电脑有这么辣鸡嘛?

是不是并发量太大了,服务器被挤爆了的缘故呢?

等到杨成开始怀疑这个小册子组件模块编写者性别取向问题的时候,小册子终于完成了它的使命,“啪”的一声“坠机”了。

“玛德,至少过去了半个钟头”,杨成嘟哝着,再次翻开小册子某页。

刚才写的那十几行代码旁边,又多了一个小小的对勾。

然而,还没来得及为自己高超的“手写代码”能力欢呼雀跃,杨成很快看到了让自己张大嘴巴的一个景象。

“嚯!”,他不禁倒吸一口凉气,犹如泄了气的皮球,倒在了后椅上。

“先前的思路又得改!”

第五章 百万级斐波那契

“依上所述”,这字迹依旧在忠实地记录着题目,“若n在800000到1200000之间,作何解?”

这是一个典型的算法问题,要求高性能。

斐波那契传统的通项公式,已经无法满足这种需求了,或者说,已经被时代前沿所抛弃了。

一般的通项公式,面对这个问题,就如同蜗牛一样爬,让人无法忍受。

需要用到的大整数加法,足以摧毁这种算法脆弱的体系。

这也恰恰体现了时代的局限性,毕竟斐波那契时代距今也相差近千年了。

杨成闭着眼睛,开始回忆以前在网上搜索的那一个个例子。

斐波那契矩阵,两倍项公式渐渐浮现在他脑海中,杨成嘴角咧出一丝笑意。

既然f(n)的公式不行,那就用f(2n)的公式!

他思索了片刻,用鹅毛笔蘸了蘸墨水,写下了一行公式:

f(2n)=f(n-1)f(n)f(n1)f(n)

这是一个对数级的算法,可以胜任大数据的挑战。

具体的算法他没有写,因为他并没有办法来验证程序的正确性,至于做单元测试,那更是想都别想。

令人惊讶的事很快发生了,这个两倍项公式被一个椭圆的金色线条环绕着,最后旁边也出现了个对勾。

“叮!”,一声清脆的系统音,“恭喜玩家您连续完成了阶段任务,请休息一刻钟,我们将为您准备该系列最后的一项挑战!”

“唉”,杨成感觉有些乏味了,这些题目确实比较益智,但总是一个人做,是不是太单调了。

于是他打开玩家面板,选中了客服按钮。

“你好!很高兴为您服务!自助服务请按0,人工服务请按1”。

杨成选择了“1”。

“你好!请问有什么问题嘛?”,那边传来了甜甜的妹子声音。

“我觉得你们的题目设计的很不错,但我有个小小的建议啊”。

“请讲”,客服妹子有耐心地问道。

“你看我一个人,穿着这样的服装,在这里默默地做题目,多枯燥啊”,杨成摇摆着腿。

“嗯”,客服妹子表示理解。

“能不能安排一个类似泰坦尼克号的双人解题环节,给俺试试啊”,杨成坏坏地笑了。

“嗯”,妹子有些无语了,这人真是想象力丰富啊。

“好的,您的需求我们会尽可能考虑的”,妹子体现了良好的职业素质。

“请问您还有什么需要帮助的嘛?”

“没了,我就想和漂亮姐姐你聊聊天啊”,杨成脸上的笑意更浓了。

“祝您游戏愉快,再见,嘀,嘀”,通讯设备那边很快挂断了。

杨成有些不死心,再次选择了客服按钮。

“您拨打的客服热线正忙,请稍后再试”。

“您拨打的客服热线正忙,请稍后再试”。

“法克!”,杨成两手一摊,有些垂头丧气。

好在时间过得很快,一刻钟一下子就过去了。

杨成翻了翻小册子,很快发现了最后一道斐波那契系列的题目。

“这?”,杨成挠了挠头,这问题还真没有想过啊。

“让我想想,这该怎么算呢?”,他撕下一张纸,作为草稿,在上面演算起来。

第六章 负数项斐波那契

“依上所述,若n为负数项,作何解?”,这字迹感觉是一个固定的格式,开头是“依上所述”,中间是“若n为x项”,后面是“作何解?”。

杨成有点鄙视这个出题的人了,你就不能来点新意嘛?

“负数项有意义嘛?”,他不禁道出心中的疑问。

然而事实是,它要你这么求,就必然有它的道理。

比如说f(-1),怎么求呢?

杨成把f(-1)写在了f(0)和f(1)旁边,他仔仔细细地一观察,很快发现了规律。

f(-1)不就是f(1)减去f(0)嘛,f(-2)不就是f(0)减去f(-1)嘛。

那么以此类推,将公式f(n)=f(n-1)f(n-2)简单变换一下,就能得到f(n-2)=f(n)-f(n-1),这不就是负数项公式了吗?

杨成把负数项公式填到小册子上,把它刚一合上,眼前的3d成像菜单顿时烟花齐放,系统制作的掌声如雷,系统声音也及时地响起来。

“恭喜您成功完成了斐波那契之旅所有阶段的任务,您获得的积分明细如下”。

“初始积分2分”。

“递归方法完成斐波那契数列求解奖励2分”。

“缓存提高算法效率奖励2分”。

“线性求解奖励2分”。

“两倍项公式求解奖励5分”。

“负数项求解奖励2分”。

“现今共积分15分,击败了全球10%的玩家,希望您再接再厉!”

“小贴士:获得更多积分将解锁更多功能和特权喔”。

杨成则是有些疲惫地抬了抬眼皮,这题目实在是太耗费脑力和体力了,自己都有些支撑不住了。

有必要买个炒粉,喝点饮料,否则营养跟不上,怎么继续开车?

老司机又不是铁打的!

“请问您要继续挑战下一个关卡嘛?”,系统声音提示道。

“不必了,直接esc吧”,杨成摆了摆手。

“好的,祝您生活愉快,再见!”

眼前的世界骤然变黑,又瞬间恢复了视野。

杨成摘掉vr头盔,揉了揉眼睛。

他这才发现网吧外面已经是一片漆黑了,时钟更是指向了10点。来上通宵的人越来越多。再不回去,估计寝室大门就关闭了,对于翻墙这问题,杨成还真不擅长。

在网吧楼下的小餐馆叫了一份炒粉打包,再买了几瓶饮料,杨成这才走回了寝室。

室友们都在自己的笔记本前,玩一款流行了十多年的单机格斗游戏——“毒奶粉”,杨成耸耸肩,大声嚷嚷道。

“这特么都二十年代了,你们还玩这08年出来的单机网游,太out了吧?”

室友们愤愤不平地比了个中指,然后自顾自地玩去了。

杨成自讨了个没趣,便在书架里翻了翻。

摸索了半天后,他拿出一本不太薄也不太厚的《c专家编程》,然后一个翻身上了上铺。

你说他挑这本经典书是为何?莫不是想拿来装x?

非也,非也,你说这大日光灯下,不拿本书遮脸挡光,能睡得着嘛?太厚了可压得生疼哩。

杨成把那《c专家编程》分开盖脸上,然后闭上了眼睛。

他实在是太累了,很快便进入了睡梦中。

第七章 约瑟夫环(上)

一大清早,天刚蒙蒙亮,杨成洗漱完毕,匆忙吃了点早餐,便来到了网吧。

他心中隐隐地对下一个关卡有了些期待。

作为一名准程序员,新鲜事物对于他总是很有吸引力的。

反倒是那些室友,杨成感觉更像是20世纪的人,居然还玩横板格斗单机游戏,能不能稍微有点追求啊!

杨成很快戴上头盔,进入了角色。

“叮!”,熟悉的系统音响起来。

“亲爱的挑战者,准备前往下一个关卡了嘛?”

“ok,一切就绪”,杨成打出个胜利的手势。

“祝你好运!”,系统发出贴心的祝福,然后杨成的意识进入到了另一个空间。

乔塔帕特小镇的夜晚并不宁静,一群全副武装的士兵闯入了这里,他们戴着狼皮头盔,身穿铠甲,手里拿着盾牌与标枪,身上还配着短剑。这一切表面了他们的身份——罗马人。

“抓住每一个犹太人,记住,要活的!我要亲自把匕首捅进这群吸血鬼的心脏!”,为首的罗马将领发布了不容置疑的命令,士兵们则开始了四处追捕。

而小镇的另一边出口,一群身穿黑色斗篷的人趁着夜色,行色匆匆地逃窜着。

“不能再这样下去了”,有人说道。

“罗马人很快会追上我们,我们逃不掉的”。

“我可不想死在那些刽子手的屠刀下!不如自我了结掉!”,有人哀嚎道。

这时,一个好事者跳了出来。

“我有个提议,咋们41个人排成一个圆圈,由第1个人开始报数,每报数到第3人这个人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。”

“大家赞同吗?”

大部分人举起了手臂,只有两个人除外。

一个自然是杨成,他是来完成任务的,可不是来和这些煞笔纠缠的。

还有一个人,人们都称呼他为约瑟夫,据说是个历史学家或者说是数学家,不过这无关紧要,反正大伙都得玩完儿。

约瑟夫眨巴着眼睛,眼中闪烁不定,不知道在想些什么。

其他人不认得杨成,却认得约瑟夫。

“约瑟夫,你想做胆小鬼吗?没门!”,有人开始愤愤不平了。

“不不不”,约瑟夫摇摇头。

“各位请先入场,我随后就来”。

杨成自然也是很识时务地点了点头,表示自己愿意顺从大家的意志。

约瑟夫瞟了杨成一眼,眼中多了一丝玩味,杨成则是低垂着头,一言不发。

事实上,他正在从全息菜单中调取编辑器面板,来一次死亡边缘的编程。

其他犹太人走到一处空地上,开始组成一道死亡的环形队列。

杨成依然面不改色,他正在一个接一个地编写代码。

“总人数41,报数间隔3,余留人数1”,杨成开始了初始化配置。

对于约瑟夫环问题,可以用循环列表来求解。只要剩余人数大于1个,那么就执行两个操作,一是报数,二是杀人。

然而,时间不等人。

站在圈中的人不耐烦了。

“我说,那边那两个,还不过来是什么意思?!”

“不会要咋们亲自动手吧!”

第八章 约瑟夫环(下)

“好的”,约瑟夫半眯着眼睛,走向人们,他很快站定了位置。

杨成在虚拟编辑器上折腾了半天,最后一运行,好不容易求出了结果。这结果告诉他,第三十一个位置才是最安全,或者说是最后被干掉的。

他放眼一扫,发现第三十一位竟然被约瑟夫占了。

“这狡猾的老家伙!”,杨成不禁唾骂一声,原来约瑟夫早就算出了安全的位置,自己还在这儿傻乎乎的敲代码。

这也只能怪杨成自己,他用循环列表求解约瑟夫环,要模拟整个游戏的过程,不但程序写起来很麻烦,而且执行的效率还很低。如果只是要求出最后的胜利者序号,实施一点数学策略就可以做到。

不过来不及了,再这么下去杨成就会被暴怒而绝望的犹太人撕成碎片了。

于是他加快了思维速度,事实上,因为他初始化配置得当,只需要稍稍改变一下程序代码,把余留人数从1改成2,不就ok了?

程序再次运行,他很快得到了自己应该站的位置——16。

杨成站好了位置,这场死亡游戏便拉开了序幕。

“1”,第一个人吹响了死亡的号角。

“2”,第二个人暂避了风险,不过殊途同归。

“3”,报到这个数字的人,面色惨白,然后,他绝望地掏出一枝匕首,狠狠地划向自己的肌肤。

“噗通!”,鲜血染红了草地,死神继续挥舞着杀戮的镰刀。

“1”

“2”

刚才还站立的人,此时已经倒了个七七八八,而约瑟夫和杨成就好比暴风雨中的巨舰,继续乘风破浪,毫无顾忌。

有些人看出了点端倪,但在绝望中都只是徒劳的,就算是没自杀,那些粗鲁野蛮的罗马人会留活口吗?

“噗通!”,倒数第三位的人倒在了血泊中。

约瑟夫紧盯着眼前这个年轻人,他根本不像是犹太人,更像来自东方的旅人。

“我说,你怎么不报数了?”,约瑟夫目光中流露出一丝狡黠。

“约瑟夫先生,你很聪明”,对于这种智者,杨成毫不吝惜赞美之词。

“哦?你的意思我不明白”,约瑟夫还在装糊涂。

“我的目的和你是一样的!”,杨成平视约瑟夫,后者微微一愣。

“那就是活下去!”,说完,杨成转过身子,走进丛林深处。

“有趣的小子”,约瑟夫丢下这句话,也是一转身,逃了个无影无踪。

这时,东方的地平线上第一缕曙光开始出现,地面上横七竖八的尸体也消失不见了。

“叮!”,愉悦的系统声音响起来。

“恭喜玩家您完成了约瑟夫环任务”。

“先前积分15分”。

“循环列表求解约瑟夫环奖励2分”。

“当前积分17分,击败了全球11%的玩家”。

“才2分,太少了”,杨成玩了几把,也开阔了眼界。

“您现在准备开始下一个挑战嘛?”

杨成伸了伸懒腰。

“马上开始吧,大爷现在精力充沛,打几个怪升级没半点问题”。

第九章 字符串与凶手(上)

下一刻,杨成出现在了一个椭圆形的办公室中。

他西装笔挺,打着潇洒的领带,像极了某行业的成功人士或精英。

不过,墙壁上挂着的一幅米字国旗表明了他现在所处的地理位置,他是以“约翰牛”的身份出现的。

打量着四周,杨成发现了很多书籍和档案文件。

我扮演的这厮到底是干嘛的?

不过,这疑问并不妨碍杨成第一时间发现办公桌上的一台台式电脑。

他就如同发现了外星人一般惊喜。

“让我看看里面究竟有些什么好东西?”。

杨成打开电脑,期望能从里面找到例如小电影般的东东。

桌面上排列着很多花花绿绿的图标。

杨成甚至还发现了一款大型的单机游戏——“xx召唤”。

“真是酷毙了!”。

他满怀期待地双击图标,期望着在里面大杀四方。

毕竟完成任务是其次的,享受生活才是numberone。

令人失望的是,电脑毫无反应。

就如同死机了一般陷入沉寂

“欧!我早该想到!”。

杨成以手掩面。

这关卡中的虚拟物品,不重要的部分当然不会做得太真实,把宝贵的资源浪费在无关紧要的末节上,这是任何一个游戏运营所无法忍受的。

就在这时,办公室的门被敲响了,听起来有些急切。

“请进”,杨成一听就知道任务来了。

门被推开,走进来一位身穿警官制服的中年肥胖男子,他的眼神中充满了敬意。

“你好,我是苏格兰场的警官麦克阿瑟。”

“我们很早就听闻您在信息学方面的非凡造诣,恳请您协助我们调查一起案件”。

警官麦克阿瑟开门见山地说道。

“喔,愿闻其详”。

杨成很爽快地答应了。

听起来事情有些猎奇。

“事情是这样的”。

“有一位关键的目击证人被谋杀了,他在临死前想说出凶手的姓名,但声音很微弱又断断续续的,难以分辨”

“我们获取了他的录音,希望能在您这里得到帮助,看怎么找出凶手”。

杨成表现出一副饶有兴趣的模样。

“恩,你们可有嫌疑人名单?”

“有的,我们把行凶者锁定在了四个人之中,但又不确定到底哪个人才是真凶”。

麦克阿瑟递过来一份文件,上面有四个英文名字:

bernarddeltheil

petergone

peterreeves

rolandscorsini

“能先听听这段录音吗?”。

杨成提出了要求。

光凭几个英文姓名,恐怕大侦探福尔摩斯也查不出个所以然来。

麦克阿瑟掏出一支录音笔,摁下上面的按钮。

一个细若游丝的声音传了出来。

“p~t~g”。

这声音真是让人毛骨悚然,犹如地狱之声。

证人在最后时刻说了五个字母,其中还有2个字母无法分辨。

杨成当然不认为字符串的长度就意味着名字的长度,因为他有可能在说出凶手完整名字前就咽气了。

“好的,请稍等”。

杨成几乎可以肯定是哪个人,但因为游戏任务规则,他不能直接说出答案,而是得用程序员的方式来解决——敲代码。

他在电脑上打开一个编辑器,建立了一段脚本,然后开始编写代码。

对于任何的字符串匹配,是傻乎乎地用逻辑循环,还是用强大而且简洁的正则表达式,我想大部分程序员都会倾向于后者。

杨成对于这个问题很有自信,一小段正则验证便足矣。

第十章 字符串与凶手(下)

正则表达式的性能可能会略低,但它的确很方便啊。

对于这个凶手名称匹配来讲,它是不区分大小写的,所以得加“i”参数,以表示大小写不敏感。

杨成很轻易地完成了这次匹配,甚至用了不到100个字符,假如去掉空格,括号和分号,代码甚至会更短。

正则就是爽!

他深吸一口气,将代码和运行结果保存好。

“警官,我想我已经找出凶手了”。

杨成脸上带着神秘的微笑。

“哦?是嘛!快讲给我听听!”。

麦克阿瑟按捺不住地想赶快知道结果。

杨成拿出一支签字笔,在嫌犯名单的第二个“petergone”上面划了个圈圈,然后递给他。

“噢,真是太感谢您了!”,麦克阿瑟伸出手,紧紧地握了握杨成的手。

话说完,警官腆着个大肚子,晃悠悠地挥手告别。

看着麦克阿瑟走出门外,杨成后仰在皮沙发上,舒服地把双手交叉放在后脑勺。

“叮!”,系统声音及时地响起来。

“恭喜玩家您完成了找出凶手的任务!”

“先前积分17分”。

“使用正则表达式匹配字符串奖励2分”。

“代码量在100个字符以内奖励1分”。

“当前积分20分,击败了全球13%的玩家”。

“不错”,杨成拍了拍手。

这个积分系统还考虑到了代码量问题,可以说是比较完善。

“您要继续下面的挑战嘛?”

“不不不”,杨成摆摆手。

“让我先在这舒适的办公室和皮沙发上,享受一段快乐的午休时间”。

“有什么需要帮忙的嘛?”,这系统则展现出了人性化的一面。

“首先,你看我这身装扮,肯定不适合午睡”,杨成努努嘴。

“给我来一身睡觉三件套,睡衣,睡裤,还有睡帽”。

“我还需要一个超大的豪华型,欧式风格大床”。

“恒温的中央空调”。

“一个睡觉醒来可以随时看到加勒比海风景的海景房间”。

“嗯,就这些了”。

“亲爱的系统,你能办到嘛?”,杨成表示怀疑。

“能”,系统肯定地说道。

“不过我得先读取一些配置文件,这得花上点时间”。

“很好!去吧,我的皮卡丘!”。

杨成决定了以后不叫“系统”了,还是“皮卡丘”这个词儿比较带劲。

大概过了半分钟,杨成感觉自己身形一震,很快发生了空间移动。

温暖的海风吹拂在他的脸上。

这里四季如春,拥有他刚才所想要的一切。

穿着睡衣,睡帽,睡裤,他傻呆呆地看着窗外的风光。

“我亏大了”,杨成却有些沮丧。

“我应该还要求选50个加勒比的绝色佳丽来服侍我的”。

“喂,皮卡丘,能帮我搞到手嘛?”

系统那边却是毫无反应,似乎厌倦了杨成的贪得无厌。

“喂,皮卡丘?系统?”,杨成不死心。

“好吧”。

杨成两手一摊,表示放弃。

然后他两眼一闭,倒在了豪华大床上。

在游戏里面,时间会过得非常慢,尤其是当你处于休眠挂机状态的时候,有可能在游戏里睡了8个小时,而外面的世界才过去几十分钟。

第十一章 缺水危机

沟壑纵横的地面,黄泥土一眼望不到边际。

一路上几乎看不到绿色的植被。

一辆小型的军用吉普车载着几个人往西北方向疾驰而去。

杨成坐在这上下颠簸的吉普车里面,不由得擦了把汗。

前一刻钟他还在加勒比海附近的港湾享受温暖海风的吹拂,观看美女们的比基尼沙滩排球表演。

下一刻钟他就来到了干旱的黄土高坡。

这不能不说是个杯具!

吉普车在行驶了上百公里后,进入了一个小山村。

而杨成此次的身份,是协助村民们度过缺水危机的砖家。

吉普车刚开进村口,车里的人便听到高音喇叭的广播声。

“亲爱的各位居民:我是村长,告诉大家一个消息,村子最近面临缺水的问题。”

“县里的专家们已经过来指导了,帮助咋们共渡难关,希望大家保持镇定,克服困难!”

杨成等人刚下车很快被村长请到了一个小小的会场。

村长也不说客套话,毕竟困难当前,还是直奔主题的好。

“各位专家,我们村现在水窖里有一定的库存,但为了防患于未然,求助于大家。如果按照目前的消耗速度,我们还能够维持多久?”

杨成思索了片刻,这个消耗速度肯定是跟人的消耗量有关的。

不同年龄层次的人,消耗的水量肯定不同。

“请问贵村每日人均生活用水量是多少呢?”

“人均我不会算,不同的年龄段生活用水量都不同:18岁以下的大概是1升每天,18到50岁以下的是2升每天,50岁及以上的是15升”。

村长如实地回答道。

根据村长提供的信息,杨成调出编辑器面板,开始进行数据建模。

“0到18岁为未成年人,消耗量为1”。

“18到50岁为成年人,消耗量为2”。

“50以上岁数为中老年人,消耗量为15”。

“我还想知道所有村民的年龄信息”。

村长表示支持,很快拿出了一份名单,上面密密麻麻地记载了村民们的相关资料。

杨成思考了一下,根据年龄列表和上面的配置对象,就可以计算出每天的总消耗量。

而用水源的总储备量除以每天的总消耗量即可算出维持的天数。

依照这样的算法,他编写出了一个计算函数。

“您请放心,村子的水库存还能维持较长时间”。

杨成笑着拍拍村长的肩膀。

村长也露出欣慰的微笑来。

“叮!”,系统铃声如期而至。

“恭喜您完成缺水危机处理任务!”

“先前积分20分”。

“使用循环求解题目奖励2分”。

“可配置式对象编程奖励2分”。

“当前积分24分,击败了全球15%的玩家,请您再接再厉!”

“您要继续下面的挑战嘛?”

“不不不,不急”,杨成一如既往的摆了摆手。

“您您还有什么要求嘛”。

系统这声音就好像一个受了委屈的小女孩儿。

“我说皮卡丘啊,你刚才玩了我一把啊,扫了俺的兴,这笔帐怎么算?”。

杨成有些恶狠狠地对着系统说。

第十二章 丢番图方程

在杨成的软磨硬泡,威逼利诱之下,“皮卡丘系统”终于作出决定。

那就是把杨成送到有海景的地方去看海。

古希腊亚历山大港,地中海气候给这里带来了丰沛的降水。

这里尤其以盛产数学家和哲学家闻名。

其中最富盛名的数学家自然包括丢番图。

海港边一座并不起眼的小茅屋,晚上睡在这里能听到海浪轻轻拍打礁石的声音,这里居住着年迈的丢番图和他的弟子。

“老师请用”。

杨成用一个小碗装满煮沸的清水,小心翼翼地递给一位老者。

老者年过八旬,唯一的儿子先他而去,所有的寄托就在这个弟子身上了。

丢番图喝了一小口清水,看着眼前这个可爱的年轻人,眼中充满了慈爱。

“徒弟,为师今天要考考你,所学如何?”

“老师尽管吩咐”,杨成毕恭毕敬地侍立在一旁。

丢番图拿起一块松软的石膏,在墙壁上颤巍巍地,一笔一划,写出一个方程式。

“已知x*x-4y*y=n”。

“若n为已知量,则x,y作何解?”

杨成看到这方程的第一眼,就明白老师的意思了,他这是在考自己如何求出正整数解来。

毕竟这个时代,还停留在正有理数求解阶段。

“你不要急着做,先慢慢想一下,老师先出去走走”。

说完,丢番图拄着木杖,缓缓地出了门。

杨成看了看墙上的公式,开始了思索。

这是一个著名的丢番图方程,或者说是不定方程。

当杨成看到这个方程的左边x*x-4y*y,他就有种感觉。

它可以转化为(x-2y)*(x2y)。

而且这必然是第一步。

因为等式右边的常量n,它有可能是一个很大的数。

如果尝试用穷举法,效率是很低的。

但可以尝试分解这个常量,把它因式分解成两项。

比方说,n=24,分解成两项有如下的可能:

[1,24],[2,12],[3,8],[4,6]

拿这些可能的项往式子上套,便可得四个方程组:

x-2y=1

x2y=24

--------------

x-2y=2

x2y=12

--------------

x-2y=3

x2y=8

--------------

x-2y=4

x2y=6

这样就转化成了求四个二元一次方程。

最后,再选取其中的正整数解即可。

杨成调出系统编辑器,把这个求解过程写成了一个通用的函数,无论n是什么,都可以通过这个函数来求解。

似乎有一种古老而神秘的力量感知到了这个函数。

墙壁上,丢番图所写的那个方程式慢慢地被金色的线条所环绕。

“叮!”,系统声音响起来。

“恭喜您完成了丢番图方程求解任务!”

“先前积分24分”。

“因式分解求丢番图方程奖励2分”。

“当前积分26分,击败了全球16%的玩家,请您再接再厉!”

“成哥好棒喔!”。

“皮卡丘系统”谄媚地说着肉麻的话,浑然不顾自己gm的身份。

“少拍哥哥马屁了”,杨成白了系统一眼。

“真想帮哥哥做点实事的话”,杨成话锋一转,面露狡黠之色。

“给我安排个希腊妹子晚上过来耍耍啊!”

“呃~”,皮卡丘一时语塞。

“成哥,要不要继续来玩玩啊?”。

这人工智能系统犹如拉皮条般怂恿着杨成。

第十三章 弹力球问题

“成哥,要不要继续来玩玩啊?”

系统恬不知耻地聒噪道。

“玩你个球啊!”

杨成没好气地回了一句。

只听他话音刚落,整个人就立马穿越了时空。

很神奇的一种感觉。

下一秒钟,他出现在了一栋高楼中层的阳台上,身穿休闲t恤,还有一双人字拖。

此时天朗气清,端的是个好天气啊。

最适合在阳台上拿本杂志,坐着个摇椅,不急不慢地品尝咖啡啦。

杨成还站在那里yy退休后的悠闲生活,他耳边却传来了一个清脆的童声。

“爸爸,快来瞅瞅我呀!”

杨成听到这声音,顿时很困惑,他四处张望着,想找到声音的发源地。

“爸爸,快看上面啊!”

杨成循着声音把头伸出窗外,往天上那么一看。

这才发现高处某层的阳台,一个淘气的小男孩正向下对着他做鬼脸。

“这特么是哪家的熊孩子啊?怎么到处认爸爸?”。

杨成有些小纳闷。

然后,只见那熊孩子从兜里掏出个深蓝色,亮晶晶的橡胶弹力球来。

“爸爸,你说我丢出这个球你能看见几次?”

杨成第一感觉是,被人叫爸爸才叫问题,这球被抛出能被看见几次算嘛问题?

莫不是在这个剧本里被“喜当爹”了?!

想到这里,杨成的心理阴影面积顿时翻了个倍。

楼上的小男孩在杨成脑洞大开的这会儿,却是抛出了弹力球。

那弹力球轨迹并非抛物线,而是一条直线下落,经过杨成这层时,他看见了弹力球第一次。

这时,他才恍然大悟,这个剧本的题目,就是求能看到弹力球的具体次数,既包括下落,又包括反弹。

这时,砸到地面反弹而起的球再次经过了阳台。

杨成心想,这弹力球一定有一个固定的反弹系数,这个系数越大,反弹的高度就越高,否则就越矮。

他很快有了一点思路。

正常情况下,弹力球第一次下落时,我至少会看到一次。

如果反弹起来的高度大于我当前阳台的高度,那么一上一下,我所看见的就要加上2次。

据此思路可以很快写出代码来,不过杨成还有一些疑问。

如果这个熊孩子站的地方,比我这现在的阳台还矮些,那我不是一次都看不到吗?

还有如果反弹系数小于等于0或者大于等于1,算不算异常值?

带着这些疑问,杨成补全了自己的代码,使其更加具有健壮性。

“爸爸,你做出来了嘛?”,熊孩子好奇地伸了伸舌头。

“你来我这一楼层,保证不打你小屁屁”。

杨成很快提交了代码。

“叮!恭喜您完成了弹力球问题求解任务!”

“先前积分26分”。

“循环求解弹力球问题奖励2分”。

“异常值情况判断奖励1分”。

“当前积分29分,击败了全球18%的玩家,请您再接再厉!”

没等这中二的人工智能系统唧唧歪歪,杨成大喊一声。

“esc,esc,大爷要睡觉了!”

眼前灯光一暗,刚退出系统桌面,杨成甚至没有摘掉vr头盔,头一歪就打起了呼噜。

第十四章 迷路的牛仔

一大清早,睡得迷迷糊糊的杨成揉了揉眼睛。

他看了看系统时间,才早上七点钟。

要不要考虑先去吃碗面,喝点热气腾腾的豆浆什么的。

“算了”,他感觉自己还不饿。

“那就先刷个题目来作为早餐吧”。

戴着头盔再次进入代码战争,短暂地失明过后,热辣辣的太阳炙烤在了杨成脸上。

“什么鬼?!”,杨成看清了自己这身打扮。

头上戴着墨西哥式的宽沿高顶毡帽,腰间挎着一把柯尔特,肩上扛着一把温彻斯特来复,身上则缠着密密麻麻的子弹带,牛仔裤皮上衣,身上穿着束袖紧身多袋牛仔服,一双饰有刺马钉的高筒皮套靴套在脚上,脖子上还围了一块色彩鲜艳夺目的印花大方巾。

最关键的地方是身下一匹风驰电掣般的快马,让人有些hold不住啊!

“我该不是变成了兰博吧?!”。

杨成觉得不够像,最起码没有硬汉史泰龙那样彪悍的肌肉。

再看了看这四周,贫瘠的荒漠,稀疏的灌木丛。

杨成基本可以确定,自己正处在美国西部的某个地方。

而自己这角色,估计就是英勇洒脱的西部牛仔了。

“我该怎么走?”,一人一马驻留在原地,茫然不知所措。

在这人迹罕至的西部荒野,糟糕的天气,匮乏的水源,节约点体力很重要,否则很可能死于非命!

更别提还有跃跃欲试的印第安人,极具攻击性的蝮蛇,响尾蛇呢!

“有点意思”。

杨成嘴角叼着个牙签,从马背上下来。

首先,他把那把沉甸甸的温彻斯特来复随手一丢。

“噗!”

扬起尘埃一片。

这可不是装x的时候,他可不需要一把霰弹来打野猪!

然后,他摸了摸口兜,希望能找到一丝的线索。

果不其然,他很快翻出了一个小小的便笺,上面画着一些指示。

杨成定睛一看,这都是英文啊。

[“north“,“south“,“south“,“east“,“west“,“north“,“west“]

这是路线嘛?

杨成第一眼看过去,就感觉有点不合理了。

假如这是方向的指示,“north“和“south“,这一南一北,有意义吗?

还不如呆在原地,也不用做无用功啊!

杨成心里有些明白了。

这个关卡考察的就是怎样精简路线,以节约体力。

“north“和“south“可以做抵消。

“east“和“west“也可以做抵消。

那么刚才的路线指示经过抵消之后,就只剩下一个方向。

“west”,直接往西边走!

那对于程序而言,怎么编写一个减少路线的函数呢?

第一步,建立方向的映射关系,哪些是相反的方向,比如东西,南北。

接着,遍历这些指示方向,遇到相反的方向,就移除,抵消。

这个过程将一直持续到,没有任何相反的方向为止。

此时剩下的指示就是经过精简后的最佳路线。

“叮!”,在杨成敲完代码后,系统音及时地响起来。

“恭喜您完成迷路的牛仔任务!”

“先前积分29分”。

“循环求解问题奖励2分”。

“对象映射关系建立奖励1分”。

“当前积分32分,击败了全球19%的玩家,请您再接再厉!”

“肚子好饿啊,esc,成哥我先去吃点早餐”。

第十五章 螺旋矩阵

一刻钟后,杨成左手端着杯豆浆,右手拿着几根油条,嘴巴里还咬着半截油条走进了网吧。

而他那些哥们,都拿着教科书,正走在上课的路上。

对于他来讲,听那些理论课实在是浪费时间,动手实践才是王道!

至于考试,那不是考前复习几天,看看老师划的重点就能避免挂科的么?

于是,在享用完早餐后,杨成再次戴上了vr头盔,进入代码战争的世界。

“叮!温馨提示:尊敬的玩家,您本次挑战的关卡可能遇到危险,请在遇到困难后及时地后退,我们将用3d全息投影地图为您提供帮助”。

“系统生成螺旋矩阵迷宫,加载中,请稍候”

下一分钟,杨成出现在了一个宽敞的走道中。

勉强适应周围昏暗的光线,杨成抬头看了看四周,两侧都是光滑的墙壁,四周静寂无声,恐怕连一根大头钉掉落在地上也能听到清脆的一响。

同时出现在他眼前的,还有一幅3d地图。地图上明确地标识了9个区域,而绿色的箭头作为标识他自身的位置,出现在1区。

这九个区域构成了一个基础型的九宫格,或者说3x3矩阵。

“1,2,3”

“4,5,6”

“7,8,9”

摆在杨成眼前的有3条道路,可以选择前往2区,5区或者4区。

“先去4区看看”,杨成选择了最下方的道路,一路大步迈进。

空气中弥漫着阴冷的气息,杨成感觉身体升起一股寒意,一种不祥的预感突然袭来。

他左顾右盼,也没发现啥危险的东西啊,于是他继续大步前进。

“咔嚓”,一种机械齿轮转动的声音传来,吸引了杨成的注意力。

“哗啦”,两侧的石壁不知啥时候扯开了两道口子。

“唰唰!”,两个砂钵大的铁拳从口子里钻出来,一左一右地朝杨成攻过来。

“唉呀!”,杨成一声惊呼,慌乱之中匆忙后跳,这厮身体素质还是不错的。

“嘭!”,两个铁拳狠狠地撞击在一起,发出沉闷的一响。

杨成拍拍胸脯,心有余悸地喘了喘气。

“这真是拿生命在开玩笑啊”,他不敢再试,只好原路返回,退回了1区。

端坐在冰冷的地面上,他开始思索解题方法。

刚才系统好像有提到关键的几个字——“螺旋矩阵”,这是个嘛玩意儿呢?

这是一种算法或者说是矩阵中的行进策略。

杨成在迷宫中有上下左右四种行走方式,但只有依据“螺旋式”策略才有可能走到出口,它具体体现在:

先向右走,如果遇到边界,或者右边的区域已经走过,那么就向下走,否则继续向右走。

当向下走,如果遇到边界,或者下边的区域已经走过,那么就向左走,否则继续向下走。

当向左走,如果遇到边界,或者左边的区域已经走过,那么就向上走,否则继续向左走。

当向上走,如果遇到边界,或者上边的区域已经走过,那么就向右走,否则继续向上走。

依照这种策略,走过的区域依次是“1,2,3,6,9,8,7,4,5”,最后到达终点站,正中间的5区。

不过,这个问题并不局限在九宫格或者说3x3型矩阵,也有可能是4x4,5x5甚至是nxn的矩阵。这就决定了不能硬编码,必须求出通用的解法。

“终于写完咯”,杨成敲完最后一行代码,擦了把汗。

“系统快告诉我,做的咋样?”

“叮!恭喜您完成了螺旋矩阵的任务”,系统兴奋地说道。

“当前积分35分,击败了全球21%的玩家,请您再接再厉!”

“告诉俺,下一站去哪里?”

“去非洲!”,系统肯定地说道。

第十六章 金字塔问题

“大家好,这里是discovery探索频道,我们这一期的节目来到了神奇的非洲,请注意这并不是《狂野周末》栏目,本期节目我们的目标是举世闻名的埃及金字塔”。

一架小型直升机搭载着节目制作组,从开罗市区前往郊区。

“伙计,这儿的风景真不错”,杨成戴着一副黑色边框的太阳眼镜,好奇地看着正前方隐约可见的金字塔群。

他目前的身份是以研究金字塔而闻名的考古学家,负责为广大的听众讲解。

“大家好,我是考古学家g,今天我们来到埃及金字塔,既不是为了进去一探究竟,也不是解答那些未解之谜,只是想谈谈金字塔的数学问题”。

“直升机请盘旋到金字塔正上方”,杨成发出了指示。

“摄像机镜头请对准正下方”。

“好了,现在我们正从上而下俯瞰整个金字塔”。

“大家说说,你们能看到多少个石块?”

“我听驾驶员说是36个,不过我得告诉他一个不幸的消息,我们能看到的石块数目是49”,杨成拿着话筒,继续说道。

“因为金字塔的基座是正方形的,而我们正处于塔尖的正上方,所以能看到的石块数是正方形边长乘以它自身,7x7等于49”。

“直升机请盘旋到金字塔的一侧”。

“金字塔有四个侧面,每个侧面都是完全相等的三角形,它们共同构成了一个四锥体”。

“那么现在呢?你们能看到多少个石块?”

“我听驾驶员说是16个,这次恭喜他,回答正确!”

“塔尖我们能看到1个石块,第二层我们可以看到3个石块,第三层可以看到5个,最底层是7,这一组数恰好构成了公差为2的等差数列”。

“我们用首项1,加上末项7,乘以项数4,再除以2,便能得到16的结果”。

“好了,刚才我们谈到了2个关于金字塔的数字问题,下面进入观众提问环节”。

“马上进行卫星连线”。

“嘀嘀”

“你好,我来自宾夕法尼亚州,正在看节目,我想请教您,这个金字塔一共由多少石块组成?”

“很棒的问题,感谢这位热心观众”,杨成顿了顿,清了清嗓子。

“事实上,我可以很明确地回答您,是84块”。

“金字塔最底层有7x7等于49块石头,倒数第二层为5x5等于25块,倒数第三层为3x3等于9块,顶层只有1块,相加就是84块”,杨成有条不紊地回答道。

“谢谢!恭喜您通过了金字塔问题的求解”,那现场观众的声音摇身一变,成了系统音。

“当前积分37分,击败了全球22%的玩家,请您再接再厉!”

“哇!”,杨成流露出难以置信的表情,“这就通过了你们的考验?”

“难道不用写写代码,做做测试什么的吗?”

“喜欢写你就写呗,反正题目是这样要求的呀”,系统又恢复了小萝莉的声音。

“有时我真怀疑你是不是个小萌妹子在逗我玩哟”,杨成挠了挠头。

“你猜”。

第十七章 横版格斗(上)

“系统妹子儿,帮我订一张去韩国济州岛度假的机票,怎么样?”

杨成涎皮地说道。

“可以考虑一下嘛”。

杨成继续追问。

“哼!”

系统音量瞬间调高了30%,蹦出这唯一的一个字儿。

“来咯,帮哥哥一个忙咯”。

“这可是你自找的,嘻嘻”。

“甚麽?你要干甚么?”

杨成感觉有一丝不妙。

“送你去韩国啊,如你所愿!”

杨成只感觉眼前一亮,各种景观在眼前一闪而过。

下一刻,他出现在了一个高档写字楼内部。

眼前一闪一闪的显示器,一行又一行的代码,墙壁上贴着的“毒奶粉”宣传画

一切的一切都表明,他现在正在这款全球最大的单机横版格斗游戏开发部门,充当被压榨的可怜码农。

“我说小杨啊”。

这时一个身穿白色衬衫,戴着金边眼镜的中年男子走了过来。

“这是最新版本的界面原型,一定要加快进度,按时按质完成”。

产品经理语重心长地对杨成说道。

“china那边版本要求得很紧,那就只好幸苦你一下了”。

产品经理这厮果然老奸巨猾,说话都带这么多套路。

“唉”。

杨成一脸苦逼地看着产品经理递过来的原型设计图。

说好的济州岛之旅呢?

怎么变成写代码了?

常言道,自古深情留不住,总是套路得人心,还真没错!

不过苦逼归苦逼,该做的事儿还是得做。

“小杨啊,怎么样?有难点没?”

产品经理笑眯眯地看着他。

杨成深吸一口气,勉强压制住内心的杀意波动。

他开始了夜以继日的奋战

第十八章 横版格斗(下)

直到某一天,带着个熊猫眼,憔悴不堪的杨成终于听到了日思夜想的系统铃声。

“areyouok?”

“我不管”,杨成一副气呼呼的模样。

“你这次让我吃了这么大的亏,杀死了无数的脑细胞,你看怎么来补偿我”。

“要不要尝尝哥哥的崩山击?”

系统沉默了2秒钟,似乎在思索。

“成成,你不要不识好人心啊”。

杨成眉毛一挑。

“我信你个鬼!你个系统坏得很!”

第十九章 指令解释器

“好”,系统有些气鼓鼓地说道,“那你就ready吧!”

“来来来”,杨成摆了个潇洒的pose。

“耶”

下一刻,他消失了。

这是一间宽敞的大学教室。

里面稀稀疏疏地坐着一些研究生,而杨成则是坐在了第一排。

在他面前,有一位衣着考究的传统老教授,花白的胡子,看上去既有些严肃又显得德高望重。

此时此刻,老教授正对着黑板,用粉笔一笔一划,写了些晦涩难懂的东西。

这黑板上面有很多密密麻麻的符号,算术公式和计算机英文词汇。

然而他们的标题却是一个单词:

“brainf**k”

“这是什么玩意儿?”

杨成大脑中冒出了一百个问号。

这时,老教授转过身子,目光炯炯地看着大家。

“今年是1993年,我的研究成果是一项简单的,微型的计算机语言解释器。”

“我暂时把它命名为brainf**k。”

“具体的设计工作已经完成了,编码实现作为大家的研究生阶段性课题”。

老教授扫视了一下众人,看他们有什么话要说。

“缪勒教授”,这时有人举起手来问道。

“您能谈谈它的基本原理嘛?”

“可以”,缪勒清了清嗓子。

“这种语言,他是基于一个简单的模型,提供了8种基础的指令。”

“在底层,以字节为单位,以数组来存储,并提供了一个指向该数组的指针。至于输入输出,则是通过字节流的形式”。

“下面,我来谈谈指令集的具体设计”,缪勒摊开一份文件。

“大于符号,它表示指针作加1运算”。

“小于符号,它表示指针作减1运算”。

“加号,它表示指针指向的字节的值加上1”。

“减号,它表示指针指向的字节的值减去1”。

“英文句号(小数点),它表示输出指针指向单元的ascii码内容”。

“英文逗号,它表示接收一个字节的输入,存储它的值到指针指向的单元”。

“左方括号,如果指针指向的单元值为零,向后跳转到对应的右方括号后面”。

“右方括号,如果指针指向的单元值不为零,向前跳转到对应的左方括号前面”。

“大家有什么疑问吗,没有的话给你们一天时间”。

杨成此时却是面色惨白,恨不得挖个地洞钻进去。

这老教授到底说的是啥子玩意儿哟!

他之前真是闻所未闻哪!

他大脑飞快地转动,在想个脱身之策。

突然他灵机一动,举起手来。

“教授,我肚子好疼啊!”

然后只见他面孔扭曲,捂着肚子飞也似的逃出了教室。

速度之快,堪比博尔特

此举看得缪勒也皱了皱眉头。

好不容易冲到了男厕所,杨成一颗悬着的心才终于放松下来。

“叮!”,系统铃声及时地响了起来。

“很遗憾!玩家您离开指定区域,挑战失败了!”

“请您继续努力!”

“系统啊,你要不要这么坑人啊!”,杨成一脸的悲愤。

“嘿嘿,不给你点教训,让你不知天高地厚”。

系统声音听起来很是高兴。

“呃,还是饶了我吧”,杨成心有余悸地说道。

第二十章 化学分子式

“嘿嘿”,系统扑哧一笑。

“你呀,有点小聪明,但还是得踏踏实实地学”。

杨成阴着个脸,就跟霜打的茄子一般。

“好咯”,杨成把自个乌黑浓密的头发顺手一拂动。

“系统小老师,请问下一关卡是什么东东呀?”

“我给你安排了一位大师,你得虚心点啊小伙子”。

下一刻,杨成出现在了一个干干净净的化学实验室里面。

周围摆满了各种仪器设备,以及叫都叫不出名字来的瓶瓶罐罐。

“小杨,你过来一下”。

一个穿着白色工作服的中年男子喊住了他。

杨成脑海中立刻出现了中年男子的身份信息。

“苏青莲,科学院化学研究所研究员,负责化学元素方向的研究”。

“苏教授,您有什么事吗?”。

杨成不敢有丝毫怠慢。

“小杨啊”,苏青莲递给他一份文件。

“你是软件工程专业毕业的,看能不能帮我把这些简单的,复杂的化学分子式,解析一下,算出一个分子中各种原子所占的数量比例来”。

“比方说,水分子‘h2o‘,它的构成是2个氢原子,1个氧原子,那氢原子占了三分之二,氧原子占了三分之一”。

“再比如说,氢氧化镁‘mg(oh)2‘,由1个镁原子,2个氧原子,2个氢原子构成,各自的比例是多少,要算一下”。

苏教授耐心地解释着,尽显学者之风。

“没问题,苏教授,我先看看”。

杨成接过文件,从上往下仔仔细细地扫了一遍。

“fe(no3)2”

“k4[on(so3)2]2”

杨成看到这些化学分子式一个比一个复杂,顿时有些头大。

不过好在他很快通过观察发现了一些规律:

这些分子式中,有可能出现很多成双成对的括号,包括圆的,方的,卷曲的。

而括号后面如果跟随了数字,那就表明,括号里的原子数量要乘以多少倍。

例如“fe(no3)2”,它由一个铁原子,两个氮原子,六个氧原子组成。

这个题目的难点在于括号的处理上,有三种类型的括号,括号与括号之间有嵌套,有n对括号的情况。

所以首先第一步,就是统一括号,将大括号,中括号全部转化为小括号。

第二步正式开始解析,从左到右扫描分子式字符串,遇到小括号就将括号内的内容递归,统计原子数目。

第三步,用各种原子的数目除以总数,就可以求出各自所占的比例来。

有了正确的思路,写出代码不过是水到渠成的事情。

杨成只花了一个小时就搞定了编码任务。

而他更多的时间则花在了对分子式的测试上面。

几个小时后,苏青莲走过来。

“小杨,完成得怎么样了?有没有遇到难点?”

杨成转身递给他一张密密麻麻写满了各种比例的文件。

“做的不错”,苏青莲微笑着点点头。

“叮!恭喜您完成了化学分子式解析任务!”

“当前积分43分,击败了全球24%的玩家,请您再接再厉!”

“成成好棒!”,系统点了个赞。

“我先去找网吧老板,买一箱方便面,租个单间,这样就能度过一个月啦!”

第二十一章 勾股定理

“老板,来一箱红烧牛肉面,再来一个单间”。

杨成伸手就是几张百元大钞。

网吧老板接过钱顿时喜笑颜开,赶紧把他引到一个单独的房间。

这里甚至还有一个单独的小卫生间。

然后,方便面也很快就送到了。

“小伙子,还要什么尽管和我说”。

临走前,网吧老板和颜悦色地说道。

默默地摸了一把瘦了一圈的钱包,杨成再次进入了游戏。

曙光中学信息教学组办公室,教研组长正在给信息课教师们安排工作。

“小杨啊”,教研组长把个香烟屁股摁在了烟灰缸里。

“为了配合数学组的教学进度”。

“我们决定向初二的学生开一节关于勾股定理的信息课”。

“至于具体的内容你来决定,要引导好学生们的兴趣”。

“好的”。

杨成陷入思索中,开始回忆勾股定理的相关细节。

直角三角形有三条边,其中夹着直角的两条边称为直角边。

而最长的那条边,称之为斜边。

直角三角形两条直角边的平方之和,等于斜边的平方。

用一个简单的例子来说明,就是勾三股四弦五。

一直角边为三,另一直角边为四,则斜边为五。

这个勾股定理,很多人都会,但是怎么将它应用到计算机里面呢?

首先,这个直角三角形,它有两种边,直角边和斜边。

勾股定理阐述的,就是直角边和斜边之间的关系。

那么,已知两个直角边,可以求出斜边来,根据这个关系,可以建立一个函数原型:

functionhypotenuse(a,b)

这个函数,接收两个正整数参数,分别代表直角三角形两条直角边的长度,并且返回缺失的斜边长度。

换一个角度,已知一条直角边,一条斜边,就可以求出另一条直角边来。

根据这个关系,还可以建立一个函数原型:

functionleg(c,a)

这个函数,也是接收两个正整数参数,第一个参数代表斜边的长度,第二个参数代表一条直角边的长度,返回值是另一条直角边的长度。

至于具体的实现,可以在课堂上给学生们现场演示,毕竟这是很容易的算法。

想好了这些,杨成点燃了一根香烟。

他一边吞云吐雾,一边和教研组长扯淡。

“组长,你觉得教英语课的吴老师长得怎么样?”

杨成一脸的涎皮。

“没看出,你小子平时挺正经”。

教研组长狠狠地又摁了个香烟屁股。

“原来是闷骚型的”。

“你看我都二十出头了,哪能不急啊?都快急出白头发了”。

杨成耸了耸肩。

“小杨啊,年轻人就应该踏踏实实地走路”。

教研组长语重心长地说道。

“你给我再努把力,做满一千个题目,我给你介绍程序媛”。

“注意了,是美女哦!”

“啊?!”,杨成嘴巴张大得能塞进一个大苹果。

“还要做一千个题目?饶了我吧,组长大哥!”

“滚!赶快结账去,别啰嗦!”

教研组长一甩衣袖,一脸的嫌弃。

“叮!恭喜您完成了勾股定理相关任务!”

“当前积分45分,击败了全球24%的玩家,请您再接再厉!”

第二十二章 二分搜索

这一次的场景还是在校园里面,不过从曙光中学切换到了某科技大学。

“杨老师,明天是你第一次上我们班的计算机课,希望你能认真严肃点”。

辅导员看了看杨成做的教案,不由得皱了皱眉头。

只见那上面写的东西,用辅导员的话讲,就像在写yy小说。

更气人的是,那空白处还画了一只白白胖胖,惟妙惟肖的可达鸭。

那可达鸭眉头一皱,似乎发现问题并不简单

“好吧”,杨成摇摇头。

“同学们就喜欢看这样的东西,我有什么办法?”

“咳咳”,辅导员一声干咳。

显然是被杨成的无耻雷到了。

“这次的教授内容是二分搜索算法,你打算怎么展示?”。

辅导员赶紧切换了话题。

“二分搜索这东西,并不复杂,但要讲述的透彻,让学生一看就明白,还是得图形化展示”。

杨成一副胸有成竹的模样。

“我给你看个东西”。

杨成点开电脑上一个文件夹,只见里面有一个命名为二分搜索的html文件。

双击点开html文件,浏览器很快弹出了一个网页。

这页面上有一个名为“length”的文本框,旁边还有个小小的“create”按钮。

“length是数组的长度,设置好后,点击create按钮,会生成数组输入框”。

杨成在文本框里面输入15,然后点击“create”按钮。

下方很快出现了15个空白输入框,分别对应有序列表的15个元素。

“在这些空白输入框,依次填入有序列表的元素”。

“10,11,12,16,18,23,29,33,48,54,57,68,77,84,98”。

杨成填好了这些数据,然后将光标切换到一个名为“target”的文本框。

“这个文本框表示我们要查找的是哪个数字”,杨成填上了23。

这是列表中已有的元素,因此将会执行一次命中查找。

杨成点击“save”按钮,将数据保存到页面。

“接着,点击show按钮,便会出现下面的查找过程面板”。

杨成一点击按钮,下方果然出现了一个小小的面板。

面板标题是“对23的命中查找”。

一共花了4次查找来找到目标。

第一次,left指针指向10,right指针指向98,mid指针指向33。

第二次,left指针指向10,right指针指向29,mid指针指向16。

第三次,left指针指向18,right指针指向29,mid指针指向23。

第四次,三个指针全部指向23,命中目标!

“不错”,辅导员竖起大拇指。

“那如果是未命中查找,会怎样呢?”

杨成将“target”文本框内的数字改成“50”,这是列表中没有的元素。

很快,面板标题切换为“对50的未命中查找”,也花了4次查找来确认目标。

第一次,left指针指向10,right指针指向98,mid指针指向33。

第二次,left指针指向48,right指针指向98,mid指针指向68。

第三次,left指针指向48,right指针指向57,mid指针指向54。

第四次,三个指针全部指向48,未命中目标!

“小杨啊,我要对你刮目相看了”,辅导员拍拍他的肩膀。

“结账吧”,杨成淡淡地说道。

这一刻,他仿佛经历了风雨的洗礼。

“叮!恭喜您完成了二分搜索相关任务!”

“当前积分47分,击败了全球25%的玩家,请您再接再厉!”

第二十三章 建房子

“系统mm,能不能别老把我丢学校里?”

杨成有些报怨地说道。

“就不能给哥铺设一条稳稳的高富帅之路吗?”

“比方说,吃完晚饭,在100层楼高的大厦顶端打打高尔夫球?”

“顺便看看城市的夜景,享受清凉夜风的吹拂,还有比这更惬意的事儿吗?”

杨成眼中饱含幽怨。

“好吧,如你所愿!”

系统冷冷地抛下这句话,然后杨成就消失了。

下一刻,他果真出现在了100层高楼的顶端。

只不过这里并没有高尔夫球场

“杨工”。

几个头戴安全帽,工程师模样的人不由分说围住了杨成,并塞给他一份图纸。

“我们计划建造一个n层楼的房子,它的设计蓝图是这样的:”

“最下面一层楼的体积是n的3次方,倒数第二层的体积是(n-1)的3次方,以此类推”

“顶层的体积是1的3次方,也就是1”。

“现在问题来了,因为各种因素的考虑,总设计师决定把总体积限制在m。”

“那m体积有没有可能正好建好这栋房子?”

然后,众工程师看到了杨成沮丧的表情。

他们都是微微一愣。

“杨工,此事可马虎不得,得赶快做主,由你拍板哟”。

一个年纪偏大些的工程师赶紧说道。

杨成这才稍微进入些角色,回过神来。

“m体积是硬指标吗?”

“对,请注意,不能多一点,也不能少一点。”

“您看看,能建成多少层的高楼?”。

工程师们饱含期待地看着杨成。

杨成揉了揉发酸的太阳穴,思考了一小会儿。

既然给定了总体积m,那就从顶层开始,m依次减去每一层的体积。

顶层的体积为1的3次方等于1

第二层体积为2的3次方等于8

第三层体积为3的3次方等于27

这个相减的过程,将会一直持续到m小于或等于0。

如果正好等于0,那就说明正好可以建好房子,立即返回此时的层数。

而如果是负数,那就说明该体积m并不合适。

就得重新做规划啦。

“伙计们”,杨成旁顾四周。

“我帮你们建立一个函数模型,你们去推算下”。

杨成掏出别在胸口的签字笔,在图纸上写了个函数。

它会接收总体积m,而返回值是一个表示层数的整数。

如果无法正好建好这栋房子,将返回-1作为标识。

“唉呀,杨工,太感谢您了”。

众工程师簇拥着杨成,面有喜色。

“哼”,杨成却是气不打一处来,居然又被系统小妮子给耍了。

“真的想感谢哥,就给我安排一个到处是金银财宝的地方吧!”

“让哥在钞票的海洋里,自由自在地畅泳一番才好哩!”

杨成联想到自己那干瘪得不成样的小钱包,顿时两只眼睛里冒出亮闪闪的美元符号来。

“叮!恭喜您完成了建房子相关任务!”

“当前积分49分,击败了全球26%的玩家,请您再接再厉!”

“您先前提的要求,我们会在下一个关卡尽量地满足”。

“嗯?!”

杨成一听这话,顿时来了兴致。

第二十四章 冒泡排序

古希腊神话中的西西里岛,是一片被众神诅咒之地,终年被狂乱的风暴和天谴闪电环绕。然而,岛上却是一片祥和与宁静,遍地都是金光灿灿的金银财宝,足以让最淡定的冒险家失去理智。

当杨成抵达了这里后,却一点也没有在金币堆中打滚的兴致。

原因很简单,眼前有一头身高二十米的独眼巨人在守护这些宝藏。

“你想怎样”,杨成颤抖着双手,盯着独眼巨人那犹如百年大树般粗壮的大木棒。

要不是知道这是在游戏中,一般人早就崩溃了。

“小不点”,巨人一只独眼紧紧地盯着杨成。

“我基克洛普斯绝不滥杀无辜,现在摆在你眼前的有两条道路”。

“要么回答众神之王宙斯的问题”。

“要么尝尝俺的破坏死光或大木槌”。

“你选哪一个?”

“那就回答问题吧”,杨成不禁在心里面嘀咕,这有得选吗?

“很好”,独眼巨人从一个皮袋中掏出一些东西,小心翼翼地摆放在地上。

杨成定睛一看,发现是一个个半人高的水晶骰子,骰子上有一面刻有希腊文数字。

基克洛普斯将水晶骰子任意地排成一排。

“1,3,6,4,2,5”,现在骰子是这样排列的。

“小不点,问题是这样,我要你只交换相邻的骰子,控制骰子交换次数在6次以内,使得结果从1到6为增序”。

“或者说,我要得到”。

“1,2,3,4,5,6,这样的结果”

杨成思考了一下,根据题意,是要进行排序。

只能交换相邻的骰子,这就限制了算法类型,例如快速排序,选择排序这样的算法就行不通,但可以使用冒泡排序或者插入排序,最容易理解的当然还是冒泡。

好了,根据冒泡排序的原理,杨成开始第一次冒泡,这次的目的在于将最大的元素6“冒泡”到列表的最后面。

6和4,6和2,6和5作交换,这就用掉了3次。

现在的骰子是这样:

“1,3,4,2,5,6”

然后,第二趟冒泡,因为5,6已经在了正确的位置,所以只需要处理4。

将4和2作交换,得到:

“1,3,2,4,5,6”

好了,现在4,5,6都处在了正确的位置,那么,就只要将3和2交换位置,便可以得到正确的结果。

“1,2,3,4,5,6”

杨成气喘吁吁地搬完最后一个水晶骰子,累得一屁股坐在地面上。

“就这样了呼呼”,杨成上气不接下气。

“5次交换就可以了”。

“哈哈”,独眼巨人发出一阵雷鸣般的笑声。

“没想到你这小不点还有点智慧”,基克洛普斯拍了拍手。

“那我就允许你在我的岛上玩几天!”

“让我先睡一觉”,杨成却是头一歪,倒在了沙滩上。

“叮!恭喜您完成了冒泡排序的相关任务!”

“当前积分51分,击败了全球26%的玩家,请您再接再厉!”,系统依然忠实地播报着。

第二十五章 点线面

在神话中的西西里岛玩了几天,杨成带着个黑眼圈和独眼巨人基克洛普斯告别。

“我说系统妹子啊,能不能别这么折磨人?”

杨成脸上满是倦意。

“这种只能看看,摸一摸的金币银币,让我是睡也睡不好!”

“整天绷着个神经盯着这些钱,却花不了一个子儿,你能明白这种煎熬嘛?”

“所以我才叫你不要每天做白日梦了,做点踏踏实实的事情才是应该的”。

系统反驳道。

“这一次,还是回曙光中学,好好地教你的信息课吧!”

“什么?!又得回那中学?”

杨成心里面一万个不乐意,就差在地板上面打滚嚷嚷了。

曙光中学数学教学组办公室,教研组长正在向杨成请教问题。

“杨老师,现在是信息化时代了。”

“校领导指示我们,要尽快跟上步伐,把教学工作和信息化成果结合起来,向学生们传授”。

“嗯”,杨成却是在漫不经心地听着。

他的注意力更集中在手上的打火机身上,思考着要不要先去抽一根香烟。

“杨老师”,数学教研组长苦着个脸。

要不是校领导再三嘱咐,他可不想和这个比自己小了二十几岁的年轻人打交道呢。

代沟太明显了!

“嗯,请讲”,杨成终于将注意力拉扯了回来。

“我将给初中生讲授简单的平面几何”,教研组长切入主题。

“比方说,给定一些坐标组成的列表,怎么判断它们是否在同一条直线上?”

“[[1,2],[7,4],[22,9]]”

“比方说这样的列表”。

“比较简单”,杨成挠了挠头。

“你首先在脑中浮想出一个平面,平面上面有一个直角坐标系”。

“把列表中的点一个个描在直角坐标系上面”。

“然后把点与点之间,用一条条线段连接在一起。”

“若直线上任意两点为(x1,y1)、(x2,y2)则直线斜率k=(y2-y1)/(x2-x1)。”

“如果这些线段的斜率都是一样的,那么它们肯定在同一条直线上!”

“而在程序中,我只要判断线段间的斜率,不一样就返回false。”

“根据上面的思路可以很快地写出代码来”。

“这个思路和我们数学方法是一样的啊”。

教研组长挠了挠头,表示困惑。

“计算机的基础就是数学啊,或者说计算机原本只是用来研究数学的工具”,杨成如实地说道。

“小杨啊”,教研组长有些感慨。

“你说的东西都很浅显易懂,是我跟不上时代的潮流了哟”。

“您是一线教师,理论基础和授课经验都比我丰富得多,我要跟您学的地方还很多”。

杨成可不敢托大。

“叮!恭喜您完成了平面几何的相关任务!”

“当前积分53分,击败了全球27%的玩家,请您再接再厉!”

“系统妹子,我有个小小的愿望啊”。

杨成轻声呼唤道。

“直接说吧,只要不是太离谱的事情,都可以帮你办到”。

系统妹子果然好脾气,温文尔雅不足以形容。

第二十六章 自动售货机

“我的要求很简单,就是能喝上一罐82年份的雪碧”。

杨成坏坏地笑了。

“好,满足你!”

系统声音刚落,杨成就出现在了一个自动售货机前面。

漆黑的夜晚,明亮的路灯下面,自动售货机散发出微蓝色的光芒,里面一排排的货架盛放着一瓶瓶饮料。

杨成掏出几个硬币,先选中了雪碧下面的按钮,然后把硬币塞进投币口。

估摸着过了好几秒钟,从出货口并没有滚出来饮料。

相反一个便笺飘落了下来。

借着微弱的灯光,杨成拿起便笺一看,上面写着几行小字。

“为自动售货机编写业务逻辑,已知规则如下:”

“1售货机接收n种纸币或硬币,其中包括1元,5元,10元”

“2售货机最开始拥有各种类型钱币的数量都是一定的”。

“3如果投入的钱币低于商品的价值,那么将钱币原封不动地退回”。

“4如果投入的钱币等于商品的价值,那么无须找零”。

“5如果投入了售货机不支持的钱币类型,原路返回无效的钱币”。

“6如果要找零,尽可能从大额的纸币开始,比方说,要找25块钱,退回的结果是1张20块和1张5块,而不是2张10块的和1张5块”。

“7如果售货机已有的钱币无法全额找零,那么尽可能接近地找零,但售货机是不能吃亏的!”

“这是个背包问题啊”,杨成挠了挠头。

最后一条描述说明了问题的性质。

背包问题可以描述为:

给定一组物品,每种物品都有自己的价格,在限定的总价值内,我们如何选择,才能使得物品的总价格最高。

对于这一类问题,最好最高效的方法是动态规划求解,但使用递归蛮力求解,在小数据范围内也是可以的。

假如售货机内已有1元钱币3个,5元钱币5个,20元钱币1个。

我要购买3元的雪碧一瓶,并投进去了一张20元纸币,那么我得找零17元。

先看能用于找零的有什么样的钱币,20元的肯定排除,因为它大于17,售货机可不干亏本买卖!

然后,我们看3个1元钱币和5个5元钱币能不能产生找零17元的结果?

答案是肯定的,3个5元钱币和2个1元钱币就能够组成17。

这就是递归匹配的过程,不过具体实现上面,很多地方可以优化,用来提高效率。

“真的是好麻烦啊”,杨成擦了一把汗,在路灯的照耀下挥汗如雨。

早知道喝瓶雪碧解解渴这样的简单要求居然要先写个多小时的代码,还不如把自己送到海南喝点纯正的椰子汁呢!

“哟西,终于搞定了”。

杨成不愧是有毅力的程序员。

“叮!恭喜您完成了自动售货机的相关任务!”

“当前积分55分,击败了全球27%的玩家,请您再接再厉!”

“咕噜噜”

从自动售货机的出货口滚落下来一瓶冰镇的雪碧,还有一张小小的便笺。

便笺上面写着一行娟秀的字迹。

“请慢用^_^”

第二十七章 面包屑导航

“哇嗷”,杨成拿起雪碧,拧开瓶盖。

“咕噜噜”

只见那冒着气泡的汽水被杨成喝进嘴里。

他顿时感觉神清气爽,一种透心凉的畅快。

“真不错”,杨成抹了抹嘴,把空汽水瓶丢进了垃圾箱中。

“系统妹子,下一个任务是什么?”

杨成舒服地伸了伸懒腰,疲惫消失的无影无踪。

“临时任务通知:系统导航功能出现了异常,无法回溯到任务中心节点,请玩家先尝试自行修复!”

“嗯?”,杨成一听顿时来了精神。

对于程序员而言,未知的东西更能激发他们的求知欲。

“这个导航功能是基于怎样的原理呢?”

杨成迫不及待地问道。

“我们使用的是面包屑导航,它记录你的历史记录,可以帮你追溯到最初的任务中心节点”。

“你可以参考一下windows操作系统文件管理器。”

“它的地址栏就是一个面包屑导航。而它追溯的路径就像这样:”

“当前文件夹->上一级文件夹->当前盘符->计算机”。

“它可以让用户了解当前所处的位置,以及当前节点在整个系统中的位置。”

“搜噶,那我该怎么着手呢?”

杨成挠了挠头。

“任务并不复杂,编写一个通用的面包屑导航方法:”

“1接收一个url,解析出域名,作为主页”。

“2将绝对路径解析为多层目录结构依次展示”。

杨成听了系统的介绍,感觉这样的任务很独特。

它比之前的任务更符合实际工作的需要。

好,那就开始动手做吧!

第一步,先检测这个url是否以协议名开头,因为有些url它是以域名开头的,当然也是合法的。

如果检测出了协议,那就截取协议之后的内容。

一般来说,协议后面紧跟的便是域名。

所以,我们很轻易地便可以把域名提取出来,作为主页。

第二步,要解析绝对路径。

可以先将域名之后的内容按斜杠进行分割,打散成若干个目录名。

当然,这些目录名并非纯粹的我们想要的东西。

比如说后面紧跟的参数或者锚记,我们不需要,所以还得截取我们想要的内容。

第三步,给这些目录名附加引用,让它们指向目标地址。

至于最后一步,那就看系统指定在哪个地方展示啦。

“系统妹子,哥终于搞定了”。

杨成轻声呼唤道。

“成成真不错,咋们的程序员们还在焦头烂额呢,你居然这么快就搞定了”。

“那还用讲,成哥我手写代码的速度可是超快的哟!”

杨成一甩头发,摆了个pose。

“好好好,你的代码我们工作人员正在审核之中,感谢你的帮助”。

“作为小小的奖励,今晚自动售货机贩卖的所有东西,都对你免费开放”。

“哈哈!这次我要来一瓶82年份的可乐!”

杨成赶紧跑向那台自动售货机,在上面按了个不停。

“叮!恭喜您完成了面包屑导航的相关任务!”

“当前积分57分,击败了全球27%的玩家,请您再接再厉!”

第二十八章 凯撒加密

系统导航功能在杨成的修复下恢复了正常,他重新回溯到任务中心节点。

“系统正在分配任务”

“下一站,公元前58年。”

“位置,高卢。”

“开启罗马共和国凯撒剧本”

下一刻,杨成出现在了一座大帐之中,明晃晃的牛油烛照的内部无比地通亮。

“阿历克斯”,一位坐在帐中的中年男子轻声呼唤道。

只见他身穿古罗马风格的甲胄,举手投足间流露出上位者的气场。

“尊敬的总督,您有何吩咐?”

杨成很快进入了角色。

这中年男子是历史上赫赫有名的罗马执政者,尤里乌斯凯撒。

而他此时此刻的身份,是高卢总督。

“阿历克斯,我最信赖的助手”。

凯撒示意他走过来,看看桌面上的羊皮卷。

“我时常给西塞罗先生写信,为了防止有人知晓咋们之间的秘密,于是,我发明了一种加密的方法,记载在这张羊皮卷上”。

杨成定睛一看,发现这种加密手段就是把明文中的每一个字母用它在字母表上位置后面的第三个字母代替。

这可以说是一种相当简单的加密变换。

“您有何疑问?”,杨成很有耐心地问道。

“我反复思索,觉得这样做还是不够保险。”

“万一罗马共和国的敌人和那些我的政敌掌握了这些内容,他们一定会不择手段地来攻击我,毁谤我的荣誉!”

“所以,阿历克斯,希望你能帮帮我,改进下这个加密方式,让它更安全!”

凯撒眼中饱含期待。

“请您不要着急,我来琢磨一下”。

杨成从凯撒手中接过了羊皮卷,拿在手上细细地端详起来。

牛油烛忠实地散发出光芒,点亮了杨成的思绪。

传统的凯撒加密,会根据字母表将文本中的所有字母移动固定的位数k。

而如果要对凯撒加密做一个小小的改进,就必须打破这个常规。

在迭代加密的过程中,k不能是个常量,那样太容易被敌人猜出来。

因此,我们可以采用一个变量。

这个变量怎么变呢?

如果k被初始化为1,那么文本的第一个字母将在字母表中向右移动1位,第二个字母将向右移动2位,依此类推

换句话说,k是按照1来递增的。

这样做,就略微增大了解密的难度。

甚至于,我们可以把加密后的密文,分派给四个,五个,甚至更多的送信人,让他们依次送给西塞罗。

等密文合并后,再统一地进行解密。

杨成有了思路后,很快开始编写代码。

这个关卡主要难点在于2个给拉丁字母进行左右移位的方法,作为加密和解密的帮助方法。

当杨成敲完了最后一行代码,他有些疲倦地抬起头。

眼前未来的凯撒大帝已经不见了,牛油烛也统统熄灭了。

高卢,这个历史上的法兰西,来自东方的第一缕曙光照进了大帐。

“叮!恭喜您完成了凯撒加密的相关任务!”

“当前积分59分,击败了全球28%的玩家,请您再接再厉!”

第二十九章 伪装的序列

做了一个通宵的凯撒加密,系统又将他传送回了曙光中学。

杨成漫步在这空荡荡的校园里面。

他感觉自己的身体就像深秋的枯叶一般,随便一阵风就能让他摇摇欲坠。

“学生们都放寒假了?”

杨成随便走进一个教室,教室里空无一人。

那一行行的课桌椅上,还都摆放着整整齐齐的教科书。

此情此景,让杨成回忆起了高中那段艰苦奋斗的光辉岁月。

没想到已经读大学了,还能有机会重温。

“先歇息一下”。

杨成看着这一叠叠书山题海,顿时有了些主意。

他先坐在一张课椅上,在课桌的教科书中选了一本最厚实的,如同砖头般的家伙。

先垫在了课桌上,把它一摊开,均匀地分成两边,作为软枕。

而剩下要做的便是呼呼大睡咯。

这是他时常在大学课堂玩的把戏。

通常一节晦涩难懂的理论课很容易就打发了,虽说有时会让授课老师勃然大怒。

估摸着过了半个多小时,杨成被一股寒意给冷了醒来。

毕竟这游戏环境是大冬天,要是现实中,估计就得发烧,咳嗽喽。

他迷迷糊糊地张开眼睛,发现四周依旧空荡荡的,眼前那原本擦得干干净净的黑板上似乎多了些东西。

杨成定睛一看,发现是一道数学题目:

给定f(0)=1,f(1)=2。

已知等式6*f(n-1)*f(n-2)-5*f(n-2)*f(n)f(n)*f(n-1)=0,求f(n)。

n为正整数或0。

wtf?

杨成擦了擦眼睛。

上面那个等式,如果简单地变换一下,就可以得出求f(n)的公式:

f(n)=6*f(n-1)*f(n-2)/(5*f(n-2)-f(n-1))

已知了公式,那就好办了,这个公式类似于斐波那契数列的通项公式,既可以用一般性的递归,也可以用循环线性求解。

杨成很快写好了代码,然后带入值运行。

当n=0,返回1。

当n=1,返回2。

当n=2,返回4。

当n=3,返回8。

等等,这个结果有些蹊跷!杨成发现了一些不同寻常的规律。

1,2,4,8,16

这难道是偶然吗?每一项的结果居然是2的n次方!

换句话说,上面这个公式,可以直接简化成:

f(n)=(2,n)

而pow函数的作用是求x的y次方。

杨成顿时无比震惊地看着这个序列。

它做的伪装是如此的巧妙,以至于自己一开始就着了道。

“系统妹子”,杨成迫不及待地呼唤起来。

“怎么了?发现这个问题不同寻常了吧?”。

系统甜甜的声音很快就出现了。

“嗯,这是一个隐藏得很深的序列,直指问题的核心所在”。

“我真是才疏学浅”,杨成不禁感叹道。

“继续努力吧,你这样下去一定会学有所成的!”

系统肯定地说道。

“嗯,路漫漫其修远兮,吾将上下而求索哇!”

杨成看着黑板上的题目出神。

“叮!恭喜您完成了伪装的序列相关任务!”

“当前积分61分,击败了全球28%的玩家,请您再接再厉!”

第三十章 北约音标字母

“系统妹子,我想体验一把海底之旅,这个小小的愿望可以实现嘛?”

“嗯,可以的,不过你得做好准备,是深海哟”。

位于堪察加半岛东部的白令海。

此海面积辽广,平均水深达到了上千米,历来是水下无声的战场。

海平面之上,寒风刺骨。

顽强的海燕搏击着风浪,正上演一场掠食的好戏。

而水下300米的深海中,这里的海水是深蓝色的,光线是如此的暗,以至于肉眼只能看到区区几米的范围。

一头通体黝黑的庞然巨物,在这深海中畅通无阻,源源不断地朝四面八方发射声呐信号。

它是一艘隶属于北约联合作战指挥部的俄亥俄级弹道导弹核潜艇。

其目标,是跟踪,威慑苏俄的台风级核潜艇。

俄亥俄级尽管作战能力比不上台风级,但由于其优秀的降噪能力,总是能比对手先发现目标。

“阿历克斯少校”。

潜艇的指挥官是一位地地道道的美国大兵。

他那魁梧的身材,就像电影第一滴血中的兰博。

“长官,请指示”。

杨成尽管不太适应这身美国海军军官制服,但不得不说,穿上这样酷炫的军装的确是每个男子汉的梦想。

“请你汇报作战指挥部。”

“在我们正前方,发现苏俄太平洋舰队的台风级两艘,下一步计划如何进行?”

说着,指挥官递给杨成一张绘有表格的文件。

杨成接过了文件,仔仔细细一看,发现表格的内容是北约音标字母。

这种音标字母是用代码字来表示a到z共26个英文字母和0到9共10个阿拉伯数字。

比如alfa代表a,bravo代表b。

它在冷战时期被北约军队普遍使用,也被广泛应用于北美和欧洲的商业和通讯领域。

汇报内容很简短的一行:

“typhoonfound”。

翻译成中文就是——发现台风级。

“有点意思”,杨成在心里暗自嘀咕。

这个汇报内容中有12个英文字母,也就表示得用12个代码字或者单词来表示。

杨成稍微熟悉了一下音标字母表,然后花了几十分钟来编写代码。

过程很简单,替换当前的字母为相应的单词即可,并且用横杠来分隔单词。

输出的内容如下:

“tango-yankee-papa-hotel-oscar-oscar-november-foxtrot-oscar-uniform-november-delta”

很容易观察到,如果把每个单词的首字母缀连在一起,就是大写的:

“typhoonfound”。

“长官,我想我已经顺利地完成了任务”。

杨成把文件交还给了指挥官。

“叮!恭喜您完成了北约音标字母的相关任务!”

“当前积分63分,击败了全球29%的玩家,请您再接再厉!”

“先别急着切换到任务中心,让我乘坐核潜艇在水下先转一圈,过把干瘾再说”。

杨成迫不及待地表示。

第三十一章 颜色转换

坐着核潜艇在水下玩了整整一天。

杨成拖着疲惫的身体,被系统传送到了某栋写字楼。

“呃,真要人命,这么晚还得加班”。

杨成看着窗外都市的夜景,那灯火通明的街道,行色匆匆的路人们,忍不住感叹道。

不过,好在情况不算太糟糕。

有一位挨着坐的美工妹子相伴,再寂寞的晚上估计也不会寂寞了。

“成哥”,美工妹子凑过来,脸上有些哀怨。

这就把杨成这厮的注意力都吸引过去了。

“啥事呢”,杨成的脸上却还是专注的表情。

他一动不动地盯着电脑屏幕,然后不经意间转过头,和妹子来了个对视,脸上略带腼腆地一笑,整个人显得既憨厚又可爱。

但愿哥的演技不会太差,杨成在心里暗自嘀咕。

“我有个问题搞不懂啊”,妹子脸上带着一抹红晕。

“成哥帮帮我啦”。

“嗯”,杨成用手扶了扶黑边框眼镜,轻轻地应了一声。

“经理要我写一个函数,它可以把rgb数字值转换为十六进制的形式”。

“比如说rgb(255,255,255)可以转换为ffffff”。

“能帮帮我嘛?那些编程的东西,我真的什么都不会呢”。

说着,妹子纤细的小手轻轻地捏了捏杨成的衣袖。

“没问题”,杨成眼中一片淡定。

他举手投足间流露出技术高手的风范。

首先在脑海中回顾了一下颜色方面的相关知识。

rgb是一种颜色模式。

r代表red,红色,g代表green,绿色,b代表blue,蓝色。

电脑屏幕上的所有颜色,都是由这红色,绿色,蓝色三种色光按照不同的比例混合而成的。

所以,rgb函数会传进来这三种颜色各自所占的比例,这个比例可以从0到255。

如上面的例子,如果每一种颜色都是255的最高比例,那么就会得到白色。

这个问题的关键在于将十进制的颜色比例转化为十六进制的字符串。

关于进制之间的转换,很多编程语言都提供了api,所以这个问题并不复杂。

但如果要考虑得比较周全,就必须考虑数值越界问题。

如果传进来的数字比例小于0,或者大于255怎么办?

这都是异常情况啊!

杨成对于这个问题的处理方式很简单:

小于0就置为0,大于255就置为255呗。

他很快就解决了问题,并在美工妹子的电脑上留下了一段短小精悍的代码。

“成哥好棒啊!”,妹子高兴地说道。

杨成舒服地伸了个懒腰,看了看窗外。

此时夜深人静了,今天的工作也可以告一段落了。

“我请你去吃点东西,怎么样?”,杨成趁机发出邀请。

“可以啊”,妹子痛痛快快地答应了。

办公室的灯光很快统统熄灭了,整层楼融入了黑夜的静谧之中。

唯有那服务器的机箱还在一闪一闪地工作着。

“叮!恭喜您完成了颜色转换的相关任务!”

“当前积分65分,击败了全球29%的玩家,请您再接再厉!”

第三十二章 罗马数字

又是一个新的篇章

西亚的美索不达米亚平原。

在幼发拉底河和底格里斯河之间的宽广陆地上,一支来自欧洲罗马的商队正在缓缓前行。

马车拖着的这些辎重中,有很多西欧宗教的书籍,档案。

他们此行的目的地是巴格达城,去向来自世界各地的异教徒宣传上帝的福音。

杨成身穿罗马主教服饰,侧卧在摇摇晃晃的马车中。

他实在是太累了,一路上走过来都是昏昏沉沉的。

上一个关卡的夜生活,扰乱了正常的作息时间

他此行的担子非常重,罗马教皇要求他将西方的文化传播过来。

而这些任务中,首当其冲的便是罗马数字和阿拉伯数字的转换,毕竟这是做生意的基础。

“作为一名中华男儿,罗马数字真是太陌生了”。

杨成一屁股坐起来,感觉有些头疼。

罗马数字中有一些很古怪的特性。

首先,连写的数字重复不得超过三次。

比方说要表示4,就不能是iiii,而应该是iv。

然后呢,如果小的数字,它在大的数字的左边,那么它所表示的数等于大数减小数得到的数。

比如:4=4;9=9。

这两个奇怪的特性就让它比阿拉伯数字理解起来更费力。

比方说“mdclxvi“,它用阿拉伯数字表示是1666。

这是怎么得到的呢?

“m”是1000,”d”是500,”c”代表100,”l”代表50,”x”代表10,”v”代表5,”i”代表1,它们加起来就是1666。

所以转换的第一步,就是在常用的罗马数字和阿拉伯数字之间建立映射,整理一下,可以得到如下的映射表:

m:1000,

cm:900,

d:500,

cd:400,

c:100,

xc:90,

l:50,

xl:40,

x:10,

ix:9,

v:5,

iv:4,

i:1

有了这个对象映射关系,就可以在解析的过程中及时地作匹配,也很容易写出代码来。

值得注意的一点,这个转化只能在几千的范围内进行,超出范围算法就失败了。

不过,应付这种小规模的贸易,肯定是绰绰有余的。

马车内,杨成专心致志地码着代码,无心关注两河流域肆虐的风沙。

直到耳畔出现“叮”的系统音,他才抬起头,擦了擦汗水。

那西亚世界的中心巴格达城很快出现在了天际,带着浓浓的历史气息。

“叮!恭喜您完成了罗马数字转换的相关任务!”

“当前积分67分,击败了全球29%的玩家,请您再接再厉!”

第三十三章 非空子集

“系统妹子,下一站去哪儿?”

刚当完传教士回来,杨成只感觉腰酸背痛腿抽筋。

他恨不能马上去做个spa来舒缓一下筋骨。

“德国”,系统的回答让杨成眼前一亮。

他开始想象自己在德国的某个景区畅游一番的情形了。

德国哈雷大学,这所有着两百年历史的学校,保存着很多历史的名迹。

其中最富盛名的当属一代数学大师康托尔的故居。

锈迹斑斑的小院铁门被杨成推开,发出一阵刺耳的声响。

遍地的碎叶积了厚厚的一层,显示出这里的门可罗雀。

而空气中则弥漫着一股尘封的历史气息。

杨成感觉到有一种声音在呼唤着他,于是毫不迟疑地大步走进故居内部。

这居室内的东西都没有被动过,布满了厚厚的灰尘,一些手稿和书籍甚至难辨字迹。

唯一显眼的是一块小小的黑板,上面用石膏写下了一段简介:

“康托尔在这里度过了人生的后半辈子,他创建了集合论。”

“过往的游客哟,请停下你们的脚步,回答一个简单的问题。”

“给定一个大小为n的集合,它的非空子集数目是多少?”

这段简介的下方有很多乱七八糟的个人签名。

比方说“xx到此一游”。

没有一个真正的回答。

游客们毕竟只是慕名而来,面对这样的问题,也大都是一笑了之。

杨成却是驻足,耐心地思考起来,毕竟他是来解决问题的。

比如说有序列{1,2,3,4},它的非空子集包括:

{{1},{2},{3},{4},{1,2},{1,3},{1,4},{2,3},{2,4},{3,4},{1,2,3},{1,2,4},{1,3,4},{2,3,4},{1,2,3,4}}

总共有15项。

而空集并没有被统计在内。

传统的求子集方法在这个问题上可能派不上用场。

如果对性能有要求,比如集合的大小可能达到50甚至更多,那么使用递归耗费的时间就太长了。

好在我们无须求子集具体的内容,单单只需要求数目,所以可以借助一个公式。

(注意不是序列,集合没有重复的元素)

如果一个集合,它有n个元素,那么,该集合就有2的n次方个子集。

这个子集是包含空集和自身的,所以要求非空子集,就可以用2^n-1来计算。

杨成拾起一块小小的粉笔,在黑板的空白处郑重地写下了这个公式。

康托尔生前的学说集合论并不被人认可,他的价值在死后才得以体现。

每一位科学先哲,都值得致以敬意!

杨成感觉在这款游戏中学到更多的,不仅仅是知识,还有一种对待问题的态度。

哪怕是最简单的,一行代码可以搞定的问题,也应该仔细地推敲。

他静静地站立着,感受先贤的气息,直到系统音拉回他的思绪。

“叮!恭喜您完成了求非空子集的相关任务!”

“当前积分69分,击败了全球30%的玩家,请您再接再厉!”

第三十四章 醉驾测试

深夜,灯火辉煌的街头,空旷得可以来一场f1锦标赛。

“呜呜呜!”

发动机的轰鸣声从远处传来,打破了夜的宁静。

一个喝的醉醺醺的摩托车骑士正意气风发地开着他改装过的“老伙计”在街上狂飙。

几瓶二锅头下肚,跨上这神骑,风驰电掣的感觉真是难以形容!

然而十几秒钟后

摩托车骑士连人带车嵌进了一堵墙壁,落得个身死车毁的下场。

“这是本市这个月发生的第七起酒驾酿成的车祸。”

电视银幕上一位播音员报导到。

“酒驾是全世界的重大问题之一。”

“每年平均有3000人因酒驾伤残,致死。”

“六分之一的道路事故因驾驶员酒精摄入超量导致。”

“在此提醒观众朋友们,切勿”

“唰!”,电视屏幕被关闭。

一位警察目光炯炯,满含期待地看着杨成。

“您是业内的专家。”

“警方希望您能帮我们建立一套信息学的醉驾分析系统,让人们能够安全驾驶”。

“这里是相关的资料,希望能派上用场”。

警察递给杨成一份文件。

上面有很多条例:

“1成人体内平均每个小时可以分解掉一个单位的酒精”。

“2酒精的单位数由酒精度数乘以酒类的体积来计算”。

“3驾驶员饮酒时间和开车时间是已知的输入量”。

“4如果饮酒时间点大于开车时间点,比如08:00饮酒,07:00开车,可以认定是第二天7点开的车”。

“5时间都是字符串形式,24小时表示法”。

“6如果开车的时间点,驾驶员体内酒精为0单位,则认定可以驾驶,否则就是醉驾”。

警察又举了个例子。

“比方说,某位驾驶员,在深夜11点,饮用了52度的啤酒1704升,还喝了12度的啤酒0525升”。

“那么他第二天8点15分肯定是无法驾驶的。”

“因为他体内的初始酒精量是1516个单元,至少需要15个小时才能驾驶”。

这个问题很简单,杨成看完资料,已是胸有成竹。

第一步,求出驾驶员饮完酒后的体内酒精单元数。

第二步嘛,求出驾驶员饮酒时间点和开车时间点的时间差,用小时来表示。

最后一步,因为正常人体内一个小时可以分解一个单位的酒精,所以只需要判断酒精单元数和时间差的大小,即可得出结论是否为酒驾。

等杨成把这些思路转化为代码,也不过一盏茶的时间。

警察竖起了大拇指。

然后他好奇地问道:“您也喝酒吗?”

“要不咋们去喝点什么?”

杨成摆摆手,咧开嘴笑了笑。

“不了,咋们程序员只爱喝咖啡呢!”

“叮!恭喜您完成了醉驾测试的相关任务!”

“当前积分71分,击败了全球30%的玩家,请您再接再厉!”

第三十五章 脱水的番茄

一人一系统又开始了例行对话

“系统妹子,哥哥想去环游世界”。

“俺的要求不高,能有一台兰博基尼超跑,以及一位plmm陪我去兜风就可以了”。

杨成砸吧着嘴唇,口水都快流出来了。

“好好享受吧!”

系统丢下这句话,然后杨成就消失不见了。

一辆小型的东风牌货车在一望无际的乡间小路上驰骋。

此时骄阳似火,空气仿佛快凝固了一般,让人窒息。

就在这货车的货箱内,装着很多又大又圆,肥美多汁的西红柿。

还有一位穿越而来的乘客

“真是作孽啊”,杨成坐在这货箱内部,擦了一把汗。

他在这犹如沙丁鱼罐头一般的货箱内呆了整整一个小时,感觉离中暑只有一步之遥了。

就在他神情恍惚的时候,坐在驾驶座位上的农村中年大叔突然发话了。

“小伙子,看你这弱不禁风的模样,得给你点鼓励”。

大叔把个香烟屁股随手甩出窗外,拿着搭在脖子上的汗巾擦了擦脸。

“你如果能答出俺的问题来,俺就请你免费玩几天农家乐”。

“哦?!”

杨成一听顿时来了兴致,一屁股坐起来。

“你听好了”,大叔清了清嗓子。

“现在货车的货箱内装了100千克的番茄”。

“作为俺们农科所的一款实验性作物,它的水含量很高,占了99%”。

“气温这么高,番茄流失水分速度很快,过了一个小时,这时的水含量是98%”。

“你能算出此时番茄的总重量么?”

“大叔您知道的可真多!”

杨成有些惊讶。

“你们城市人别老瞧不起俺们农村的,赶紧答,别聒噪”。

大叔陷入了沉默。

这是一道小学数学题,杨成在心里嘀咕着。

番茄是由水和其他物质组成的,水分会流失,而其他物质则不会流失。

初始的总水分含量是100乘以99%,可以得到99千克。

设未知数x为流失的水分,那么:

99减去x等于现在的总水分含量。

100减去x等于现在的番茄总重量。

总水分含量除以番茄总重量等于此时的水含量98%。

也就是公式:

(99-x)/(100-x)=098

这样就能求出x等于50千克,流失了这么多水分。

那么现在番茄总重量等于100减去50,也是50千克。

“大叔,是50千克”,杨成脱口而出。

“不错啊,小伙子,基础挺扎实的嘛”。

大叔称赞道。

“你再忍一忍吧,马上就到俺住的地方了,到时大鱼大肉招待你啊”。

乡间小路上,小型货车加快了马力。

“叮!恭喜您完成了脱水的番茄相关任务!”

“当前积分73分,击败了全球31%的玩家,请您再接再厉!”

第三十六章 过敏测试

在农村大叔那里玩了几天农家乐,杨成一度被各种美食、干货折服。

而大饱口福的结果是某一天突然上吐下泻,被一辆救护车送到了最近的县医院。

“我到底吃坏了啥子哟”。

躺在白色的担架上,仰望窗外,杨成不禁暗暗嘀咕。

几个工作人员抬着担架,把杨成送进了观察室。

很快,一位穿着白大褂的主治医师给杨成里里外外,上上下下摸了个遍,听诊器到处查探。

然后他用肯定的语气说道。

“患者表现出食物过敏的症状,但据他说吃了很多东西,无法确定过敏源”。

“先给他作过敏测试,再确定治疗方案吧”。

“小伙子,你走运了”。

主治医师看着杨成,目光闪烁不定。

“正好咋们院引进了德国的最新过敏诊断设备,很快就能给你出方案”。

然后,杨成就如同一只实验的小白鼠般,被带到了一台设备前。

“先开始一号过敏源鸡蛋的测试”,工作人员开启了设备。

“接着进行二号过敏源花生的测试”。

“三号过敏源贝壳类准备”。

“四号过敏源通过!”

“五号”

不得不说,这外国的设备真是nb,专业性没话说。

杨成一共经过了八项测试。

最后机器沉默了几分钟,似乎在分析结果。

“哗啦”,一页纸从机器口吐出来。

工作人员赶紧捡过来一看。

“呃这检查报告居然是英文的!”

工作人员们顿时面面相觑。

“那个小伙子,你英文咋样?能读懂吗?”

杨成顿时一阵无语。

这县医院也太落后了吧,连检查报告都要患者来看?!

他拿过报告一阵端详,只见上面有一个很大很醒目的得分:

34

根据上面那些简短的说明,这个分数表示自己对哪些东西过敏。

所有的过敏测试被记录成了一个列表:

eggs(1)

peanuts(2)

shellfish(4)

strawberries(

tomatoes(16)

chocolate(32)

pollen(64)

cats(12

下面还有一行小小的提醒:

“usebitwiseanding”

(使用按位与运算)

杨成思考了一会儿。

程序员的思维让他很容易就找到了突破点。

关键在于按位与运算。

得将这个得分34,和列表每一项后面的数字做按位与。

比如说egg(1):1转换为二进制是”000001”,34转换为二进制是”100010”,按位与后结果是0,表明了鸡蛋不是过敏源。

而peanuts(2)和34做按位与结果是2,就说明花生是过敏源。

总而言之,只要按位与后的结果非0,那就说明,这一项测试是过敏的。

“花生和巧克力是过敏源,不谢”,杨成很快得出了答案。

工作人员们都露出会心的微笑来,系统音也如期而至。

“叮!恭喜您完成了过敏测试的相关任务!”

“当前积分75分,击败了全球31%的玩家,请您再接再厉!”

第三十七章 乌龟赛跑

“系统妹子,你害的哥在那县医院受了好几天的罪”。

杨成一脸的委屈。

“俺这次不敢提要求了,让俺找个空旷的地方沐浴下阳光,这应该不过分吧?”

很快,柔和的阳光播洒在杨成身上,温暖得就像小手在抚摸着他。

杨成舒服地眯上了双眼。

“小伙子,你也在晒太阳嘛”。

一个饱经沧桑的声音吸引了他的注意。

一位老者伫立在他眼前,正上下打量着他,眼神中流露出一份睿智与神采。

“老爷爷,您是在散步吗?”

杨成见他神态怡然自得的模样。

“我啊,陪我的宠物走走呢”,老者手指了指一个方向。

杨成顺着他的目光看过去。

出乎他意料的,所谓的宠物既不是猫猫狗狗,也不是鸟类,而是两只脸盆大的乌龟!

“这”

杨成嘴巴张大得能塞进一个苹果。

“您还有养龟的爱好啊”,他不禁感叹道。

“哈哈”,老者笑着,拿出一根根青翠欲滴的蔬菜,喂给乌龟食用。

只见那乌龟不急不慢地伸长了脖子吃食起来。

“小伙子”,老者抚了抚胡须。

“我考考你一个问题”。

“我假如给小黄和小绿(两只龟)安排一次赛跑。”

“小黄先跑,它以720英尺每小时的速度前行着。”

“小黄比小绿肯定跑得慢,所以小绿还在不慌不忙地吃着蔬菜。”

“当小绿开始跑动的时候,它发现小黄已经领先了70英尺(g)了,但小绿的速度是850英尺每小时,所以它肯定能赶上。”

“现在问题是,小绿赶上小黄,得多长的时间?”

老者眼含笑意,看着这位后生。

又是简单的小学数学!

杨成心里一嘀咕,这东西一旦长期不用,就很容易遗忘啊。

这道题目的关键在于,得弄清速度与时间的关系。

在小绿追赶小黄的过程中,小黄可是一直没闲着,没停下脚步的!

所以如果要让小绿赶上小黄,至少得满足这个等式:

v1xtimeg=v2xtime

这样求时间就很简单了。

没过多久,杨成就精确地说出了所需时间。

“老爷爷,一共需要32分18秒”。

“真是后生可畏”,老者竖起大拇指。

“叮!恭喜您完成了乌龟赛跑的相关任务!”

“当前积分77分,击败了全球31%的玩家,请您再接再厉!”

第三十八章 减肥俱乐部

接到新的任务后,杨成被传送到了某个减肥健身俱乐部。

在这里,他结识了一个外号为“程一吨”的程胖子,负责担任他的减肥顾问。

最近程胖子总是一副忧心忡忡的模样。

因为每月这几天都会发布一个所有成员的体重名单,而他无一例外是最胖的

“成哥,帮帮我啊”,程胖子朝着杨成挤眉弄眼。

作为拟定名单的一份子,杨成面露难色。

“我说胖子,你平时不好好减肥,还老是吃炸鸡喝可乐,这下子知道急了吧”。

“成哥,你是个好人”,程胖子扭动他肥胖的身躯。

他蹒跚着走过来,胖乎乎的手掌塞过来一叠大钞。

杨成掂量着手上厚实的大钞,脸色略微有些变化。

“别担心,我的朋友,我来帮你改下列表的顺序”。

杨成把钞票赶紧塞进口袋,然后拍了拍程胖子那犹如小山般厚实的肩膀。

杨成前思后想,觉得还是按这样的顺序来排列为好:

每个体重数字,按各个数位数字之和,从小到大排列。

比如说,99kg,它的各个数位数字之和是18,也就是说“权重”为18。

而程胖子是150kg,他的权重是6,所以排在99kg之前。

之前的排列方法,所有的俱乐部会员,会按照体重顺序由小到大排列。

那程胖子肯定在最显眼的地方,不用说该有多难堪了。

现在,这么一按权重排序,程胖子就混杂在众人之间,自然是没那么显眼了。

想到这里,杨成也不禁为自己的聪明才智点了个赞。

没过多久,到了发布名单的那一天。

一群人围着名单,叽叽喳喳地说个不停。

“程胖子,让哥几个看看你是不是最胖的?”

有人鼓噪道。

“哈哈,直接看最后一排不就行了”。

有人打出了暴击。

“咦?”,有人诧异道。

“程一吨居然没在最后排?难道他逆袭成功了?!”

俱乐部的一个角落里,程胖子满脸堆笑地搂着杨成。

杨成只感觉一堵肉山快压得自己喘不过气来。

“成哥这次真是帮了小弟的大忙哟!”,程胖子满脸红光。

“区区小事,何足挂齿!”

杨成努力地吸了一口气,想挣脱出程胖子的控制。

“来,小弟去请你吃炸鸡汉堡!”

程一吨不由分说,拖着杨成走出俱乐部大门。

“叮!恭喜您完成了减肥俱乐部的相关任务!”

“当前积分79分,击败了全球32%的玩家,请您再接再厉!”

第三十九章 美元符号

“系统妹子”,杨成轻声呼唤道。

“怎么了?想进行任务调度吗?”

系统声音应声而至。

“不不不”,杨成双手叉腰。

“我知道这款游戏是很多编程爱好者一起开发的。”

“你们并不是以盈利为目的,很多人都是志愿者”。

“怎么了?”,系统有些惊讶。

“我觉得你们做得很好,想给你们捐点钱”。

杨成感觉从这款游戏中学到了很多东西,他很感激那些为了制作游戏默默付出的人们。

尽管自身还只是一名大学生,没有什么钱,他还是想做些力所能及的事情。

“这样啊”,系统声音缓和起来。

“你先输入想捐赠的数目吧”。

很快,在杨成眼前成像出一个大大的输入框,灰色的光标在框中一闪一闪。

输入框旁边还有一行小小的提示:请输入该项的数目,以美元来结算。

杨成观察了这个输入框片刻,他提出了一个疑问。

“我说系统啊,这个框框,到底是得输入美元符号,还是不输入呢?”

“呃,应该是不用输入吧”,系统有些支支吾吾。

“那如果有些人输入了美元符号,是算作正常的输入,还是异常呢?”

杨成感觉这个地方有些不合理。

“如果有提示,可能会更加用户友好”。

杨成善意地提出这个建议。

“嗯,你说得对”,系统表示赞同。

“当然,有个更好的方案”,杨成语气一顿。

“那就是,不管用户有没有输入美元符号,我们都做验证,过滤掉美元符号”。

“我认为,这个输入框,还应该对空格字符做处理,无论这个空格是在头部,尾部还是字符串中间,通通都做过滤处理”。

杨成继续说道。

“如果有非法字符存在,比如说大小写字母,那么,直接返回00”。

“当然,这个过滤算法对正数和负数一样地适用”。

“谢谢你的建议”,系统表示感谢。

“那么以你之见,该如何具体实现呢?”

“可以使用正则表达式”。

“对美元符号和空白字符进行全局替换,替换成空字符串就行了。”

“很容易的,一行代码就可以实现”。

杨成肯定地说道。

“我会把你的建议和方案提交给开发人员”。

“好,现在我要输入数字了”,杨成眼含笑意。

“你的好意,我们心领了”。

系统婉转地一笑。

“你为我们贡献的代码,付出的努力就是最好的馈赠!”

“叮!恭喜您完成了美元符号的相关任务!”

“当前积分81分,击败了全球32%的玩家,请您再接再厉!”

第四十章 毕方奇解释器

“这次的任务可能有些难度,随机应变吧”。

系统好心地提示道。

“哦?”,杨成心中充满了好奇。

金色的光芒包裹着杨成,下一秒,他出现在了一个新闻发布会的现场。

无数令人眩目的长枪短炮摄像头对准了讲台,哗啦啦地拍个不停。

讲台上站着杨成。

不过他并不是主角,而是另一位拉风的中年男子。

“女士们,先生们,大家晚上好,我是克里斯-普利舍教授”。

中年男子举止优雅得体,还有一份技术人员的沉稳与淡定。

“1993,在这个科技界风起云涌的年头,我和我的团队带来了一款新型的私密语言”。

“我暂时将它命名为befunge-93,你们可以称呼它为毕方奇语言”。

普利舍教授眼中闪过一丝光芒。

“设计这款语言的初衷,说起来你们也许会笑。”

“我觉得得给大家一些挑战,让人们觉得设计语言编译器不是一件简单的活儿,或者说”

普利舍话锋一转。

“这种语言将成为有史以来最难设计编译器的语言!”

普利舍眼中充满了自信。

现场顿时陷入一片寂静,估计连大头针掉落在地上的声音也能听得清清楚楚。

有些业内人士甚至惊讶地从座位上站起来。

“那么普利舍教授,我是科技周报的记者,您能谈谈这款语言的特性吗?”

一位年轻的记者率先开始发问。

“没问题”,普利舍清了清嗓子。

“befunge-93的代码是二维的。”

“它用四个符号来控制一个指针在代码中移动,指针每经过一个字符或数字就把它压入一个栈。”

“而四则运算符号,加减乘除的功能就是弹出栈顶两个元素进行计算后把结果压回去。”

“用_和|符号来表示有条件的方向选择:当栈顶元素为0时向右(上)走,否则向左(下)走。”

“&和~符号分别用于读入数字或字符并压入栈,句号和逗号分别表示将栈顶元素作为整数或字符输出。”

“最后一个@at符号表示程序结束。”

“befunge-93代码的注释不需要任何符号标明,你可以把注释写在程序的任何地方,只要运行时指针不会经过它就行了。”

“很精炼的说明,谢谢教授”,记者满意地坐下了。

“是这样的”,普利舍环顾四周。

“我现在得去大洋彼岸做个学术交流”。

“剩下的提问,将由我最信赖的助手g一一解答”。

“yang”,普利舍左顾右盼,却找不到杨成的半个影子。

“god!”,普利舍失望地捂住了自己的半侧脸。

第四十一章 面试之数组

“系统妹子,你这太打击人啦!又是什么毕方奇解释器,幸好俺逃的快!”

杨成弯着个身子,上气不接下气。

“你也不用太在意了,我早提醒过你了,有难度的任务呢”。

系统安慰他。

“告诉你一个好消息!”

“因为你之前表现优异,我们决定选你为任务的考官。”

“你也可以面试新来的愣头青们了,嘻嘻!”

“啊?有这等好事!”

杨成猛地站起来,眼中充满了惊喜。

“赶快去面试别人吧!考官也是有丰厚的积分奖励喔!”

“go!”

杨成立马来了精神。

自己的努力得到了认可,还能指点新人,这感觉真不错!

一家国内著名软件公司的面试。

洁白的墙壁上,挂着白白胖胖,憨态可掬的logo。

一位年轻的面试者正坐在座位上,他的神色有些紧张与激动。

在一家小公司摸打滚爬了几年,他感觉自己的技术有了长足的进步。

公司无法再给他提供上升的空间了。

于是他下定决心,通过在代码战争参加面试,进入大公司,成为高级白领,乃至于金领。

没错,就是这样!

代码战争除了可以完成编程任务,还给各大公司提供筛选人才的平台。

“你的简历我看过了,你会使用java?”

坐在对面椅子上的杨成面无表情地发问道。

“是的”。

参加面试的人,胸有成竹地回答道。

哼哼,能够简历通过hr认可,谁没有几把刷子呢?

“那好,请你叙述一下,在java中,声明和创建数组的过程中,内存各是如何分配的?”

“”

年轻的面试者脸一下子涨得通红,憋了半天憋不出一个字儿。

杨成有些失望地眨了眨眼,然后接着问。

“那请你谈谈,java数组的初始化有几种形式呢?”

“”

面试者低下了头。

在他过去的工作中,基本都是和业务打交道,这些问题,从来没有思考过。

“你知道基本类型数组和引用类型数组之间,在初始化的时候内存分配有什么区别吗?”

“”

晶莹的东西在面试者眼眶中打转转,杨成看得有些不忍了。

过了一会儿,房间的门“嘎吱”一声被推开。

倒霉的面试者,狼狈地走了出来。

只见他眼睛通红通红的,仿佛经历了一场人性的拷问。

“原来数组也有这么多知识啊!”

面试者喃喃自语道。

房间里,杨成舒服地翘起个二郎腿。

当面试官的感觉实在是太棒了!

“你这面试官还真有两把刷子嘛”。

系统声音突然响起来。

“刚才企业给你的评价很高喔”。

“哈!”,杨成坐着个椅子摇晃起来。

“叮!恭喜您完成了面试的相关任务!”

“当前积分89分,击败了全球34%的玩家,请您再接再厉!”

第四十二章 面试之集合框架

“接下来你要面试的这位有多年的工作经验,应该比较靠谱吧”。

系统声音渐渐淡去。

杨成眼前很快出现了一位戴着眼镜,举手投足间流露出技术高手风范的面试者。

“你java基础知识这块应该没什么问题吧?”

杨成有些轻描淡写地问道。

“嗯,我有多年的java编程经验,基础这块是相当熟悉了”。

面试者气场很足,显然是有备而来。

早听说大公司反而注重基础知识,嘿嘿,那还不是手到擒来?

杨成显然并不知道面试者是怎么腹诽的。

他略加思考,开始了发问。

“java集合框架中有些什么接口?”

他问问题喜欢循序渐进,先易后难。

“list,set,map”

面试者侃侃而谈,如数家珍。

“嗯”,杨成略为满意地点点头。

“那请你介绍下set接口和map接口之间的关系?”

“啊?set接口和map接口的关系?这”

面试者一下子手足无措了。

给了他两分钟时间考虑,还是没得到想要的回答,杨成开始了下一个问题。

“那请你说说hashset和hashmap之间的关系吧”

杨成很有耐心。

“”

面试者擦了一把汗。

他的确用过很多集合框架的实现类,但对于底层的细节却是一窍不通。

“知道treeset和treemap之间的联系吗?”

杨成有些不耐烦了。

“”

面试者犹如瑟瑟发抖的萌新一般,不敢说话了。

“您的情况我们基本了解了,请耐心等待我们的通知”。

杨成说的很委婉,但言下之意却是:

你不是我们需要的人。

垂头丧气的面试者推门而出,只剩杨成一人呆在房间里。

“成成知道的真多!”

系统毫不吝惜赞美的话。

“系统妹子啊”。

杨成抬起头,四处张望。

“你看我也面试了2场了,没有功劳也有苦劳哇”。

杨成眼珠子转了转。

“让哥去订购一辆豪车,去街上耍耍,你看如何?”

系统沉默了半分钟。

“好!那就如你所愿!先结账吧!”

“叮!恭喜您完成了面试的相关任务!”

“当前积分97分,击败了全球36%的玩家,请您再接再厉!”

第四十三章 芳香剂蒸发器

“好吧!如你所愿!”

系统的声音出现在杨成的脑海中。

下一刻,时空变换,杨成的眼前很快出现了一辆顶尖的豪车。

“风姿绰约的女神以登上此车首为愉悦之泉,沿途微风轻送,摇曳生姿”。

“优雅的女神,轻轻地飘落在汽车车首,纵情地享受着大自然的新鲜空气”

“她扇动翅膀时发出般的声音,她神秘而美丽,堪称汽车界最迷人的尤物。”

曾经有无数的诗人,艺术家称赞过此车的卓尔不凡。

然而当它真正出现在杨成视野中时,他才明白。

这特么才是男人的追求啊!

杨成一动不动地盯着这部车,形同雕塑,就如同看到了自己久违的恋人。

时间在这一刻变得非常非常慢,像凝固了一般。

“小杨,还愣着干嘛?赶快干活!”

一个粗鲁的声音打断了杨成的思绪。

他回过神来,四处一张望,这才发现自己原来在豪车的装配车间里面。

“你小子,又走神了,赶快过来解决问题!”

一个工程师模样的人走过来,脸上很是不满意。

杨成茫然地上前几步。

那工程师不由分说递过来一份设计图纸。

“赶快解决问题,不然扣你薪水!”

工程师下达了不容置疑的命令。

杨成这才清醒过来,拿起图纸一看。

这是一种装有芳香剂的车载蒸发器,现在要测试它的使用寿命。

已知蒸发器的容量(毫升),里面盛装的芳香剂每天都会挥发一定的百分比。

这个蒸发器最少需要一定百分比的芳香剂,否则就无法再使用了。

也就是说蒸发器有最低的极限容量。

现在问题是,多少天后,蒸发器会失效?

或者说蒸发器的使用寿命是多少天?

简单数学问题!

杨成却完全不在状态

“小伙子,别做白日梦了,还是老老实实地写你的代码吧!”

工程师诧异地打量着杨成。

“系统,给我出来!”

“赔我豪车!”

第四十四章 买车子

“你也不用太在意啦,跟你说个好消息吧”。

系统故作神秘地说道。

“因为你之前表现优异,我们决定奖励你一部二手车,价值2000点券喔”。

“呃~”,杨成不禁无语了。

说好的豪车,一下子成了二手车,这落差也太大了吧。

“豪车在我们代码战争是身份的象征喔,不是土豪怎么开得起啊?”

系统反问道。

“好好好,有车总比没有强”。

杨成安慰自己。

“我向你推荐一台价值8000点券的进口车,你可以在存够钱后买下它。”

“保证比你这台二手车开出去拉风多了,怎么样?”

系统声音中充满了诱惑,就像一位老练的推销员。

“可以啊”

杨成最羡慕的就是那些在游戏里开着豪车,大杀四方,装x的大佬们了。

他忍不住吞咽了一口唾液。

“我估摸着每个月能存1000点券”。

这已经是他省吃俭用所能拿出的数目了,再多就要破产了!

“二手车你可以折换成点券”。

“你现在的二手车和那台进口车,每个月都会降价,最开始是降1%,然后每隔两个月,降价幅度都会增加05%”,系统提醒杨成。

“比如,第一个月会降价1%,第二个月就降了15%,第三个月就还是降了15%,第四个月是2%”

“你帮我算算,你至少得存多少个月的钱才能买下这部进口车?”

“那时你买车后还可以剩下多少点券?”

杨成眯着眼睛,开始在大脑中构建模型。

这个问题,说白了。

已知进口车价格,二手车价格,每月存款定额,第一个月车的降幅。

求第几个月可以买下进口车,以及剩下的点券数量。

很简单的加减乘除嘛!

遇到这种小case,杨成就是二话不说,直接上代码。

能够动手的事情别bb!

“系统妹子你听好咯,这种情况,得花上6个月时间。”

“最后结余还剩766158”

“四舍五入得766点券,不谢”。

杨成充分展示了啥叫效率。

“很好!”

系统毫不吝惜鼓励。

“那这部进口车就归你所有了!好好开着它去兜风吧!”

“呀!”,杨成眼中充满了惊讶。

“叮!恭喜您完成了买车子的相关任务!”

“当前积分101分,击败了全球36%的玩家,请您再接再厉!”

第四十五章 统计找零组合

“微风拂面,开着私家车在宽广的城市环线上驰骋,渴了来一瓶冰镇可乐,这种感觉真的很难用言语形容”。

一辆进口车上走下来一位车主,他戴着一副酷酷的墨镜,正走向路边的一家便利店。

便利店很普普通通,门口就挂了块“24小时营业”的牌子,杨成推门而入。

“老板,来瓶可乐”。

杨成站在柜台前,打量着四周。

店长是一位中年大叔,他很热情地拿了瓶冰镇可乐,塞给杨成,然后笑眯眯地看着他。

杨成接过可乐,拧开瓶盖,然后瓶口对准嘴巴,咕噜噜地喝了起来。

大约过了几十秒,喝完最后一滴可乐,杨成抹抹嘴。

“嗝~”

他舒服地打了个嗝,还有些意犹未尽。

“老板,多少钱?”

杨成摸了摸口袋。

“六块”,中年大叔报出价格。

杨成递过去一张10块的,大叔接过钱,却没有急着找零。

“小伙子,考考你”。

大叔脸上流露出笑意。

“我现在有1块和2块的两种硬币,如果要找零,有几种方式”。

杨成略加思考,便给出了答案。

“找零4块有三种方式”。

“第一种,找四个1块的硬币”。

“第二种,找两个1块和一个2块的硬币”。

“第三种,找两个2块的硬币”。

大叔接着问道。

“那小伙子,假如要找零10块,而我现在有2块,3块和5块的硬币,有多少种方式呢?”

“这”,杨成一时语塞。

“稍等一下”。

杨成感觉大脑不够用了,于是调出代码编辑器面板。

这是一个经典的找零组合问题,这种问题可以用简单的递归来求解。

现有硬币种类2,3,5,找零10块。

将这个问题,可以分解为2个子问题:

1包含2块硬币有多少种解法。

2不包含2块硬币有多少种解法。

对于每个子问题,又有子问题:

1包含当前最小面值硬币有多少种解法。

2不包含当前最小面值硬币有多少种解法。

这两个子问题的解法种类之和就是最后的答案。

编译,运行,得到结果,杨成给出了答案。

“是4种!”

“很好!”

“结账!”,中年大叔递过来4块钱。

“叮!恭喜您完成了统计找零组合的相关任务!”

“当前积分103分,击败了全球37%的玩家,请您再接再厉!”

第四十六章 找到炸弹

从便利店出来,杨成上了自己的私家车,继续沿着环线驰骋。

正前方警笛长鸣,不知道发生了什么状况。

再试着往前面开,却被路障堵住了去路。

一位负责警戒的警员走过来,询问杨成道。

“请问您是上面派来处理的专家吗?”

杨成瞬间明白,这是问他接不接任务。

作为代码战争的一项特色,你有概率在这个虚拟的世界任何时间点触发任务。

杨成很想说:别挡道,俺要去兜风!

但程序员的好奇心却驱使他说道。

“是的,带我去看看”。

在警员的带领下,杨成来到了一个临时的指挥所。

这里的负责人面色凝重,拿出一份简单的草图,指给杨成。

“这是global仓库,里面存放了大量的化工原料,一旦发生爆炸,后果难以预料”。

“现在仓库被一小撮极端分子占领了,他们安装了定时炸弹”。

“现在我们的swat正在朝仓库渗透,歼灭敌人”。

“这个仓库太大了,有很多区域,希望您帮我们分析,炸弹最有可能藏在哪个区域”。

杨成接过草图,仔细地一端详。

仓库的区域包括:

top区域,location区域,document区域,external区域,history区域

慢着!

这些区域名字有着不凡的意义!

在浏览器的对象模型中,这些区域名字不都是全局对象的属性麽?

也就是说,这个global仓库映射的是浏览器全局对象!

(browserobjectmode)

杨成心里一嘀咕,瞬间秒懂,这个任务考察的就是自己对浏览器对象模型是否熟悉。

那么,这些区域里面,一定有区域,它的名称不是全局对象的属性。

杨成仔细一搜索,果然发现了一个可疑的区域。

“1493343032531”,这是什么鬼?

全局对象中有这样的属性吗?

肯定没有!

那么这肯定就是“自定义属性”!

“请您派swat赶紧搜索所有区域名称为数字的区域,一定能找到炸弹!”

杨成无比肯定地对负责人说道。

负责人脸上流露出微笑。

“这个事情我们肯定会解决,不过当前最重要的是结账”。

“叮!恭喜您完成了找出炸弹的相关任务!”

“当前积分105分,击败了全球37%的玩家,请您再接再厉!”

第四十七章 分配奖金

英勇的swat小组拆除了global仓库的定时炸弹。

然而杨成来不及功成身退,就被警局负责人拉过去谈话。

“小杨啊”,负责人轻声一叹,语气里很是无奈。

“还是得麻烦你一下,局里几个人为了这件事都快打出翔了”

“嘛事啊?”,杨成很是好奇。

“是这样的,这次拆除炸弹行动得到了上级的嘉奖,特别拨了100k的特别奖金,奖励参与行动的swat小组五个人”。

负责人轻轻地捶了捶头,显得很是头痛。

“对于这笔奖金的分配问题,局里的高层很有意见,认为我的方案有失稳妥”。

“你先听一听”。

负责人拿出一份文件,念道。

“此次行动,嘉奖名单如下:”

“负责拆除定时炸弹的队员,立头功,分得45k”。

“在战斗中负责攻坚负伤的队员,分得45k”。

“其余负责掩护的队员,依次分得2k,3k和5k”。

杨成一听这报告,顿时感觉不妥。

他有种吐槽的冲动。

为毛同样是负责掩护队友,还得分个2,3,5k的区别?

拿2k奖金的人会怎么想?

累死累活拼命还得垫底!

但杨成知道,这样的话不能直说。

毕竟警局的水深水浅谁知道呢?

“是这样的”,杨成清了清嗓子。

“从立头功的,攻坚的队员们那里抽出一部分奖金,不用太多,分给负责掩护的队员们”。

“让助攻的兄弟们都能拿到5k,这样也让大伙安心”。

“有道理”,负责人一听眼睛都亮了。

这样的分法的确更加人性化。

既重重奖励了付出最多的人,也让其他人得到奖励而不会生出怨言。

“那我改下分配的列表”,负责人拿出笔在文件上划了划。

“那么就是这样了”,负责人将文件递给杨成看。

[5,5,5,42,43]

“嗯,没问题”,杨成点点头。

这种分法本质上是“抽肥补瘦”,或者说是“劫富济贫”。

“那就幸苦你了”,负责人由衷地感谢道。

“哪里,哪里”。

杨成摆摆手,心里却嘀咕着这把能加多少分。

“叮!恭喜您完成了分配奖金的相关任务!”

“当前积分107分,击败了全球38%的玩家,请您再接再厉!”

第四十八章 找出奶牛

“系统妹子,我不想在城市里转悠了。”

“带我去草原,能喝上鲜奶,吃上大块牛羊肉的地方,我要体验生活!”

系统传送ing

杨成很快出现在了德克萨斯州某处的农场。

这里有一位“德州牛仔”科勒文。

他有着小麦色皮肤,以及闪亮的八块腹肌。

“伙计”,科勒文叫住杨成。

“我想告诉你一个关于农场的秘密”。

这厮显得神秘兮兮。

“哦?”,嘴里含着根麦秸的杨成顿时来了兴致。

“你有没有观察到,麦田里的奶牛们总是面朝同一个方向?”

杨成的热情瞬间熄灭,就如同浇了一盆冷水。

这家伙不会是吃了饭没事干吧?

还是说,他本身是个动物学家?

“你听我说”。

科勒文掏出一个圆圆的仪表,指给杨成看。

仪表上有很多密密麻麻的光点和字母,就像这样。

“”

“”

“”

“”

“这个仪表能实时地显示奶牛的位置。”

“你应该注意到了,cow标识了它们的存在”。

科勒文耐心地解释道。

“如果你仔细地观察,就会发现一个有趣的现象”。

“第三排的第二头奶牛,它的方向和其它奶牛是相反的,它的标识是woc”。

“嗯”,杨成表示赞同。

“我这个牧场面积很大,有很多块这样的长方形区域”。

科勒文接着说道。

“每块区域至少有3只以上的奶牛”。

“你能够找出这唯一的一只朝向不同的奶牛吗?”

杨成尽管对奶牛并不感兴趣,但他却被这个问题吸引了。

因缺斯汀!

假定奶牛有上下左右四个朝向。

以字符“c”为中心,向四个方向进行搜索。

如果连续三个字符能够构成“cow”,那就说明了是某个朝向的奶牛。

比如说,左右朝向的奶牛,字符串是这样表示的:

“cow”,“woc”

而上下朝向的奶牛,字符串是这样表示:

“cw”

“oo”

“wc”

把这些奶牛的坐标和朝向进行汇总,就能够得出,哪一头奶牛是与众不同的。

“有意思的问题”,杨成吐出麦秸。

“不过牛仔,你想成为那头wrong-way的奶牛嘛”。

“叮!恭喜您完成了找出奶牛的相关任务!”

“当前积分109分,击败了全球38%的玩家,请您再接再厉!”

第四十九章 鱼

“动物学家”科勒文又带着杨成来到他的私人池塘。

只见那池塘水面波光粼粼,碧绿的水草在水底微微荡漾,悠闲的游鱼在水中穿梭,真真是一副赏心悦目的画面。

科勒文介绍道。

“鱼是任何生态系统的一个重要组成部分。”

“一种普遍的看法是,鱼类实际上可以减少池塘的维护开销。”

“因为他们的食物,像藻类,池塘可以自给自足。”

“不过那是对于食草鱼类而言,对于食肉鱼类就不是这样了”。

“我最近在研究食肉鱼类的生长曲线。”

“杨,你想不想听听?”。

科勒文看着杨成。

“愿闻其详”。

杨成显得饶有兴趣。

科勒文于是兴致勃勃地开讲了。

十分钟后

“噗通!”

杨成一头钻进了池塘,一时间溅起几米高的浪花。

第五十章 哈希加密

不会游泳的杨成,被临时地传送回了任务调度中心。

“打死我也不要听这样的解说!”

杨成嚷嚷道。

“息怒啊,成成”

“我们正在进行用户密码安全评估,希望你能帮我们测试下”。

系统妹子端的好脾气。

“哦?”

杨成一听顿时来了兴致。

“我们游戏对用户密码做了加密,采用的是国际通用的sha-256哈希加密。”

“对于一般长度的密码,安全肯定是有保证的,不过呢”。

系统妹子话锋一转。

“对于8位以下的短密码,无法确定安全性,所以想听听你的意见”。

对于喜欢接触各类编程知识的杨成来说,他自然是有所了解。

“哈希类加密,主要是为了防止逆向破解。”

“但攻击者可以先通过社会工程学,分析出用户密码的大致组合,然后根据这个组合,做暴力破解”。

“对于8位以下的短密码,哈希加密是很脆弱的”。

说着,杨成调出了编辑器面板。

“假如我们得到了一段哈希加密后的密文”。

“5694d08a2e53ffcae0c3103e5ad6f6076abd960eb1f8a56577040bc1028f702b”

“这段密文以我们现在的手段,很难逆向破解”。

“但是如果攻击者分析出了一段预测的值,比如说”。

“cdeo”。

“他可以根据这段值,穷举出所有的排列。”

“对每一个排列,做哈希加密,只要这个加密结果和密文匹配,只要能匹配得上,那就说明这个组合是用户密码”。

“而这个过程是很高效的”。

“全排列算法的时间复杂度是n的阶乘”。

“这里n等于4,也就是字符串的长度”。

“最多只需要4!=24次匹配”。

“这对于机器几乎是瞬间可以完成的事情”。

说着,杨成开始编写代码,然后一运行。

cdeo

cdoe

cedo

ceod

code

实际上只用了5次匹配,就得出了用户的密码:

“code”。

“由此可见,哈希函数对于短密码是多么的苍白无力”。

杨成收起编辑器。

“嗯,成成很不错,继续努力吧,你的付出一定会有回报的”。

系统妹子给予鼓舞。

“叮!恭喜您完成了哈希加密的相关任务!”

“当前积分113分,击败了全球38%的玩家,请您再接再厉!”

第五十一章 贪吃的河马

在“动物学家”科勒文的盛情邀请下,杨成来到了非洲的热带草原。

据说是要考察一种动物的生活习性。

在那水草丰盛之地,两人潜伏在草丛中,观察来来往往的动物。

杨成只感觉大地一阵轻微的震颤。

一头造型憨厚的生物在他们面前大摇大摆,不慌不慢地走过来。

它有着一对可爱的小耳朵,圆滚滚,q弹的屁股,瞪得圆圆的小眼睛,显得十分温和。

这显然是一只非洲河马,一种体型庞大却看似人畜无害的动物。

“伙计,快看!”

科勒文指着河马的身影,脸上满是欣喜之色。

“老科,这家伙长这么大,它到底吃得啥子哟?”

杨成难以置信地看过去。

“它可不吃肉,只吃些水草”。

科勒文说着掏出它的老伙计,一个圆圆的仪表盘。

“你拿出这玩意儿干嘛?”,杨成有些疑惑。

科勒文指着仪表上的一个个数字,耐心地解释道。

“我这仪表功能可广着呢,它可以显示出,哪些区域有适合河马食用的水草,你看”。

杨成定睛一看,发现很多数字0和1组成的区域。

[1,1,0,0,0],

[1,1,0,0,0],

[0,0,0,0,0],

[0,0,0,1,1],

[0,0,0,1,1]

“这是个直观的二维地图,其中1代表有水草的区域,0代表没有水草的区域”。

“可以看到,地图的左上角和右下角各有一大块水草区,称为大区”。

“水草区域可以水平或垂直方向连成大区,但无法对角线连成大区”。

“比如如下就是两块大区”。

[1,0],

[0,1]

“任意给定一个地图,你能找出其中的大区数目吗?”

杨成拿到这个问题,细细地一思考。

这应该和之前的奶牛问题有异曲同工之妙。

先地毯式遍历地图,一旦遇到了水草区域(标记为1的),就从水平,垂直或者说上下左右四个方向搜索相邻的水草区域,这个过程将持续到再也找不到水草区域,是个递归的策略。

每块水草区域一旦被访问过了,就置为0。

一旦当前遍历过程再也找不到水草区域,就算作一个大区,继续地毯式搜索,查找下一块水草区域。

依据上面的算法,左上角第一块大区被找到后,地图是这样:

[0,0,0,0,0],

[0,0,0,0,0],

[0,0,0,0,0],

[0,0,0,1,1],

[0,0,0,1,1]

接着右下角第二块大区被访问完后,地图全屏都为0:

[0,0,0,0,0],

[0,0,0,0,0],

[0,0,0,0,0],

[0,0,0,0,0],

[0,0,0,0,0]

自然而然,大区数目为2块。

“伙计,代码这么快就出来了”。

科勒文饶有兴趣地盯着编辑器面板。

“不过我得好心提醒你,河马每年都会杀死几个有意无意闯入它们地盘的人类”。

“所以咋们还是做好撤退的打算吧~”

第五十二章 阿拉丁与神灯(上)

“撤”

科勒文话音未落。

只见那刚才还在闲庭信步的大河马,转过身子,瞪大了眼睛瞅了瞅草丛中的两个人。

然后,它蹬了蹬粗壮有力的后腿,扬起一小片灰尘。

“这是要干嘛?”

杨成完全是一脸的萌逼。

“这是河马要发起进攻的信号”

科勒文面色惨白,双腿忍不住发起抖来。

“呃,快跑!”

科勒文拽着杨成一路小跑。

“嗷嗷嗷!”

河马愤怒地一声吼叫,领地被入侵了,它很生气。

河马那一吨重的身子猛然向前,加快了速度,嘴巴长得如同一口井那么大,势必要咬住入侵者。

别看两种生物体型相差巨大,河马的速度甚至更快。

杨成作为程序员,这时缺乏锻炼的劣势就体现出来了。

他没跑几步就开始气喘吁吁,上气不接下气了。

科勒文却如同长腿健将般,把后面的一人一兽甩开了距离。

“呃”,杨成渐渐脱力,被河马赶上。

“完蛋了!”,杨成只感觉屁股遭受重击,整个人犹如坐火箭一般,窜上了天空。

“被爆了!”,他悲哀地想到这点,然后重重地摔在了地上,眼前一暗,失去了意识。

“”

“我不能就这么死了,还没有结账啊!”

脑海中一个声音在不断地回响。

“年轻人,醒一醒”。

外面世界的一个声音也在不断地呼唤他。

“嗯?”,杨成迷迷糊糊地睁开眼睛。

映入眼帘的是一个漆黑的山洞,还有一个带着笑脸憨态可掬的胖子。

“你是?”,杨成挣扎着坐起来。

他这才发现这胖子穿着一身异域风情的服饰,不像是本地人。

“你好”,胖子很有礼貌地打了个招呼。

“我是灯神,居住在阿拉丁的神灯里面”。

胖子扬了扬手上一盏又黑又旧的煤油灯。

“你救了我?”,杨成很惊讶。

“嗯,刚才我的神念感觉到你的困境,就把你传送过来了”。

“有何指教?”,杨成站起身子,拍拍身上的尘土。

“是这样的”,灯神摸了摸自己的大肚子。

“通常情况,如果有人擦了擦神灯的表面,我就会出来实现他三个愿望”。

“我的生命是无穷无尽的,几千年来我遇到了一个又一个的有缘人,实现了他们一个又一个的愿望”。

“我早已厌倦了这样的生活,决心去国外度假”。

“所以”,灯神恳求地看着杨成。

“亲爱的程序员,帮我写个处理程序,应付人们的请求和愿望吧!”

第五十三章 阿拉丁与神灯(下)

“啊?”

杨成有些目瞪口呆了。

“有啥惊讶的”。

胖子灯神不以为然。

“以前都是我亲自出场,给人们完成愿望”。

“现在特么都信息化时代了,人工智能那么发达,谁还用手工操作啊!”

胖子灯神有些鄙视。

“呃,貌似有点道理”,杨成摸了摸脑袋。

“那你先谈谈需求吧!”

“好”,胖子灯神满意地点点头。

“千百年来,很多人对我许下了心愿,大都是以下几种:”

gold-coins(金币)

silver-coins(银币)

water(水)

foods(食物)

books(书籍)

weapons(武器)

clothes(衣服)

medicines(药物)

tool(工具)

girl(美女)

“每个有缘人都可以许下三个愿望”,灯神顿了顿。

“如果这愿望是清单里有的,就直接从我的库里面调取”。

“如果清单无法实现这个愿望,那就先在这个清单里添加这个愿望。”

“我的神力一旦感应到清单多了东西,就会自动添加相应的库存,再反馈给许愿者”。

听完灯神的介绍,杨成顿时感觉很easy。

不就是维护一个清单列表,读取三个愿望字符串嘛!

“不过”,胖子话锋一转。

“如果有哪个人说:我的愿望是再给我三次许愿机会吧!”

“你懂的~”,胖子半眯着眼。

“对于这种鸟人,那就得给他一点小小的惩罚”。

“一个愿望也不能实现”。

“那就是返回空值咯!”

杨成很快就会意了。

“嗯,靠你了兄弟”,胖子拍了拍他的肩膀。

“没问题,包在俺身上!”

杨成调出编辑器面板,三下五除二就搞定了。

“做得好!”,灯神表示由衷的感谢。

“这下我可以去国外好好度个假了”。

“兄弟,你有啥愿望,哥哥可以帮你实现”。

“要求很简单,多给俺一点积分吧!”

杨成眨了眨眼睛。

“no_problem!”

“叮!恭喜您完成了贪吃的河马相关任务!”

“叮!恭喜您完成了阿拉丁与神灯的相关任务!”

“叮!恭喜您获得双倍积分!”

“当前积分122分,击败了全球40%的玩家,请您再接再厉!”

第五十四章 谜之函数

“成成,在一个远古城市的废墟中,一群考古学家发现了一个神秘的函数”。

系统声音出现在杨成的脑海中。

“他们试着给这个函数传进去一些参数,得到了意想不到的结果”。

“哦?”,杨成一听顿时来了兴致。

“快说来听听”。

他话音刚落,眼前便出现了一幅3d的全息投影面板。

面板上是一张历史气息浓厚的羊皮卷,上面刻画着一些古老而玄奥的符号,字母和阿拉伯数字:

#返回2

getnum(300)

#返回4

getnum(90783)

#返回0

getnum(123321)

#返回8

getnum(89282350306)

#返回5

getnum(3479283469)

“考古学家们都被卡在了这个问题上面,他们废寝忘食却无计可施”

系统的声音里充满了惋惜。

“现在只能求助于你——聪明的程序员。”

“快理解这个函数中蕴含的秘密,并且将它还原出来吧!”

系统鼓舞杨成。

“okay”。

杨成打了个响指,自信满满地接下了这个任务。

然后,他开始了对这个函数结果的观察。

这个函数乍看之下并没有什么特别之处。

接收一个数字作为参数,返回一个数字作为结果。

如果说有值得注意的地方,那就是函数名是叫getnum。

从这个名称来看,估计功能是获取某个东西的数量。

而函数结果也验证了这种猜测,都是些个位数。

但是光凭这些信息是无法推测出函数内容的

杨成想了一会儿,感觉有些头疼,他轻轻地捶了捶头,没有半点思路。

“系统妹子,有提示吗?”

他只能选择求助。

“给你一点提示吧”。

系统声音刚落,羊皮卷上就浮现出一行黑色的字迹。

杨成凑过去,定睛一看:

hint:holes

他念出了这段英文。

hint是提示或线索的意思,holes是小孔或洞的意思,而且是复数形式。

这是什么鬼?

莫非传进去的参数和返回结果与holes有关联?

程序员的直觉让他先想到了这一步,他再返回去看羊皮卷正文。

第一个例子,300为参数为什么会返回2?

一种通俗的想法是:300有2个0。

慢着!

0的写法像什么?

洞或小孔!

一丝闪光出现在杨成的脑海,他顿时脑洞大开。

既然0有1个洞,那么8有几个洞?

2个!

6和9有几个洞?

各有一个洞!

这就不难理解,为何90783会返回4。

112=4

很简单的加法!

杨成感觉茅塞顿开,一种舒畅的感觉席卷了他全身。

“系统妹子”。

他喜滋滋地呼唤道。

“我想我已经知晓其中的奥秘了”。

“成成真不错!”

“叮!恭喜您完成了谜之函数的相关任务!”

“当前积分124分,击败了全球40%的玩家,请您再接再厉!”

第五十五章 马路动物杀手(上)

“我说科兄,上次被河马追,你咋能跑得这么快?”

杨成和“动物学家”科勒文并排走在国家森林公园的主干道上。

他们悠闲地边漫步边闲谈。

“你小子明显缺乏运动”。

科勒文摞出这句话。

然后,两人看见一头棕熊在不远处摇摇晃晃地朝他们走过来。

“科兄”,杨成吞咽了口唾液。

“咋们又有麻烦了”

“嗯”

科勒文拽住杨成,打算情形不对就逃。

然而,通常情况下,一个成人是绝对逃不过一头棕熊追杀的。

除非你有奥运会冠军那样的速度。

那棕熊倒也不急不慢,从道路一侧走到马路中间,还左顾右盼,样子甚是惬意。

“呜呜呜”,一辆大型货车疾驰而过。

棕熊看着货车,避也不避,反而睁大眼睛,直立起身子,好奇地观望。

面对这头挡路的棕熊,那货车司机丝毫没有减速的意思。

因为他现在全部的注意力都放在了手机视频上面,可怜的棕熊被完全忽视了。

“嘭!”,一声巨响,棕熊被撞飞了。

别看这家伙也有好几百斤,跟十几吨重且高速行驶下的大货车相撞,跟纸糊的也没什么差别。

“吱”

货车向前滑行了十几米才停了下来。

司机走下车,手里还拿着个手机。

看着倒在血泊中,不省人事的棕熊,货车司机一脸的震惊。

“god”

就在货车司机无助的时候,杨成和科勒文走上前。

科勒文从口兜里掏出个相机,对着棕熊拍了拍。

“你们是警察?”

货车司机有些惊讶。

“你们是想收集我的罪证吗?”

“不不不”,科勒文摆了摆手。

“我们是动物学家兼动物保护协会成员”。

“只是想记录下这次事故”。

第五十六章 马路动物杀手(下)

“每天都有很多动物在道路上遭遇车祸”。

科勒文从口袋里掏出一叠照片。

“这里是我的一些现场记录”。

他拿给杨成看。

“你看,这里有一个像是鬣狗的事故现场”,科勒文解说道。

[hyena]

“有着长长的黑白相间斑点的可能是只企鹅”,科勒文指着另外一张照片。

[penguin]

“刚才那只碰上大货车的倒霉的棕熊”。

[bear]

看着这些动物的惨状,杨成陷入了沉默。

不得不承认,科勒文这家伙确实很有公德心

杨成一时间有所触动。

“科兄,以后我希望多听听你关于动物的讲解”。

科勒文爽朗地一笑。

“以后有机会,咋们可以去冒冒险”。

第五十七章 敏感字审查

“成成”,系统突然呼唤杨成。

“咋了”。

“有点事情想请你帮帮忙”。

系统开门见山地说道。

“我们游戏风靡全球,在过去的几个月,收到了大量的粉丝来信。”

“编辑大大每天都要处理,回复很多邮件,真的很辛苦”。

“不幸的是,有些读者使用了一些言辞激烈的词汇,编辑们很头疼”。

“为了让邮件内容更加友好,希望你能帮我们写个敏感字审查的算法”。

“没问题”,杨成很直爽地说道。

系统接着说道。

“要求是这样的:”

“对文本中的所有敏感字,替换成长度相等的星号”。

“比如说我有如下的文本:”

thecatdoesnotlikethefire

“我有如下的敏感字名单:”

[cat,fire]

“那就替换掉这两个单词为星号”。

“明白了吧?”

“嗯”,杨成点了点头。

只要有了敏感字列表,剩下的工作可以使用正则表达式来完成,不是很费力的工作。

如果不使用正则,代码会长些。

每次都要将文本和敏感字列表做匹配,如果能匹配得上,就返回对应长度的星号,组装成新的字符串。

杨成捋起袖子就开始编码,很快就完成了任务。

“谢谢成成”。

“那你就继续和科勒文的冒险吧!”

第五十八章 果汁

杨成开着私家车,载着他的朋友,“德州牛仔”科勒文,在街上兜风。

“伙计,要不要喝点什么?”

杨成建议道。

“走,我给你介绍一家非常棒的果汁店”。

科勒文带着杨成下了车。

一家并不起眼的果汁店,走进去能闻到淡淡的果味馨香。

那小小的柜台上面一尘不染,整整齐齐地摆放着很多玻璃杯盏。

“两位帅哥想要点什么?”

悦耳的声音传来,杨成看到了一位美女。

她并不是美的特别出众,但有着一种独特的灵气,眼中闪烁着智慧与优雅的光芒,举止从容,落落大方。

“美女,我想喝苹果汁”。

牛仔抢先一步。

“我要来杯香蕉汁吧”。

杨成接着说道,掏出了钱包。

妹子笑了笑,没有说话,她从柜台上拿出一个干干净净的玻璃杯。

“如果你们能回答我的问题,我就请你们免费喝果汁”。

“小生,愿闻其详”。

只见那科勒文把个皮毡帽骚包地转了180度,摆了个pose。

“现在,我给杯中加入200毫升的苹果汁”。

妹子的纤纤素手熟练地操作起来。

“再加入200毫升的香蕉汁,搅拌均匀”。

“请问,现在苹果汁的浓度是多少呢?”

“很easy啊,200除以400,等于50%”。

科勒文不假思索地答出来。

“好”,妹子又拿出个空玻璃杯。

“我现在从混合果汁中倒出200毫升到空玻璃杯”。

“这时的苹果汁浓度又是多少呢?”

“还是50%!”

科勒文这厮尽管是个动物学家,常识还是有的。

“nice”,妹子淡淡地称赞了一句。

“那我再添加200毫升的苹果汁,此时的苹果汁浓度呢?”

“呃~”

科勒文顿时卡壳了,他感觉脑子不够使了。

“75%”,站在一旁的杨成突然发话了。

“开始苹果汁和香蕉汁各有100毫升”。

“苹果汁再加200毫升,就是300毫升”。

“此时总容积是400毫升”。

“那么300除以400得到75%”。

妹子没有说什么,轻轻地把那杯果汁推到杨成身前。

杨成拿起果汁,细品了一口,任那混合了苹果和香蕉的味道,在唇齿间留香。

然后,他看到了科勒文那幽怨,不甘的眼神。

“叮!恭喜您完成了相关任务!”

“当前积分130分,击败了全球41%的玩家,请您再接再厉!”

第五十九章 生化危机(上)

“系统妹子,帮我和这位科勒文兄弟准备一场惊险刺激之旅吧!”

“科兄说咬文嚼字不适合他这种粗人,打打杀杀才符合他的胃口”。

“准备!”

系统提示音响起。

“ten”

“nine”

“eight”

浣熊镇的夜晚十分宁静。

夜空群星暗淡,月亮被重重乌云所笼罩。

空气中弥漫着刺鼻的消毒液气味,空空荡荡的大街上,没有一个行人。

昏暗的路灯下,夜风卷起一张破破旧旧的报纸,一个低喘的声音若有若无地从远处传来。

一个中年男子低垂着头,黑夜中看不清相貌。

他机械式地蹒跚着前进,一滴滴浑浊的液体从身上掉落下来。

那是?

鲜血!!!

就在这时,漆黑的天幕中一颗流星划过

紧接着又是一颗流星

然后两朵降落伞从天空徐徐降落。

杨成和科勒文一前一后跌落在地。

“唔”

杨成挣扎着爬起来。

“科兄”,他解除降落伞装置。

“咋们是在什么鬼地方?”

“杨兄”,科勒文面色严肃。

“咋们又有大麻烦了”。

“哦?”,杨成定睛一看。

只见远处有一个不断放大的黑点正朝他们冲过来。

那非人类的速度,狰狞的面孔,骇人的低吼,赫然是一头丧尸!

杨成一惊,顿时两股战战,全身颤抖,不能言语。

那科勒文却是不慌不忙,捋起袖子,露出粗壮有力的胳膊,上面还纹了一个黑色骷髅头印记。

只见那丧尸快如疾风,三步并作两步,就到了科勒文身前,张口作势欲咬。

“吓!”,科勒文大喝一声。

他双掌也是如闪电般迅猛,一左一右贴住丧尸的脑袋,不待它反应,胳膊上青筋暴露,拼尽全力一扭。

只听见“咔嚓”一声,丧尸脑袋顿时错位,瘫成一团,再无动静。

“厉厉害”。

杨成半晌才反应过来。

“海军陆战队退役少尉”。

科勒文擦了擦鼻子,抖了抖身上的灰尘。

“科兄,接下来怎么办?”

杨成有些后怕地看了看四周。

“嘀嘀嘀”

这时死掉的丧尸身上传来一阵手机铃音。

科勒文在死尸口兜里摸出一个手机,他按下接通键。

“喂”

电话那头传来一个粗犷的男声。

“阿历克斯少校,科勒文少尉,听到请回答”。

“我是科勒文,长官在我旁边,有何指示?”

“我是指挥官,浣熊镇已经沦陷了,这里是活死人的天下”。

“30分钟后,我们将发射导弹,你们必须尽快撤离!”

“指挥官,我们并不熟悉路况”。

科勒文看了看手表。

“嗯”,指挥官迟疑了片刻。

“我会将地图以二维坐标形式发给你们,请注意绕开丧尸的聚集区!”。

“祝你们好运!”

第六十章 生化危机(下)

浣熊镇上万米的高空中,两架战机组成的编队眨眼间掠过。

留给杨成等人的时间不多了。

“成哥,指挥官发过来了地图”。

动物学家兼陆战队员科勒文少尉将手机递给杨成,自己则呆在一旁负责警戒。

他们周边的地面上,躺着好几具尸体。

都是些被吸引过来的丧尸,然后被科勒文用他最擅长的擒拿格斗术给ko了。

杨成拿起手机,仔仔细细一看,发现是一个3x5的坐标系。

[true,false,true]

[true,false,true]

[true,false,true]

[true,true,true]

[true,false,true]

他们目前所处的位置,是地图的左上方,坐标(1,1),或者说是第一行第一列。

而撤离的目的地,处于地图的右上方,坐标(1,3),或者说是第一行第三列。

true(真)代表该地区是安全的。

false(假)代表丧尸的聚集区,一旦进入,肯定有去无回。

现在的关键是得找出一条安全的撤离路线来。

杨成紧缩眉头,用心思考,丝毫没有被周边的环境所影响。

程序员的素质在这一刻得到了体现。

这是一个简单的图论问题,即查找图中两点之间的路径。

因为这个图本身并不大,所以效率问题暂时不用考虑。

最快捷,最方便的做法,是从这个出发点开始,执行深度优先遍历。

在遍历的过程中记录分支(路径)。

而一旦达到了目的地,就应该停止遍历,返回当前的路径。

图的深度优先遍历得到的路径,不一定是最短路径。

但在这个问题上,可以看出,只存在一条可能的路径,也就是得到的这条。

其实也可以使用广度优先遍历。

两者唯一的不同是:

前者使用栈来管理遍历,而后者会使用队列。

杨成专心致志,很快编写代码,得出了一条安全的路径。

[down,down,down,right,right,up,up,up]

“科兄,解出来了,咋们赶紧撤”。

杨成回过神来,环顾四周。

然后,他看见方圆几公里的丧尸都在朝这边聚集。

“呃”

杨成举起双手。

“咋们真的要困死在这里了吗?!”

“为啥都解出来了,还没半点反应呢?”

杨成心情糟透了。

一想到即将被丧尸们分而食之,他就有种想饮弹自尽的冲动。

“成哥,看那是啥?”

科勒文手指着半空中。

只见一头通体漆黑的钢铁巨兽带着降落伞缓缓坠地,发出沉闷的一声巨响。

这是一辆重达几十吨的重型坦克。

在这种初级的丧尸面前,就跟绞肉机差不多。

杨成还在那里一愣。

那科勒文却是一个翻身上了坦克,打开顶盖,然后冲着杨成喊道:

“没时间解释了,快上车!”

第六十一章 科勒文的手机

话说,科勒文驾驶个重型坦克,载着杨成在浣熊镇宽阔的街道上横冲直闯。

坦克巨大的轰鸣声自然是吸引来了大批的丧尸,但它们只有两种结局:

要么被撞飞,要么被碾压成了肉饼。

对付这种没变异的低级丧尸,科勒文有两招:

一是加大马力猛冲,二是开炮。

“嘭!!!”

一声巨响过后,百米外的一团丧尸被炸得七零八落。

“炮手”科勒文的操作无比娴熟,专业的素质足以让人称赞。

然而,杨成看到前面那残肢断骸,却是一阵反胃。

自打娘胎里出来,他还没见识过这样的屠杀。

“伙计,这里有我应付,你玩玩我的手机,解解乏”。

科勒文一只手继续操作,另一只手则从口兜里摸出一个手机,递给杨成。

这是一个市面上并不多见的旧款平板按键手机。

在触屏手机才是主流的今天,绝对可以算是古董级了。

关键是,科勒文这家伙还找人写了一段算法来生成锁屏密码,也可以算得上是奇葩了。

“有意思啊”。

杨成端详着这界面,刚才的恶心感很快就消失了。

“让我来猜猜你这算法是怎样实现的?”

杨成尝试着输入一段英文:

“nokia”

算法经过计算后,得出一段数字密码:

66542

杨成看了半天看不懂,于是又尝试了几次输入英文:

“valut”

得到82588

“toilet”

得到864538

乍看之下,可以观察到一些规律:

英文输入的位数和数字密码输出的位数是对应的,比如说都是5位或6位。

然后呢,输入的英文字母和输出的数字对应都是固定的,比如说字母“o”在“nokia”中和在“toilet”中都对应数字“6”。

这就说明了一个问题:

一定有个固定的对照表,作为算法的加密依据。

那怎么获取这个对照表呢?

杨成开始注意力都放在了手机屏幕上,等他将视线稍稍地往下移,就发现了一个现成的“对照表”。

按键面板不就是一个“对照表”麽?

他仔仔细细地一看,每一个数字按键都至少对应了三个及以上的字母。

abc:2

def:3

ghi:4

jkl:5

mno:6

pqrs:7

tuv:8

yz:9

这就不难理解“nokia”为何会对应66542,在忽略大小写的情况下,字母“n”和“o”对应6,“k”对应5,“i”对应4,“a”对应2。

“科兄,我想我已经猜出你的加密规则了”。

杨成兴奋地说道。

“真不错,伙计”。

科勒文竖起个大拇指。

“不过我恐怕你得抓紧扶手了”。

杨成抬起头一看,只见正前方一道关卡,被混凝土给浇死了。

显然,游戏快over了。

高空中,导弹发射激起的气浪划出美丽的死亡弧线,然后在浣熊镇街上接连绽放。

第六十二章 病毒感染

杨成和科勒文从浣熊镇逃离出来。

然后他们找到了最近的医院。

诊疗室里,一位身穿白大褂的主治医师正坐在桌前,仔细端详着x光检测结果。

“这位科勒文先生并无大碍”。

医生发话了。

“左臂肌肉拉伤,右臂脱臼,大概是用力过猛的缘故”。

“但杨先生,你的问题就比较严重了”。

医生抬了抬眼镜,盯着杨成,看得杨成一阵发毛。

“你体质较弱,全身多处有病毒感染,如果不及时诊治,有生命危险”。

“呃”

杨成可不想变成丧尸。

“你先自己看看检测结果”,医生丢过来一份文件。

“现在你体内有4种不同感染程度的部位”。

“现在的关键是用药问题”。

医生顿了顿,继续说道。

“凡是感染的部位都必须用药”。

他脸上一副“你懂的”表情。

“好的”,杨成眨巴着眼睛。

然后,医生就给他开了一大堆不知道做啥用的处方药

第六十三章 动物园的灾难

等杨成和科勒文检查完身体,从医院出来,走在大街上。

“伙计,接下来干嘛?”

科勒文无聊地挠了挠头。

然后,他们就看见东边某个地方冒起了滚滚浓烟,像是着火了。

“嘿,咋们去看看”,科勒文好奇心顿起,拖着杨成就往那边跑。

等到两人赶到出事地点时,才发现是一家动物园。

这里大门紧闭,门外站着不少工作人员,对着里面指指点点。

园内,只听见一声骇人的狮吼。

一只羚羊围着花坛跟一头非洲雄狮玩起了捉迷藏。

没过多久,又听见熊的嚎叫声。

一头成年棕熊摇摇晃晃地追逐着一只绵羊。

“我的天哪,这是在拍《动物世界》吗?”

杨成难以置信地看着这一切。

“没有,年轻人”,一位工作人员走过来解释道。

“动物园的供电系统出了问题,笼子的电门都自动打开了”。

“动物们都跑了出来,它们开始自相残杀了!”

“呃~”

杨成摊了摊手,表示这样的事情真是闻所未闻。

“那,咋们得采取些措施吧?难道就这么眼睁睁看着它们玩饥饿游戏?”

“没办法”,工作人员耸了耸肩。

“在防爆特警们带着足够的麻醉弹来之前”。

“咋们还是先静观其变吧!”

空气中,无形的瘟疫又开始了扩散

而人们对此一无所知

“叮!恭喜您完成了生化危机的相关任务!”

第六十四章 网页改版(上)

从动物园回到任务中心。

“成成”,系统声音呼唤着杨成。

“有私活你想不想干?”

“哦?”,杨成一听顿时来了兴致。

对于学生党来说,能靠自己的努力赚取报酬,自然是最好不过的一件事情了。

“是这样的,我们代码战争官网正在准备改版,面临人手不够的问题。”

“如果你愿意帮助我们,做一点小小的改动,我们将给予你丰厚的积分和按工时算的报酬,怎么样?”

“木有问题,地址发过来吧!”

杨成一口答应了。

第六十五章 网页改版(中)

很快,杨成的眼前出现了一个链接,点开便加载出了一个网页。

首先映入眼帘的是一个长方形的轮播图,下方配有相应的说明文字。

“玩家精彩集锦(一):某男子遭河马追赶并被顶上天”。

杨成嘴里念着,顿时感觉不对劲。

他点进去一看,顿时脸成了猪肝色,大窘啊。

这不是那次在非洲和科勒文的冒险吗?

居然被无良小编截图,还发表了!

哼!改天一定要投诉这家伙,让他吃不了兜着走!

杨成愤愤不平地关掉这网页,强忍住心中的怒火,把注意力放到主页上来。

第六十六章 网页改版(下)

“成成”。

系统声音及时地响了起来。

“我们设计师决定,把原先网页的黄底色风格,改为绿底色风格,这样让界面更和谐。”

“大体上是这样,具体的改动你自己决定”。

“嗯”,杨成仔仔细细地观察了一番主页。

平时作为一名程序员,他对于颜色的知识了解得并不多。

但好在他善于查找资料,网上这方面的东西还是很多的。

杨成经过几个小时的学习,确定了修改方案。

他将方案给系统看。

“嗯,谢谢你,成成,我先把方案给设计师,辛苦你了”。

“小事一桩”,杨成摆摆手。

“叮!当前积分160分,击败了全球45%的玩家,请您再接再厉!”

“等等,我还有个事儿”。

“把你们小编家的地址告诉俺”。

“俺给他邮寄刀片去!”

杨成恶狠狠地说道。

系统:“”

第六十七章 大整数加减法

“成成,经过前面的考验,我们项目组的leader对你很满意哟”。

系统声音显得很兴奋。

“所以这次嘛,我们给你安排了一些更核心的任务——编写基础库”。

“哇塞!”

杨成两眼放光,迫不及待地想知道内容。

“在很多编程语言中,数值型变量能表示数字的大小是有上限和下限的”。

“就好比一个装水的瓶子,如果装的水太多了,就会导致一种情况——溢出”。

“而在程序中则表现为,数据的丢失”。

系统接着说道。

“所以,对于一些特别大的数字,我们不会用数值型变量直接来装,而是用字符串的形式”。

“但是,这就导致了一个问题。”

“很多编程语言并没有提供或早期版本不支持大数字字符串之间的运算,必须由程序员来编写对应的库”。

“你懂我的意思嘛?”

“嗯,了解!”,杨成点了点头。

“你现在的任务是:给大整数字符串之间的加法和减法编写库函数”。

“有问题吗?”

杨成略加思索,觉得问题不大。

毕竟只是整数间的加减法,没有涉及到浮点数和乘除法的话,应该还是容易解决的。

“你放心吧,只要调出编辑器面板来写就ok啦,测试用例我们会提供的!”

系统给予他鼓励。

“好咧!”

杨成捋起袖子,说干就干。

首先对于加法,把两个输入的字符串从低位到高位对齐,将较短的字符串高位补零,让它们长短一致。

然后,从低位(个位)开始,做加法。

接着,就是小学数学的概念了:

当前数位相加,满10就“进位”。

算法和整数加法是一个道理,不过在程序中会使用数组来方便操作。

而大整数字符串减法的思路和加法相似:

也是先把数位对齐,再每一位相减。

如果被减数当前位小于减数当前位,就向高一位“借位”,借10再来做减法。

这两个算法的实现都不复杂,但是有一些问题需要考虑好。

像非法数据的检测。

比如说像以一个或多个0开头的合法数据,像“00012”,该如何处理,剔除掉开头的这些0。

再比如说负整数相加减的情况,都值得注意,这样才能提高程序的健壮性。

话说,杨成辛辛苦苦地,忙活了几个小时。

然后,他一点“提交”按钮。

只听见“唰!”的一声,面板上弹出测试结果。

祖国江山一片绿!

“恭喜你!测试全部通过了!”,系统声音蹦了出来。

“叮!当前积分165分,击败了全球45%的玩家,请您再接再厉!”

第六十八章 买彩票(上)

话说杨成接连完成了多个任务,他感觉“营养跟不上”。

于是他要求系统把他传送到大街上,兜兜风,散散心。

车子停在十字路口等红绿灯的时候,他远远地瞅见正前方街边有一家挂着大红招牌的福利彩票中心。

这家伙顿时心血来潮,想要去试试手气。

“老板,给我机选两注双色球~”。

刚跨进彩票中心的大门,杨成就大声地嚷嚷道。

“小伙子,过来抽一张彩票”。

那老板似乎并不感冒,一副懒洋洋的模样,指了指旁边一个小纸盒。

杨成顿时睁大了眼睛,这特么玩的还是“刮刮乐”啊!

他伸出手,在盒里摸索了一番,然后摸出一张彩票。

只见那上面蒙了一层涂膜。

杨成用食指的指甲轻轻地划开薄膜,几行字符很快出现在他的视线中:

“dog_dog_dog”

杨成拿起彩票,端详起来。

wtf?

这是在嘲弄俺是单身狗嘛!

第六十九章 买彩票(下)

杨成顿时石化了,内心仿佛遭受了一万点暴击。

“哈哈!”

老板笑了笑。

“小伙子,你很走运诶!”。

“居然抽中了我们的特等奖”。

“我恐怕不能给你兑奖了”。

“老夫倾尽家财也拿不出这么多钱”

“不过”

“我可以给你更多的积分,怎么样?”

杨成感到一身的疲劳,消失殆尽了。

他的眼神突然坚定了起来。

转而是一种释然。

“谢谢你,老板”。

说完这句话,杨成转身离去。

那张彩票黯然跌落在地上。

第七十章 心好乱

杨成从彩票中心出来,上了自己的车,正准备开过十字路口。

然后,他看到了令人瞠目结舌的一幕:

这十字路口乱成了一锅粥。

“md,你tm会不会开车啊”。

对面一位车主忍不住冲着杨成嚷嚷道。

杨成好歹也是读书人,涵养极好,内心也是有句mmdp不知当讲不讲。

而其他人就没这么好的素质了,争吵声,对骂声很快响了起来。

交警很快赶了过来,努力维持现场秩序。

杨成感觉心好乱好乱,竟是久久不能平息。

于是,他轻声呼唤系统。

第七十一章 汉诺塔(上)

“系统妹子,我厌倦了城市的喧嚣,带我去印度吧”。

“不要恒河水,让我去见识下异国风情就可以了”。

位于印度北部的一家寺庙,这里人来人往,朝圣者络绎不绝。

一位年长的僧侣正在给游客们耐心地讲解。

“这位是我们信奉的创造之神梵天”。

“它有四面四臂,分别象征心灵,智慧,自我以及自信”。

“它所跨孔雀,生而能辨是非,惩恶扬善”。

“头顶王冠寓意着地位,脚踏莲花则代表与自然合二为一”。

“梵天神牺牲自我,而对于世人有求必应”

这时,一位戴着墨镜的东方旅人,走进了寺庙。

他默默地听着僧侣的讲解,不时四处打量着,似乎另有目的。

时间过得很快,游人们渐渐散去,夕阳的余晖照进寺内。

“这位朋友,明天再来吧”,僧侣朝杨成挥了挥手。

“您好,我想知道梵天神创世的秘密”,杨成盯着僧侣。

“什么秘密?”,僧侣眼中闪过一丝惊讶。

“汉诺塔”,杨成的语气很坚定。

僧侣的脸上凝固了几秒,随后变成释然的微笑。

“年轻人,你知道世界中心,还有圣庙?”

“就是这里”,杨成耸了耸肩,这个姿势可不太“东方”。

“请跟我来”,僧侣的脸上重归平静,就如同一口古井,再也泛不起半点涟漪。

杨成赶紧跟上前。

两个人穿越了重重叠叠的屏障,最后停在了一个毫不起眼的小屋子前。

大门紧锁,僧侣停下了脚步。

“这个秘密不是谁都可以知晓的,你必须先经过我们的考验”。

僧侣的眼中闪过一道精光。

“悉听尊便”。

第七十二章 汉诺塔(中)

僧侣缓缓地推开大门,一道金光从门缝间钻出来。

“这是?”,杨成难以置信地睁大了双眼。

“请进”,僧侣的表情变得格外肃穆起来。

杨成跨进大门,首先映入眼帘的是桌上一块金色的铜板,上面插着三根璀璨夺目的宝石针。

“梵天神创世之初,在其中一根宝石针上,从大到小穿好了64块金片,这就是汉诺塔的由来”。

“他命我等,不分昼夜,按照自然法则,移动金片”,僧侣继续说道。

“一次只能移动一片,不管在哪根针上,小片都必须在大片上面。”

“当所有金片都移动到另外一根针上时,世界将在电闪雷鸣中,化为虚无”。

杨成定睛一看,发现第一根宝石针上赫然只有三块金片。

“真正的汉诺塔自然不会在这里”,僧侣眼含笑意。

“这只是用来考验你智慧的仿品”。

杨成顿时松了一口气,要是真是有64块金片,他这辈子就只能在这里做牛做马了。

“年轻人,不管你用什么方法,我需要你模拟出移动金片的过程,告诉我”。

僧侣说完这一切,便不再言语,静静地伫立在一侧。

杨成则是眉头紧皱,眼睛专注地盯着那几根宝石针。

对于汉诺塔问题,有一种简单的递归解法。

这种解法易于理解,也容易证明其正确性,但每个金片的具体移动方式并不清楚,很难用手工移动来模拟这个算法。

所以,必须想一个非递归的解法!

第七十三章 汉诺塔(下)

铜板上,三根宝石针折射出夺目的光芒,在杨成眼中却是另一番景象。

在他的脑海中,装载有金片的宝石针,被命名为a,其他两根,则是b和c。

a宝石针上的三块金片,从小到大,从上而下,编号为1,2,3。

那这个问题就可以阐述为,将宝石针a上的所有金片,移到b上,并且按照同样的顺序叠置。

嗯,就是这样!

杨成脑海中继续进行推演。

按照汉诺塔问题的解法,先将宝石针a,b,c排成一个三角形。

a->b->c->a

这样就构成了一个顺时针循环。

接着,算法如下:

在移动金片的过程中,如果是奇数次移动(比如说第一次),将最小的金片移到顺时针方向的下一根宝石针上。

比方说第一次移动,就是将a1移到b。

如果是偶数次移动,则保持最小的金片不动,而在其他两根宝石针之间,将较小的金片移到另一根上面去。

比方说第二次移动,此时最小的金片在b,保持不动,而将a2移到c。

以后每一次移动都按照上面来做。

所以,我们必须记录两个东西:

1当前移动的次数

2最小的金片位于哪根宝石针上(初始化是宝石针a)

这个算法将持续到,所有金片都按照顺序叠置到了宝石针b,算法结束。

按照这个算法,杨成很容易就求出了移动金片的过程。

“a1到b”

“a2到c”

“b1到c”

“a3到b”

“c1到a”

“c2到b”

“a1到b”

“一共是7步”,杨成不慌不忙地说出了答案。

“很好!”,一直沉默不语的僧侣说出这几个字。

“关于世界的终极答案,即使是神也无从知晓”。

“但我们不能失去进取心,停下对未知世界探索的脚步!”

“叮!恭喜您完成汉诺塔任务!当前积分173分,击败了全球46%的玩家,请您再接再厉!”

第七十四章 施舍

从圣庙中出来,杨成这才发现东方的天空泛起了一抹鱼肚白。

原来,他在庙中度过了一整夜!

真是光阴似箭哪。

就在这时,从不远处,走过来几个身影。

“施主”。

其中一位僧侣对着杨成稽首说道。

“可否施舍点早饭钱?”

杨成吃了一惊,下意识地摸了摸自己干瘪的肚子。

自己的早餐都没有着落呐,哪还有钱来施舍哟。

他翻了翻自己的口袋。

出乎意料的是,口袋里居然有一把铜币。

这意味着,自己又触发了任务。

“尊敬的玩家,你现在有15枚铜币”,系统声音响起。

“请分成5份,如下所示”。

杨成眼前很快浮现一个框框。

[1,2,3,4,5]

“请按照队列分配5份铜币”。

“请注意:铜币和僧侣都应遵循队列”。

杨成把铜币摆放在地上,按照系统提示分成5份。

然后,他冲着僧侣们喊道。

“想要早饭钱就赶紧排队来领!”

僧侣们听完,赶紧排成一列。

杨成略加思考,因为在程序中,队列是先进先出的。

用英文表示就是fifo。

更通俗点讲,就好比排队买票,先到的可以先买到票,然后走出队伍。

后来的就得慢慢地排队呗!

这里有3个僧侣,5份铜币。

那么该怎么分配呢?

每个僧侣如果要按照队列,那么每领完一份,就回到队尾,重新排队。

直到所有铜币份数都被领完。

这就是这个问题的通用算法。

接着,杨成开始了派发礼包。

铜币队列出队,僧侣队列出队,第一位僧侣得到第一份1个硬币,到队尾重新入队。

铜币队列出队,僧侣队列出队,第二位僧侣得到第二份2个硬币,到队尾重新入队。

铜币队列出队,僧侣队列出队,第三位僧侣得到第三份3个硬币,到队尾重新入队。

铜币队列出队,僧侣队列出队,第一位僧侣得到第四份4个硬币,到队尾重新入队。

铜币队列出队,僧侣队列出队,第二位僧侣得到第五份5个硬币。

此时,所有礼包(份数)都分配完毕了。

铜币队列为空,算法结束。

统计下战果:

第一位僧侣得到14=5个硬币。

第二位僧侣得到25=7个硬币。

第三位僧侣得到3个硬币。

“施主宅心仁厚,我等无以为报”。

僧侣们纷纷点头称善。

“只能为你锦上添花”。

“叮!当前积分175分,击败了全球46%的玩家,请您再接再厉!”

“系统妹子,我不想在外国逗留了”。

杨成呼唤道。

“还是带我去中国古代吧,来一场传统文化之旅!”

第七十五章 圆周率(上)

南朝宋大明五年,徐州刺史府,夜空有一轮明月高悬,夜沉似水,晚风习习。

府内大院,此时正值三更,四周静寂无声。

一个中年人借着这明亮的月光,端坐在院中的石凳上,正在辛勤地进行数学推演。

他手上并没有常见的算盘,在这个年代,还处于“筹算”的阶段。

那一根根小小的木棍,便是他的工具。

中年人十分专注,此时此刻他眼中只有那个一直苦苦探索的问题,脑海中更是电光石火地闪过他曾经推演过无数次的结论。

这时候,一个年轻的身影,慢慢走了过来。

中年人沉浸在自己的世界中,似乎毫无察觉。

杨成走上前,眼中满是敬意,犹豫了几分钟,他终于鼓起了勇气。

“先生请赐教,圆周有率几何?”

中年人闻之,面不改色,更是没有停下手中的工作。

须臾间,他开口说道。

“以圆径一亿为一丈,圆周盈数三丈一尺四寸一分五厘九毫二秒七忽,朒数三丈一尺四寸一分五厘九毫二秒六忽,正数在盈朒二限之间。密率,圆径一百一十三,圆周三百五十五。约率,圆径七,周二十二。”

杨成点点头,中年人的意思很明了,圆周率介于31415926和31415927之间,它有近似数355/113和22/7。

所谓“密率”,指代精密的近似数。而“约率”,指代粗疏的近似数。

“汝可自开密法”,中年人突然抬起头,轻抚胡须,满是笑意。

“后生自当竭尽所能”,杨成低垂着头,开始了漫长的思考。

时间缓缓地流逝着,月色越发明亮起来。

第七十六章 圆周率(下)

在历史长河中,对圆周率的精确求解做出重大贡献的有很多先哲。

其中包括德国数学大师,莱布尼茨。

杨成脑海中,一个公式慢慢浮现:

“pi/4=1-1/31/5-1/7”

这个又被称为“莱布尼茨公式”,通过对这个公式后面项的反复迭代运算,可以对圆周率的精度做提高。

而眼前的这位中年人,毫无疑问是中国古代的杰出数学家——祖冲之。

他最为人所知的贡献是计算出圆周率小数点后七位。

那么,用莱布尼茨的公式,如果要达到祖冲之这样的精度,需要迭代多少次呢?

杨成调出编辑器面板,开始进行代码编写。

这个算法并不复杂,n代表当前项数,最开始是0,逢双项加上1除以2n加1,逢单项减去1除以2n加1。

结果乘以4,一直持续到达到指定的精度为止。

杨成点击提交,一运行代码。

让他惊讶万分的事情出现了!

要求出31415926-31415927之间的结果,至少需要上千万次的迭代!

在这个计算机普及的时代,上千万次迭代运算给用户的体验都是谈不上良好的,那祖冲之是如何做到如此精确求解的?

莱布尼茨求圆周率公式相对于后人提出的公式求解效率自然是差远了。

但祖冲之的年代距离莱布尼茨时代,差了又何止一千年?

杨成抬起头,发现祖冲之并没有再关注他,而是沉浸在自己的演算中了。

他眼中充满了深深的敬意。

没有十年如一日的刻苦钻研,如何能取得这样的成就?

就在杨成感慨不已的时候,那漆黑的天空中,一颗流星划过天际。

像祖冲之这样的大师,群星璀璨的夜空中一定会有他的位置。

“叮!当前积分177分,击败了全球47%的玩家,请您再接再厉!”

第七十七章 矩阵革命(上)

“尼奥,我是墨菲斯,你在哪里?”

“哈哈,老伙计,咋们来玩个猫捉老鼠的游戏”

杨成只感觉眼前视觉一暗,系统音随之响起。

“系统生成矩阵中”

“初始化设置:长1000单位,宽1000单位”

“随机化生成target”

下一刻,杨成睁大了眼睛。

他发现自己竟然身处上万米的高空。

云朵触手可及,这种感觉让这个有恐高症的可怜男人禁不住想大呼救命。

好在他很快就适应了,因为他观察到了一个有趣的现象:

就好比穿越火线里面开了“飞天外挂”一般,这种动画效果和现实中还是有差距的。

瞅了瞅下方,杨成发现了一个大型的矩阵迷宫。

根据刚才的线索,顶尖黑客兼大帅哥尼奥,他一定就藏在这矩阵的某处。

杨成不禁想起了基努李维斯那张酷酷的脸,心中暗道,这出题的人还真会玩呐。

“好,就让我把你揪出来,然后索要签名!”

光凭肉眼,想在这1000x1000=100万个矩阵格子中找到尼奥,除非你有“二娃”那样的千里眼。

但是,对于矩阵,都有一种简单粗暴的解法。

杨成称之为——“地毯式搜索”。

不就是一层一层地搜索嘛!

在程序中则体现为两层循环嵌套查找,找到尼奥,程序就结束了。

杨成大脑运转如飞,手头也没闲着。

一分钟后,他一按回车键,只听见“啪”的一声。

就只见地面上的矩阵,最左上角的格子率先亮起,紧接着是右侧的格子

接着是下一行最左侧的格子

又是下一行

一片片区域被点亮,很快整个矩阵一半被灯光覆盖了。

然后,杨成只看到矩阵某处,一道红光闪烁,系统音瞬间响起。

“命中查找!尼奥坐标已锁定!”

“该死的!”

一个中年男子的声音响起,伴随着咒骂。

“这么快就给你发现了?”

“系统,加大难度!”

“这次别想再轻易找到我!”

尼奥话音刚落,下方的矩阵顿时地动山摇起来。

第七十八章 矩阵革命(下)

“系统正在销毁矩阵”

“系统重新构建矩阵”

“系统生成杨氏矩阵”

“初始化设置:长度100万单位,宽度100万单位”

“随机化生成target”

听到这熟悉的声音,杨成皱了皱眉头。

他朝下方一看,只见那密密麻麻的矩阵,延伸到虚拟世界的尽头,漫无边际。

那一个个犹如针孔般的矩阵格子,足以让有“密集恐惧症”的人抓狂。

“呵好家伙”。

杨成不禁倒吸一口凉气。

100w乘以100w,绝对是天文数字啊。

尼奥这次算是下了血本了。

地毯式搜索,面对这个数量级的问题,只会如同泥牛入海一般,杳无音讯。

对于搜索问题,查找次数必须限制在百万级,才会有较好的用户体验。

悬浮在高空中,杨成用手托着下巴,开始了思考。

系统刚才有提到“杨氏矩阵”。

这是个什么东西呢?

对于杨氏矩阵中任意一个小格子,它里面存放有数字元素。

小格子右边和下方的元素都比它自身要大。

或者说,对于矩阵,任意一行,任意一列元素都是严格的增序。

比如像这样:

“1,5,9”

“2,6,10”

“3,7,11”

这就是一个杨氏矩阵。

它不管哪一行,哪一列,都是严格递增的。

根据这个性质,不难推出(也可以观察出):

对于任意元素,它左边的元素比它小,下边的元素比它要大。

所以,如果要在杨氏矩阵中查找某个元素,可以利用这个性质,从矩阵最右上方开始查找。

比如如果我要找“3”,我从右上角的“9”开始查找。

因为“3”小于“9”,所以找“9”左边的(左边的元素比它小),得到“5”。

“3”又小于“5”,所以找“5”左边的,得到“1”。

“3”大于“1”,找“1”下边的(下边的元素比它要大),得到“2”。

“3”大于“2”,找“2”下边的,命中目标。

这个算法效率很高,足以胜任长宽(size)上百万的矩阵查找。

对于这个问题,即使是最坏的情况,即尼奥位于矩阵的最左下方,而从最右上方查找,也只需要200w次查找,这是程序足以胜任的。

不过,如果尼奥如果不在矩阵中,最后查找就会越界,即非命中查找。

杨成编写完代码,然后一提交。

只见天边宛如大潮涌来,成片成片的矩阵格子倒塌,化为废墟。

就如同被掰开的巧克力一般,矩阵分崩离析。

估摸着过了几分钟。

刚才还气势恢宏的矩阵,通通变成了断壁残垣。

某处废墟,一堆破铜烂铁里突然伸出一只手臂,手上还举着一支小小的白旗。

“墨菲斯,你赢了”。

“叮!当前积分181分,击败了全球47%的玩家,请您再接再厉!”

第七十九章 埃拉托色尼(上)

古希腊亚历山大港,夏至,太阳至黄经90度。

熙熙攘攘的集市,贩夫走卒的叫卖声不绝。

就在这繁华街头的一个角落,这里人迹罕至,显然不是适合做生意的好地方。

一位身穿长袍的老者独自站立在这里,陷入沉思。

耳畔的喧闹声不能影响到他分毫,此时此刻他的目光集中在了一栋高大建筑所投下的阴影上。

那阴影就如同一抹清凉,让他的大脑始终保持着清醒,得以孜孜不倦地思考。

“西恩纳城那边的结果还没有过来吗?”

老者轻轻地叹了一口气,自言自语道。

作为古希腊最富盛名的学者以及亚历山大图书馆馆长,他可以调动很多学术资源,但也不是一时半会就可以拿到结果。

根据他先前的研究,在夏至日分别在亚历山大城和西恩纳城同时观察阳光直射的位置,然后测量出直立的建筑物投射的影子长短,并且加以分析,就能测量出地球的周长。

“这绝对是前无古人的发现!”

老者心中迸发出久违的激情。

他用力握了握拳头,感觉自己浑身充满了力量,那布满皱纹的脸上流露出欣慰的笑容来。

就在这时,一位年轻的骑手从不远处飞奔而来。

他那快马停在老者跟前。

骑手脸上满是崇敬,他先是对着老者躬身,然后说道。

“尊敬的埃拉托色尼,国王邀请您商议”。

“什么事情?”

老者轻抚胡须,不慌不忙。

“有一位来自东方的智者要和您讨论问题”。

第八十章 埃拉托色尼(中)

夕阳的余晖映照在王宫大殿上方,白昼落下帷幕。

法罗岛的灯塔开始照耀四方。

很快,犹如一幅璀璨的的星空之图缓缓地向人们展开,划过的流星,变幻莫测的星云,一一上演动人心弦的篇章。

此情此景,让杨成想起梵高笔下的《星空》。

“如果能每天都有所收获,即使生命短暂,如流星刹那间地划过,又有何妨呢?”

他不禁感慨道。

“小友”,埃拉托色尼正色道。

“的确,我们不能再荒废时间了”。

“我有个苦苦探索的问题,希望和你分享”。

“请讲”。

对于杨成,能得到这么多先哲的言传身教,自然是应该好好珍惜。

“这个问题很简单,你能求出10以内的质数吗?”

“请容我思考片刻”。

杨成并没有因为这个问题简单就轻视它,对于接触过数学的人,大都可以不假思索地说出这几个质数来。

对于计算机,你必须用它能够读懂的程序语言来说明。

“从1开始,遍历到10,依次判断是否是质数”,这是杨成经过仔细思考的结果。

质数除了1和它自身外,没有其它因数。

根据这一性质,我们要判断一个数n是不是质数,只要将2到n-1的数,判断n能否被这些数整除即可,有能整除n的数,说明是合数,否则是质数。

比如,判断10是不是质数,就将2到9的数,判断是否为10的因子。

一开始,2就是10的因子,所以10不是质数。

甚至,可以对n,只考虑2到n的平方根之间的数。

比如,判断9是不是质数,只要将2和3(9的平方根),判断是否为9的因子。

2不是9的因子,3却是9的因子,所以9也不是质数。

这个是大部分人一开始就能想到的方法。

“这不是我想要的答案”。

埃拉托色尼只说了这样一句。

第八十一章 埃拉托色尼(下)

“能遇见您,我深感荣幸”,杨成说道。

“还望您不吝赐教”。

此时此刻,星光满天,月美无暇,良辰美景,更是激发了杨成内心求知的渴望。

埃拉托色尼眼中闪过一丝欣赏之色。

“曾经,这个问题困扰我多时,让我夜不能寐,情愿用一生来追寻它的答案”。

“当我发现了解法,惊喜万分,却无法和大众分享”。

“人生在世,知己难求”。

杨成可以看出,埃拉托色尼眼中的落寞。

但那神色只是转瞬即逝。

“我称之为筛法”,埃拉托色尼变得严肃起来。

“1不是质数,所以第一步,写下2到10的所有整数”。

[2,3,4,5,6,7,8,9,10]

“第二步,圈出2,标注为质数,去掉2的倍数,4,6,8,10”。

[*2,3,5,7,9]

“然后,圈出下一个没有被标注的最小数,这里是3,标注为质数,去掉3的倍数,9”。

[*2,*3,5,7]

“以此类推,下一个没被标注的最小数是5,标注为质数,5在数列中没有倍数”。

[*2,*3,*5,7]

“最后一个没被标注的最小数是7,标注为质数,7在数列中没有倍数”。

[*2,*3,*5,*7]

“至此,所有质数2,3,5,7都被圈出”。

“嗯”,杨成点了点头。

这就是数论历史上大名鼎鼎的求质数方法——埃拉托色尼筛法。

杨成默默地打开编辑器,开始验证这个方法。

结果证明,自己的求质数方法,至少需要9次判定,而使用埃式筛法,只需要6次判定!

而且,随着数量级的增大,比如要求10w以内的质数,埃式筛法效率优势会更加明显。

简单埃拉托色尼筛法,如果加以改进,足以胜任上亿以内质数的求解!

“如果有一天我不能继续自己热爱的研究,形如槁木”。

“那样和死去又有什么分别呢?”

埃拉托色尼长声一叹。

杨成却还沉浸在自己的发现中。

直到冷寂的王宫大殿,人去楼空,他才回过神来。

埃拉托色尼早已不见了踪影,只剩那满天的星光。

第八十二章 戈尔迪之结(上)

公元前334年,马其顿国王亚历山大率军东征波斯,于小亚细亚兵败。

亚历山大仅以身免,与其副官逃窜至村落。

一条崎岖的山路上,两个年轻人互相搀扶着,跌跌撞撞地前行。

“阿历克斯”,其中一人头戴王冠,轻声呼唤道。

“主上,请您再坚持一会儿,我们很快就可以走出这块区域”,被称作阿历克斯的男子有着一副东方面孔。

“阿历克斯,咋们先停下来,歇一歇吧”,亚历山大此时已是精疲力竭了。

于是,两人脱下了鞋子,席地而坐。

亚历山大此刻憔悴不堪,战败的阴影让他心如刀割,整个人生处在了最低谷。

“无所不在的宙斯神啊,你的子民渴求您的庇佑!”

亚历山大口中念念有词,脸上带着虔诚的神色。

就只听见高空中一阵电闪雷鸣,大有山雨欲来风满楼之势。

“嘭!”,一声巨响过后。

旁边的一颗百年老树被雷电击中,化作焦炭。

一缕青烟冒起,模模糊糊地出现一个人影。

“这”,亚历山大眼中既疑惑又有些惊喜。

那人影渐渐实化,化作一位手持节杖的年轻人。

“两位神眷者,先自我介绍下,我是神使赫尔墨斯”。

“尊敬的神使,您有何吩咐?”,亚历山大不敢怠慢,赶紧行礼。

那赫尔墨斯脸上流露出微笑来。

“两位都处在命运的分岔口上,想不想有所改变?”

“想!”,亚历山大回答十分果断。

“很好,那就给你一个机会”,赫尔墨斯直视亚历山大的双眼,轻轻地摇晃了一下手中的节杖。

只见那柳树枝制成的节杖,原本被丝带所缠绕,丝带顿时化作两条吐信的蟒蛇,张开嘴巴,各吐出一道神光,交汇在赫尔墨斯手掌上。

他手掌中很快出现了一个物品。

“这是戈尔迪之结”,赫尔墨斯轻轻向前一抛,亚历山大单手接住。

“能解开这个结,我就帮你改变宿命的轨迹!”

第八十三章 戈尔迪之结(中)

传说中的戈尔迪之结,由山茱萸绳结成绳扣,绳扣无首亦无尾,想要解开它,即使是最聪明的智者也束手无策。

亚历山大自然也不例外。

“你们慢慢想吧,如果能找到方法,请呼唤我的名字”,赫尔墨斯话音刚落,身体化作一阵清风远去。

亚历山大满脸愁苦地看着手上的戈尔迪之结,这个问题可比和波斯人作战难解多了。

“阿历克斯,你在干嘛?”,亚历山大抬起头一看。

只见那杨成神色慌张地看着一个方向。

顺着那方向看过去,百米开外,一头成年棕熊正朝这边跑过来,显然是把这边两位当作了盘中餐。

然后,又见那杨成慌不择路地穿上跑鞋。

“阿历克斯,你这个笨蛋!”,亚历山大说道。

“你不可能跑得过一头成年棕熊的!”

杨成穿好了跑鞋,一溜烟地跑开了,口中还念叨着。

“俺不需要跑过熊,只要能跑过你就行了”。

亚历山大一听这话,顿时目瞪口呆。

俺是来完成任务的,不是陪你来喂饱棕熊的!

杨成心里腹诽着,同时加快了脚步。

面对嗷嗷狂吼着的棕熊,亚历山大面色沉着,冷静如冰。

他缓缓拔出腰间别着的宝剑,目光紧紧地盯着眼前对手。

他心里明白,自己只有一次机会。

凭自己现在的体能,别说是一头成年棕熊了,就算是一只鸡,也得费些功夫。

于是,他左手拿起戈尔迪之结,轻轻地往上一抛。

紧接着,寒光一闪,手起剑落,绳结化为两段!

“赫尔墨斯!”,亚历山大振臂高呼。

那一分为二的戈尔迪之结瞬间消失不见。

天空中一道神光降下,笼罩了亚历山大全身。

圣音响起,犹如清泉流响。

“从今而后,汝可为亚细亚之王!”

第八十四章 戈尔迪之结(下)

“在你之前,有千百人尝试过无数种方法,试图解开戈尔迪之结,他们无一例外都失败了”,赫尔墨斯的声音无比空灵,仿佛。

“而亚历山大,你没有重蹈覆辙,而是为这个复杂的问题找出了聪明的解法”。

“你的成功来自于你的智慧!”,赫尔墨斯给予肯定。

“阿历克斯,年轻人,不要跑得那么快”,赫尔墨斯话锋一转。

杨成一听这话,顿时停下了脚步,四处张望。

“敢问大神有何指教?”

“哈哈”,赫尔墨斯爽朗地一笑。

“小伙子你也很机灵,不过是些小聪明”。

“用你们现代人的话说,亚历山大找到了捷径”。

“记住,在你们程序的世界,寻找编程的捷径也很重要!”

“就好比可以用二分搜索的地方千万不要顺序遍历搜索”。

“这个关卡的意义不是教会你如何在成年棕熊的追杀下活命”。

“不要试图解开戈尔迪之结!”

“而是用你思想的锋芒,劈开戈尔迪之结!”,赫尔墨斯的话掷地有声。

第八十五章 测井(上)

凉州西北方向,是一片宽广辽阔的大漠,寥寥孤烟升起。

一支地质勘探队在大漠中驻扎,生火做饭。

杨成坐在皮卡的顶棚上,眺望远方,顺带着咬了几口夹着咸菜的馒头,喝一口瓶装矿泉水。

这里无比干旱贫瘠,连风中都带有一种苦涩的味道。

杨成不禁想起了唐代诗人王之涣的边塞名句。

“羌笛何须怨杨柳,春风不度玉门关”,此诗描写了塞外雄伟壮阔又荒凉寂寞的景象,此处很是应景。

馒头夹着咸菜的味道真是太糟糕了,让他不禁怀念起故乡的百货店,随处可以买到的瓶装的“old-godmother”。

每月多吃一袋米,可不是说着玩的。

“大家赶紧吃完饭,咋们下午就开工了!”,勘探队队长吆喝了一声,然后一个翻身上了皮卡。

“杨工”,队长拍拍杨成的肩膀。

“队长”,杨成赶紧把小半个馒头塞进嘴巴里,吧唧吧唧地咀嚼起来。

“咋们刚才组里的研究了一下”,队长说着掏出个文件。

“下午进行测井”。

“最多总和是打5米深,可以打多个孔,您看看价格表,怎么打孔售价最高?”

“打一个1米的孔可以卖出1w块”。

“打一个2米的孔可以卖出5w块”。

“打一个3米的孔可以卖出8w块”。

“打一个4米的孔可以卖出9w块”。

“打一个5米的孔可以卖出10w块”。

“也就是说,你可以打5个1米的孔,但只能卖5x1=5w块钱”。

“杨工,你算算怎么打孔,使得总深度为5米,但咋们能赚最多?”

-----------------

大家可以算算怎么打孔收益最高,总深度限制在了5米哈^_^

第八十六章 测井(下)

这个打孔问题,因为要涉及到求具体的组合方案,所以不可避免地要对所有可能方案进行分析,以寻求最大收益。

杨成调出编辑器面板,编写代码,求出所有的可能性。

很快,他得到了7种方案:

第一种,直接打5米的孔,这样直接拿10w块走人,暂时看作是最优解。

第二种,打一个1米的孔,再加上一个4米的孔,这样加起来也是5米,收益则是19=10w块,和方案一是一样的收益。

第三种,打一个2米的孔,再加上个3米的孔,收益是58=13w,比方案一和方案二收益要高3w,所以是目前的最优解。

第四种,打两个1米的孔,再加上个3米的孔,收益是2x18=10w,不如方案三。

第五种,打一个1米的孔,再加上两个2米的孔,收益是12x5=11w,不如方案三。

第六种,打三个1米的孔,再加上个2米的孔,收益是3x15=8w,比方案三差远了。

第七种,就是我们最先提到的方案,打五个1米的孔,收益是5x1=5w,应该算作最差解。

这么一摆出来,一目了然。

“队长,打23组合套餐吧”,杨成在风沙中眯着眼睛,从口兜里摸出根香烟来。

“你小子,还真有两把刷子!”,队长笑着给了他一拳。

“队长,有多久没结账了?”,杨成掏出打火机,点燃香烟。

“那就如你所愿”。

“叮!当前积分200分,击败了全球48%的玩家,请您再接再厉!”

第八十七章 迷乱之村(上)

“系统妹子,让我去dnf的世界,客串一把勇士,怎么样?”

“没问题,你想要什么职业?”

“拒绝下水道,给我来个狂战士身份就ok了”。

天空中,飘着淅淅沥沥的小雨,这雨滴滴落在身上,总会呈现出一抹异样的紫色。

而这里的空气中,更是弥漫着让人窒息的气息,随便吸入几口便忍不住想大声咳嗽。

很显然,这都是有着剧毒的。

“好诡异的气氛啊”,杨成不禁擦了擦鼻子,感觉肺里一阵火烧火燎。

看来病毒已经在侵蚀自己的身体了,凭借着体内的血气之力,或许还能抵挡一段时间。

“魔笛使者皮特究竟在什么地方?”,杨成环顾四周。

诺大的哈穆林村空空荡荡的,连只猫狗都见不着,更别说半个人影了。

此行,勇士们的目的是得干掉为害一方的魔笛使者。

传闻魔笛使者皮特,被使徒狄瑞吉控制,赋予不死的生命,助他阻挡人类世界的访客。

想到这里,杨成不由得缩了缩身子,现实中玩玩cosplay没问题,真正面临这样的大魔头又是另一种情形了。

杨成扬了扬手上的柳叶刀,给自己壮了壮胆。

很快就要走到哈穆林村的中心广场了,杨成隐约听到一阵笛声。

那笛声欢快激昂,就像在领导大家伙进行合奏一般。

“好个皮特,就在正前方!”,杨成匍匐着身子,把个柳叶刀别在身子一侧,他可不想打草惊蛇。

作为一名资深游戏玩家,他知道潜伏的必要性,打对手个措手不及才是王道。

就在杨成匍匐前进后不久,他眼前很快出现了一个高大的年轻人,站在广场的石阶上。

那皮特面色阴沉,双手紧握短笛,放在唇边轻吟,那魔性的音乐就如同碧海潮生般,绵绵不绝,勾人魂魄。

杨成潜伏在草丛中,思考着如何将这魔头击杀。

根据他打游戏的经验,先冲上去,一记崩山击,再加十字斩比较靠谱。

“嗯,就这么定了!”,杨成握紧了手中的柳叶刀,开始了蓄势。

“咔嚓!”

“唉呀!”,杨成一声惨叫,冷不防屁股遭到不明生物的啃咬。

杨成疼得滚出草丛,柳叶刀不知所踪。

“吱吱!”,这是他最后听到的声音,接着毒素爆发让他陷入昏迷。

第八十八章 迷乱之村(中)

“噗~”,一桶凉水被浇到杨成脸上。

“咳咳!”,杨成大声咳嗽起来,迷迷糊糊地睁开眼睛。

“阿拉德的勇士,你终于醒了”,一个低沉的声音响起来,就像一台破旧的老风琴被拉响。

“who?”,杨成一个激灵爬起来。

站在他眼前的是一个妖异的年轻人,脸上带着邪魅的微笑,左手拿着短笛,右手则操起一个装了少许水的木桶。

“你是!魔笛使者皮特!”,杨成顿时感觉万分惊悚,双腿不禁颤抖起来。

而在他背后,那犹如潮水般的老鼠大军,把他围了个水泄不通。

“狄瑞吉大人吩咐我,凡是遇到阿拉德人,格杀勿论!”

皮特伸出一只瘦长的手指,抬了抬杨成的下巴。

四目相对,杨成感觉皮特的眼中仿佛有个黑洞,源源不断地吸取他的勇气和生命力。

“不过”。

皮特把杨成推了个踉跄。

“你如果能帮我解决这个问题,我或许可以考虑,饶你不死!”

“什么问题?”,杨成就跟抓住了根救命稻草般地问道。

“冒险家,看看你背后”,皮特指向一个方向。

杨成转过身子,这一看不要紧。

他看到几百只壮硕大如猫的老鼠正朝他嘶吼着,要发动攻击。

“怎么样?这些小可爱不错吧?”,皮特问道。

“呃~”,杨成一个踉跄,勉强扶住,险些丧失站立的勇气。

“阁下的口味果然非同一般”,杨成强忍住内心强烈的反胃。

“这些是狄瑞吉大人的精锐部队”,皮特解释道。

“冒险家,我要你帮我找出,有多少老鼠是没有五感的”。

“没有五感的老鼠不会被我的笛声所命令,是不合格的”。

皮特将左手握着的短笛在空中划了一个魔力漩涡,那漩涡四处扩散,最后变成了一面悬浮的明镜。

镜面银光一闪,出现了一段字符串。

“大写字母p代表我皮特”。

“o~”

“这代表朝向左边的一只老鼠”。

“~o”

“这代表朝向右边的一只老鼠”。

“正常情况下,不管我出现在任何地方,正常的老鼠都会朝向我,听我指挥”。

“像这样:”

“~o~o~o~opo~o~o~”

“左边有4只老鼠朝向我,右边有3只老鼠朝向我,这就是正常的”。

“而像这样:”

“po~o~~oo~”

“很明显,我右侧有3只老鼠朝向我,还有只不正常的是背对我”。

“好了,冒险家,你来帮我找出这些不合格的老鼠”。

杨成心想,我这不是助纣为虐嘛!

“如果做不到,那我就让你尝尝百鼠啃噬之苦!”,皮特恶狠狠地说道。

“ok”

第八十九章 迷乱之村(下)

这是一个字符串的匹配问题。

因为环境限制在平面直线上,所以老鼠们的朝向只有左右之分。

以下面的例子来说:

“~o~o~o~op~o~oo~”

我们先定位皮特的位置,也就是大写字母p的方位。

可以看出,皮特左边的老鼠,如果是正常的,都会朝右。

而皮特右边的老鼠,正常情况,都会朝左。

那么,其他情况下的老鼠,就是不正常的,即没有五感的。

具体实现怎么做呢?

提取大写字母p左右两侧的字符串,分别执行算法:

从左到右遍历字符串,每次截取2个字符进行匹配(一个老鼠占2个字符),遇到不正常的老鼠,就加入统计。

这个算法假定字符串中只有3种字符(p,o和~),没有其他的字符来干扰,所以是相对简单的。

杨成忙活了一会儿,就写好了代码。

“我已经帮你算出来了”,杨成言下之意是可以放人了吧。

“哈哈!”,皮特放肆地大笑起来。

“冒险家,感谢你帮我强化了手下,狄瑞吉大人一定会很高兴”。

“不过,你既然来了,就永远地留在这里吧!”

皮特面露狰狞,缓缓地抬起短笛,对准了杨成。

“你!”,杨成顿时又惊又怒。

眼看短笛中即将发射死亡射线。

“吱吱!”,老鼠群里突然一阵骚乱,吸引了皮特的注意。

“就让你们见识下我的幻影剑舞吧!”,一个浑厚的声音犹如霹雳,打破了哈穆林的死寂。

就只见那银白色的剑气,近乎实质地凝结成剑罡,潮水般涌向老鼠们。

老鼠们则在这浩然剑气中崩溃瓦解,四散而逃。

紧接着,那人一声暴喝。

“射人先射马,擒敌先擒王!”

“猛龙断空斩!”

短短地蓄气数息,一道身影以奔雷之势,在空中重叠出多个身影,径直朝皮特席卷而来。

皮特还没来得及出招,就被一道光柱扫到,洞穿了心脏。

整个身体就犹如秋天的叶子一般,黯然飘落。

皮特倒在地上,脸上满是难以置信。

“传传奇剑圣阿甘左”

“差距太大了”,皮特说完就闭上了眼睛。

“阿甘左”,杨成看着那剑客的背影。

“狄瑞吉,终有一天,我要将你彻底消灭!”

阿甘左并没有停留片刻,而是默默地走向远方。

就在杨成心有余悸的时候,系统音响了起来。

“叮!当前积分202分,击败了全球48%的玩家,请您再接再厉!”

第九十章 市场花园行动(上)

1944年秋,在英军蒙哥马利将军的策划下,盟军开展了争夺莱茵河地区的“市场花园”行动。

数百米的高空,密密麻麻的飞机犹如蝗虫过境,大量运输机在战机的掩护下,抵达战区。

其中一架大型运输机上,一位指挥官正对着他的手下们做战前鼓舞。

“第一空降师的弟兄们,咋们部队,就如同一把尖刀利刃,深深插进了德国佬的屁股!”

“只要能稳扎下来,一旦和地面部队会合了,咋们就能打进德国本土,在圣诞节前结束战斗!”

“上帝保佑大英帝国,到时候女王陛下一定会在白金汉宫宴请咋们吃火鸡大餐!”

一听这话,空降师的战士们各个摩拳擦掌,群情激昂,恨不得立刻去上阵杀敌。

只有一个人除外。

杨成坐在一个角落里,看着窗外的天空,一阵头晕目眩。

作为一名“恐高症”患者,他觉得自己选这个关卡真是个错误。

整个“市场花园”行动分为空降和地面推进两部分,为毛自己偏偏成了空降部队?

待会,要在3,4百米的高空执行跳伞任务,这绝对是杨成人生中最惊险刺激的一次旅行,没有之一!

“好了,勇士们,最后一次检查降落伞包,确保万无一失”,指挥官认真叮嘱道。

接着,他打开了舱门,高空湍急的冷气流瞬间窜进了舱内。

一位伞兵率先走到门口,他深吸一口气,然后就这么跳下去了。

短短一秒钟,他的降落伞如期绽开,就像教科书般规范。

一个又一个伞兵,如同下饺子一样,跳下了运输机。

直到机舱内只剩下两个人,指挥官看着萎靡不振的杨成,挠了挠头,脸上很是无奈。

“阿历克斯少校”。

“上级委派给了你特殊任务,具体怎么做,你自己决定”。

第九十一章 市场花园行动(中)

“少校,别这么紧张”,指挥官看着杨成。

只见那杨成手拄着扶手,神色慌张地看着舱外的景色。

早知道应该把科勒文那小子给叫过来的!

杨成心里一阵懊恼,把“德州牛仔”当肉拐杖也是不错的选择。

短短的五六米距离,他花了整整五分钟。

指挥官拍了拍杨成的肩膀,扶他站稳。

“阿历克斯,打起精神来。”

“记住,你是一名军官,需要以身作则”。

“上级给你安排了很重要的任务”。

指挥官说着从口兜里掏出一份文件,递给杨成。

他的脸色变得严肃起来。

“阿历克斯少校,请你务必将机密文件交给第一空降师指挥部。”

“完成任务后,回到降落点,向我汇报师部的指示”。

“然后,向最近的团指挥部靠拢,参与作战”。

“地图如下:”

0:“师指挥部“

1:“道路“

2:“道路“

3:“团指挥部“

4:“道路“

5:“降落点1“

6:“降落点2“

7:“道路“

8:“团指挥部“

这地图就好比一条直尺一般,师指挥部位于最上端的0处,直尺长度为8个单位。

可以看出,英军第一空降师摆出的是一字长蛇阵,很容易被拦腰截断,分割包围。

当然,前提是德军做好了充足的准备。

“少校,你应该观察到了,地图上有多个适宜降落点”。

“你来选取一个完成任务所需路径最短的降落点”。

“我们不希望你有任何闪失”。

杨成一看这问题,悬着的心顿时安稳下来,情绪大振。

对于程序员而言,没有比解决问题更能集中注意力的事情了。

-------------------

上面给出的是个例,大家可以考虑各种情况的通用解法哈!

师指挥部只有一个,团指挥部可以多个,可选降落点多个,所处位置都随机。

第九十二章 市场花园行动(下)

根据任务提示,路程由2段组成:

1降落点到师指挥部的距离,乘以2(一去一回)。

2降落点到最近团指挥部的距离。

现在地图上有2个适宜降落点,分别来看它们需要的路程。

降落点1:5x22=12

降落点2:6x22=14

所以,应该选择需要路程更少的降落点1。

“长官,就降落点1吧”,杨成从沉思中回过神来。

“很不错,阿历克斯”,指挥官竖起大拇指。

“少校,接下来轮到你用行动来证明了”,指挥官示意机舱外。

杨成的脸刷的一下变得惨白,就跟霜打的茄子一般。

“好吧”,他步履蹒跚地向舱外走过去,每一步仿佛有千斤重。

杨成低垂着头,感觉自己就像正走向深渊的勇士,悲壮而凄凉。

“放松”

“放松”

指挥官在鼓舞着他。

就在杨成距离舱外只有一步之遥,犹豫着要不要转过身子,退回去的时候。

只见那指挥官,上前一步。

“啪!”,指挥官的腿犹如闪电般出击,把那杨成给蹬出了舱外。

杨成惊恐而无助地看着下方的地面,心中有一万匹羊驼飞驰而过。

这老姜!

不过来不及了,必须作出反应。

300多米的空中,只需要几秒就可以让人变成肉饼!

杨成一个激灵,按下按钮。

“唰!”,降落伞及时地被打开,稳稳地承住了杨成。

“该死的!”,杨成紧紧地闭住双眼,只听见耳畔呼呼的风声。

“快给我来一片速效救心丸!”

第九十三章 恩尼格玛机(上)

一颗百年老树上,传来不同寻常的声音。

“咳咳”,这咳嗽声有些微弱。

杨成成功地降落了,唯一的问题是降落伞被树枝挂住了。

“哥这下可算是自挂东南枝了~”,他自嘲道。

杨成解开身上的降落伞包,跌落在地面上,扬起一片尘土。

“幸好文件没有丢”,他摸了摸口兜。

接着,他赶紧前往师指挥部,前方战事紧急,可容不得半点疏忽。

英军第一伞兵师指挥部。

“我军在前往阿纳姆的路上遭遇了敌军的强烈阻击”。

“还有来自多个方向的敌军在向我们靠拢”。

“再这么下去,我们将陷入包围!”

师长乌奎特少将正在听取报告。

“30军离我们还有多远?”,乌奎特忧心忡忡地问道。

“还有数百公里,我们无法支撑到他们赶过来了,将军,最好还是趁早突围吧!”

“战争的天平已经向德军倾斜了”。

乌奎特颓然地倒在椅子上,难以置信地看着地图。

谁也没料到,在盟军预定着陆的地区,德军已经部署了党卫军第2装甲军的两个装甲师和空降第1集团军的部分部队。

缺少重型装备的盟军空降兵在德国装甲兵头上空降。

这就是一场大屠杀!

乌奎特用手扶着额头,头一次感到了绝望。

现在唯一的好消息是:他们缴获了一台最新款的“恩尼格玛机”。

尽管已经被人为破坏了,但他们最优秀的工程师正朝这个方向疾驰而来。

第九十四章 恩尼格玛机(中)

在德语中,enigma译为“谜”。

恩尼格玛机是一种用于加密与解密文件的密码机。

纵观整个二战,盟军对德胜利,只因为盟军破译了德国的密码而提前了两年,这种说法至今被人们津津乐道。

其中,最经典的例子,就是对“谜”机的密码破译。

现在摆在杨成面前的这台机器,是德国晚期生产的“谜”机改进型。

它大体上由三部分组成:

1线路连接板(plugboard)

2机器转子(rotor)

3反射器(reflector)

“少校,我知道你一路马不停蹄地赶过来,十分辛苦”,乌奎特将军拍了拍杨成的肩膀,脸上终于流露出一丝微笑。

“但我军面临被包围的危险,箭在弦上,不得不发啊!”

“将军”,杨成从口兜里掏出指挥官交给他的文件。

“不不”,乌奎特摆摆手,指了指杨成。

“您的意思是?”,杨成挠了挠头。

过了片刻,他才恍然大悟。

“这份文件,难道说”

“就是这台恩尼格玛机的密钥对照本?!”

乌奎特点点头,脸上的笑容更浓烈了。

“原来如此”,杨成算是彻底明白了。

“少校,如果你能在短时间内,修好这台机器,那就是大功一件”,乌奎特眼中光芒一闪。

“那样,就算我们英军第一师拼完了,也是值得的!”

“将军”,杨成凝重地看着这台机器。

“我需要时间,还有一个安静的环境”。

“没问题”,乌奎特大手一招。

“所有闲杂人员离开指挥部,出去担任警戒!”

第九十五章 恩尼格玛机(下)

诺大的指挥所里很快只剩下寥寥几人。

杨成把注意力集中在了恩尼格玛机的线路连接板上。

系统刚才给出了提示:需要对线路连接板进行逻辑修复。

具体是怎样的逻辑呢?

连接板上有代表26个拉丁字母的插孔。

如果我用一根线连接a孔和b孔,那么一个”a”输入将得到一个”b”输出,反之一个”b”输入将得到一个”a”输出。

换句话说,只要a和b之间有连线,输入其中一个,就能得到另一个。

我们用字符串”ab”表示a和b之间有连线。

a=b

那么,“abcd“就表示a和b,c和d之间有连线。

a=b

c=d

这个问题的关键在于解析代表连线关系的字符串。

来一个复杂的例子:

“abcdefghijklmnopqrst“

它表示了10组连线,怎么解析呢?

从左到右,每次读取2个字母,算作一组连线,建立这2个字母的映射关系。

这样就能得到:

a=b

c=d

e=f

一共是10对映射关系。

这样,就完成了对线路连接板的逻辑修复。

杨成庆幸地拍了拍胸膛。

幸好这德国佬走的匆忙,破坏的是线路连接板,要是把机器转子给搞坏了,那麻烦可就大多了!

“阿历克斯,怎么样了?”,乌奎特将军凑了过来。

“搞定了!”

“哈哈!”,乌奎特放声大笑,喜悦之情溢于言表。

“这次行动,我们没有捅进德国佬的屁股”。

“但是,却暴露了他们的心脏”。

“叮!当前积分210分,击败了全球49%的玩家,请您再接再厉!”

第九十六章 慢跑(上)

“这次空降任务真是太可怕了,我终于能理解战争的残酷”,杨成甚至有想法出一部关于二战回忆录的小说。

“系统妹子,我需要一个能放松心情的关卡,抚平我内心的伤痕”。

“可以办到嘛?”

“嗯”,系统很肯定地说道。

“在金秋岁月的早晨,来一次慢跑吧!”

很快,和煦的阳光照耀在身上,微风拂面,让人很想懒懒地躺在椅子上,翻翻书,再来一杯温醇的咖啡。

杨成眯着眼睛,细心感受着阳光和风温柔的抚摸。

他眼前,左侧和右侧各出现了一亩荷塘,波光粼粼的水面传来蛙鸣。

要是有朋友,一起来此,一边畅谈,一边漫步,该多好!

“阿历克斯”,一个男声从杨成背后传来。

杨成转过头,发现“德州牛仔”科勒文,交叉着手臂,脸上带着暖暖的笑容。

“牛仔,好久不见!”,杨成打着招呼,有些惊喜。

“崭新的一天开始了,伙计,不打算来一次慢跑吗?”,科勒文捋起袖子。

“正有此意”,杨成舒展了一下筋骨。

“这里有2个荷塘,咋们一人围着一个跑,怎么样?”,科勒文发起倡议。

“来!”,杨成选择左边的荷塘,率先跑了起来。

科勒文则是选择了右边的荷塘,他那矫健的身影就如同一头猎豹。

杨成一边跑着,一边仰望天空,俯看荷塘美景,远眺群山,把周边的一切,尽收眼底。

他发现,天空多么蔚蓝,群山多么辽远,荷塘多么美。

清新的空气,灿烂的阳光,瞬间点燃了他心中的激情,不经意间加快了脚步。

眼前的景色,让他沉醉其间,内心的阴霾被慢慢驱除。

“大自然真是上天给我们的馈赠!”,杨成不禁感叹道。

第九十七章 慢跑(中)

跑了几圈后,杨成累得气喘吁吁,就差一屁股坐到地上了。

他站在出发点,上气不接下气。

不远处,科勒文也不急不慢地跑完一圈,走过来。

“挺累的吧”,科勒文两手叉腰,一点也不显疲态。

接着,他变戏法似地拿出2瓶矿泉水,递了一瓶给杨成。

“哥们,你的身体素质真是棒棒哒”,杨成有些羡慕。

他拧开矿泉水瓶盖,开始了畅饮。

“咕噜噜”,清冽的甘泉真是能缓解疲劳,杨成顿时喜欢上了这种大汗淋漓之后冰爽的感觉,透心凉。

“阿历克斯”,科勒文没有喝水,而是拿出一块湿巾,擦了擦额头上的汗珠。

“刚才我们慢跑的过程中,我突然想到了一个问题”。

“嗯?”,杨成顿时有些好奇,这货的奇思妙想还是很丰富的。

“假设你跑的左侧荷塘周长是4里路”。

“而我跑的右侧荷塘周长是6里路”。

“我们在出发点同时出发,每跑完一圈都会回到出发点”。

“假定我们的慢跑速度都是一样的”,科勒文流露出微笑。

“那么,我们各跑几圈的时候,会在出发点再次相遇呢?”

“有意思的问题”,杨成喝干了最后一滴水。

他开始了思索。

假如,他本人跑完了一圈4里路,而科勒文这时一圈还没跑完,还差6-4=2里路。

而当他跑完了两圈8里路,而科勒文跑完了一圈,第二圈跑了8-6=2里路。

当他跑了三圈12里路,科勒文则正好跑了两圈。

此时,两人会在出发点再次相遇!

也就是说,答案是:杨成3圈,科勒文2圈。

那么,其中蕴含的数学道理是怎样的呢?

第九十八章 慢跑(下)

先来看路程,也就是12里。

再看看左侧荷塘的周长,4里。

右侧荷塘周长,6里。

你是否会立即萌生出一种大胆的猜测?

12就是4和6的最小公倍数,这是偶然的嘛?

没错!必须坚定自己的想法!

假设左侧荷塘周长为x,右侧荷塘周长为y,问两人各跑多少圈后在出发点再次相遇。

这个问题,第一步就是求x,y的最小公倍数所代表的路程。

这个路程必须能同时被x,y整除,这样两个人才会在出发点相遇。

同时,必须是“最小”公倍数,才是再次(第二次)相遇。

那怎么求两个数的最小公倍数呢?

一种很简单的做法,是先求这两个数的最大公约数。

求最大公约数,常用的做法是使用欧几里德算法,或者说是辗转相除法。

得到了x,y的最大公约数,那么最小公倍数就是一句话:

x乘以y除以x,y的最大公约数。

好,既然求出了x,y的最小公倍数(路程),那么再求两人各自跑的圈数,不是很容易的事情了吗?

12除以4,得到3(圈)。

12除以6,得到2(圈)。

这就是答案的由来。

“科兄”,杨成眼中闪过一丝奇异的光芒。

“你的每次奇思妙想都会引发我无尽的思索”。

“真心地感谢你”。

“哈哈!”,牛仔爽朗地一笑。

“杨,如果没有你思想的火花,我不过是庸人自扰罢了”。

“走,咋们去看看更遥远的地方”。

“好!”,杨成顿时打起了精神。

“叮!当前积分212分,击败了全球49%的玩家,请您再接再厉!”

第九十九章 智能公交

“在代码战争,一些较新的理念会被运用到生活中”。

一个小型会议室里,一位中年男子,戴着金边眼镜,看样子像是项目经理。

他手指着墙壁上投影出的ppt影像。

影像上是一台看起来十分崭新的公交大巴。

“这种大巴已经初步实现无人驾驶,刷脸售票,但有一些细节问题。”

“比如说,到站提醒服务,这个问题的处理一直存在争议”,项目经理扶了扶眼镜。

“杨工,我想听听你的意见”。

“嗯”,坐在台下的杨成站起来,点点头。

“早些年,传统公交车上采取了报站的服务,但是效果并不好”。

“最近,有人提出了另一种更智能的方案:”

“当乘客在公交上选好了座位,他们可以告知软件,在哪个站下车。”

“当公交到达某站,那些选了这个站点的乘客,将会被座位后面的震动引擎及时地通知。”

“如果能结合报站服务,想必效果会更好”,杨成说出自己的看法。

“不错”,项目经理拍了拍手。

“那么,如果要你来实现一个这样的功能,你会如何来考虑呢?”

杨成思考了数秒。

“这个业务由三部分组成:”

“首先,当乘客上车,选好座位,对软件下达指令,根据自己的到站,注册事件”。

“然后,车子到达了目的站,所有注册了该站事件的座位,运行事件处理程序,引起震动,提醒乘客下车”。

“最后,当乘客下车后,对该站的所有事件进行注销”。

“这总的来说,就是一个观察者模式或者说自定义事件模型”。

“很好”,项目经理竖起大拇指。

“设计模式的练习,不是一朝一夕之功。”

“希望你能继续努力!”

第一百章 总统先生(上)

“系统妹子,能让我和世界上最有权势的人来一次会晤吗?”

“有这样的关卡吗?”

“有的”。

诺大的长廊,这里三步一岗,五步一哨,可谓是一只苍蝇都混不进去。

墙壁上挂满了历任先贤的肖像与名言警句,可来往的人们行色匆匆,并没有心思来观赏。

“阿历克斯”,国家安全事务助理好心地提醒道。

“总统遇到了点麻烦,你待会一定要冷静”。

杨成理了理领带,心中多少有些忐忑,听她这么一说,顿时心跳加快,血压升高。

“这只是在游戏里面,用不着紧张”,杨成给自己打气。

他深吸一口气,走过了长廊。

椭圆形办公室里,总统先生正在享用早餐。

他只吃了点蔬菜沙拉,大块三明治被搁置在了一旁。

很显然,有事情影响到了他的胃口。

就在这时,办公室的大门“嘎吱”一声被推开了。

杨成走了进来。

总统一看这年轻人,脸色顿时缓和了几分,皱纹也随之舒展了开来。

“阿历克斯,你来得正好”。

“你瞧瞧那些饭桶给我配的啥子破手机”。

“只有e,f,i,r,u,y六个字母可以摁出来”。

“害得我都没法子发推特!”

总统两手一摊,显得十分失望。

“有什么能为您效劳的?”,杨成毕恭毕敬地站在一旁。

“阿历克斯,你懂我的意思?”,总统指了指手机上的某个软件图标。

“照这上面的内容来办就行了!”

第一百零一章 总统先生(下)

从总统办公室出来时,安全事务助理已经在门外候着了。

“怎么样?总统有何指示?”

“女士,总统手机坏了,他要我们关注他的推特”,杨成耸耸肩。

“用我的手机”,助理把杨成拉到一旁。

只见那小巧玲珑的女式手机屏幕闪出一个图标,助理点开图标。

一个列表很快出现了,排在首位的赫然是总统刚才发的推特。

内容如下:

“furyyyfireyyfire”。

这是什么鬼?

杨成顿时摸不着头脑。

过了半晌,他才回过神来。

总统不是说过他的手机只能按出6个字母来嘛!

所以这段推特既没有空格,也没有标点符号和其他英文字母。

“阿历克斯”,助理将手机递给杨成。

“你能帮我们破解总统想要传达的讯息吗?”

“我~尽力而为吧”,杨成仔细地端详这段推特。

因为总统能利用的只有6个字母,所以他要拼出一段完整的句子,是很困难的。

他更可能的是,拼出几个单词,辅助几个字母来表达意思。

所以第一步,是得分析出这段内容中的单词。

经过几分钟的观察,杨成在推特内容中发现了几个英文单词。

1“fury”,狂怒,暴怒的意思。

2“fire”,火焰,怒火的意思。

光凭这2点,可以判断出总统的心情是很愤怒的。

但是他要采取怎样的措施来平息怒火呢?

这一点还不得而知。

于是,杨成问助理。

“总统平时有些什么口头禅吗?”

助理想了想,顿时脸一红。

“你被解雇了!”

“哈哈”,杨成笑了笑。

“总统还真是性情中人啊~”

这不就很明显了嘛!

“fire”的过去式就是“fired”,在口语中常用作解雇的意思。

文中出现了2个“fire”,用于加重语气。

这段推特的意思就是:

哥现在很愤怒,你们被解雇了,全给我滚蛋吧!

“女士”,杨成把手机还给助理。

“准备交接工作吧”。

第一百零二章 地理哈希(上)

“且慢”,总统从办公室走出来。

“我刚收到警卫队的通知,有一大群人正朝我们这边游行过来”。

“大家做好准备,如果是国会那帮子人组织的,我要给他们当头棒喝”。

“阿历克斯,你过去看看,到底是个什么情况”。

诺大的广场,集会的人群把这里围了个水泄不通。

警卫队员们则是组成了一道道人墙,阻止人们再前进一步。

“你们都疯了吗?”,警卫队员朝他们喊话。

“前面是总统办公的大楼,是禁区!”

然而,这并没有起到什么作用。

游行的人们挥舞着一面面彩旗,上面无一例外地印着“geohashing”字样。

他们兴奋而狂热地向前冲击着,人墙被逼得步步后退。

“发生了什么事?”,杨成这时走过来。

警卫队长告诉他。

“这是geohashing俱乐部的人,他们全都是一群疯子!”

“啥?”,杨成一听顿时摸不着头脑。

警卫队长把杨成拉到一旁。

“geohashing是一种计算机算法,它用于生成随机坐标”。

“它每天生成的坐标都是不一样的”。

“这玩意儿根据当前日期以及当日的道琼斯工业指数来生成”。

“而俱乐部的人,就每天到这个坐标来集会,找找乐子”。

“谁知道,鬼使神差地,今天的坐标位于总统办公大楼!”

“这下子就有麻烦了!”

杨成顿时来了兴趣。

“你能不能谈谈geohashing算法的具体原理?”

警卫队长理了理领带。

“也罢,我们反正阻止不了他们的,那就聊聊吧!”

第一百零三章 地理哈希(下)

“年轻人,你可别小瞅了俺”,警卫队长笑着说。

“俺干这行之前可是念过哈佛的”

“厉厉害,还望您多指点指点”,杨成只好说道。

“geohashing算法的输入由两部分组成”,警卫队长开讲了。

“第一部分是当前的日期,比如说2005-05-26”。

“第二部分是当天的道琼斯工业指数,比如说是1045868点”。

“那么,首先第一步,我把这两部分拼接起来,就得到:”

“2005-05-26-1045868”

“紧接着,使用md5(哈希类加密)算法处理这个字符串,以16进制形式输出,得到:”

“db9318c2259923d08b672cb305440f97”

“这是一个32字符的哈希值”。

“我把它分割成前后2段,每一段拥有16个字符”。

db9318c2259923d0

8b672cb305440f97

“给这2段分别加上0和小数点:”

9318c2259923d0

08b672cb305440f97

“然后,将它们看作16进制的小数,转换为10进制,舍入到小数点后6位:”

0857713

0544544

“最后一步,选择当前的位置坐标,比方说是(37,-122)”。

“和上面2段作拼接,得到随机坐标:”

(37857713,-122544544)

“这就是全部的过程”,警卫队长眨了眨眼。

“有意思的算法”,杨成拍拍队长的肩膀,表示感谢。

“不过”,杨成欲言又止。

“阁下可能有大麻烦了”。

“什么?”,警卫队长没听懂。

“在刚才过去的二十分钟,至少有一个连的俱乐部成员登上了总统办公大楼的顶端”

“”,警卫队长转过身子一看。

geohashing旗帜高高飘扬。

第一百零四章 握手问题(上)

“哥的职业生涯完了”

看着总统办公大楼上插满了旗帜,警卫队长颓然地说道。

“走,咋们去见总统,看他有什么安排吧”。

杨成心里也是很忐忑。

不会被排队枪毙吧?

十分钟后,同病相怜的两个人再次回到了总统办公室前的长廊。

这里人来人往,geohashing俱乐部成员占领了这里。

和预想中的暴跳如雷不同,总统在他的办公室里,正跟俱乐部的成员一一握手合影。

他的表情憨态可掬,就如同一位慈祥的长者。

“好了,小伙子们,我这把老骨头可累死了,今天就先到这里吧!”

总统送走最后一批俱乐部成员,拉上办公室的大门,此时办公室里只剩三个人。

总统坐在皮沙发上,以手扶额。

“阿历克斯,帮我2个忙”。

“请吩咐”,杨成赶紧上前一步。

“次要的事,帮我把这位警卫队长带过去计算工资,让他拿了钱赶紧走人!”

“好的”,杨成同情地看了眼警卫队长。

如果不是为了帮他解决问题,这位队长不至于被解雇。

“重要的事”,总统眼中闪过一道锋芒。

“刚刚那些家伙握手合影,帮我统计下,一共有多少次握手”。

“我知道他们任意2个人最多握了一次手”。

“也就是说,有的人之间没有握过手”。

“根据这个握手次数,你算一算,至少有多少人参与了握手”。

总统说着站起来,面带怒容,就如同一头暴怒的雄狮。

“我一定要取缔这个俱乐部!”

第一百零五章 握手问题(下)

“请您稍安勿躁”,杨成仔仔细细地翻阅总统刚才的握手合照。

他很快得出了握手的总次数——一共是35次握手。

那么,怎么根据这个握手次数,计算出参与的最少人数呢?

杨成细细地一回顾总统说的话。

总统有提到,在场的任意2个人,最多握了一次手。

正常情况下,如果要构成一次不重复的握手(相同的两个人握手算作重复),需要2个人。

3个人可以提供3次不重复的握手。

4个人可以提供6次不重复的握手。

n个人可以提供n乘以(n-1)除以2次不重复的握手。

这是怎么来的呢?

1每个人都可以和除自己以外的人握手,所以有n乘以(n-1)。

2之所以要除以2,是因为要去掉重复的,你和我握手跟我和你握手不是一样的嘛。

有了上面的公式,我们可以推算出:

8个人可以提供28次不重复的握手。

9个人可以提供36次不重复的握手。

而35这个数字正好大于28,小于36。

所以8个人参与握手是不够的,不足以提供35次握手。

答案是:至少有9个人参与了握手。

“总统,有9个人”,杨成报出了答案。

“小伙子,干得不错!”,总统拍了拍杨成的肩膀。

“我得让这帮子不知天高地厚的俱乐部人尝尝苦头!”

“阿历克斯,我没办法给你更多奖励”。

“但我可以给你一些积分”。

“叮!当前积分222分,击败了全球50%的玩家,请您再接再厉!”

第一百零六章 莫斯科的陌生人(上)

莫斯科的车站迎来一场淅淅沥沥的小雨。

空气中弥漫着阴冷的气息。

过往的旅客行色匆匆,任由雨水沾湿他们的衣物。

车站的安检口,人们排成长队,接受检查。

就在这长龙中,一个毫不起眼的中年男子,穿着黑色风衣,手里提着一个同样黑色的公文包。

他的手微微颤抖着,似乎是因为寒冷的缘故。

队伍前行得很快,轮到中年男子进行安检了。

工作人员提醒他,将公文包放到安检机上,然后配合随身检查。

中年男子没有抗拒,很配合地举起双手。

他的公文包顺利地通过了检测。

“感谢您的配合”,工作人员没有发现异常,正准备放行。

然后,两眼不经意间对视。

中年男子瞳孔猛然放大,他的眼神中透露出一丝不同寻常的讯息。

“请您稍等”,工作人员内心升起一种警觉感。

工作人员拿起公文包,仔细端详起来。

它的外表和普通公文包并没有异样。

能够通过安检机,说明里面并没有危险物品。

工作人员打开公文包。

里面并没有装载像文件这样的寻常东西,而是一张张小纸条。

“马上联系联邦安全局!”

一个小时后,中年男子被蒙着头罩带走了。

漆黑的审讯室里,昏暗不见天日。

中年男子被绑在座椅上。

一个严厉的声音传来。

“你是谁?”

“不知道”,中年男子有气无力地说道。

“谁派你来的?”

“不知道”

“你来有何目的?”

“刺杀一个人”。

“刺杀谁?”

“不知道”

“马上叫人破译那些小纸条!”,声音戛然而止。

第一百零七章 莫斯科的陌生人(中)

“阿历克斯少校,你又有新任务了”。

话音刚落,一叠小纸条被甩到了杨成的办公桌上。

“让我看看”,杨成拿起小纸条,一张一张地翻阅。

每个小纸条上都写着3个大写字母,总共有五张。

换句话说,这次任务得根据这15个字母,分析出结果来。

刚才的审讯中,嫌犯透露出一个重要的线索,他的目的是要刺杀一个人。

因此,这些小纸条很有可能记载的是一个人名或者地址。

暂时看来,这都不重要,关键在于纸条内容。

“那咋们先来看看”,杨成说着把5张纸条整整齐齐地摆放成5行。

[“n“,“c“,“l“]

[“i“,“o“,“a“]

[“c“,“o“,“s“]

[“i“,“c“,“o“]

[“o“,“l“,“s“]

乍看之下,可以发现,有些字母在不同纸条中重复出现。

但是,在同一纸条中却没有发现重复的字母。

这意味着什么?

有一种可能,我们可以通过这5个三元组,恢复出一个完整的字符串!

顺着这种思路,杨成顿时脑洞大开。

通常对于一个完整的字符串,有很多子字符串和子序列。

子字符串和子序列的区别是什么?

子序列中的字符在原字符串中不一定是连续的,而子字符串一定是连续的。

比方说,”abc”字符串,”ac”是它的子序列,而不是它的子字符串,因为字符a和c之间还隔着b呢,它是不连续的。

再结合之前的分析。

换句话说,这很有可能是一个已知多个子序列,来恢复原来字符串的问题!

“搜噶”,想到这里,杨成顿时很兴奋。

他的求知欲得到了很大的满足。

那么接下来该采用怎样的方法来实现呢?

第一百零八章 莫斯科的陌生人(下)

字符串中的第一个字符,如果它出现在子序列中,那么它肯定是位于第一位置的,而不可能是第二,第三。

比如“abc”的第一个字符“a”,它在子序列“ac”中,就是处于第一位。

这个问题的关键在于,找出子序列中,始终出现在第一位的字符,它就是原字符串的第一个字符。

[“n“,“c“,“l“]

[“i“,“o“,“a“]

[“c“,“o“,“s“]

[“i“,“c“,“o“]

[“o“,“l“,“s“]

这五个子序列,满足这个条件的第一个字符是“n”,所以它就是原字符串的第一个字符。

然后,去掉“n”在子序列中的所有存在,继续找始终出现在第一位的字符。

[“c“,“l“]

[“i“,“o“,“a“]

[“c“,“o“,“s“]

[“i“,“c“,“o“]

[“o“,“l“,“s“]

可以发现“i”满足条件,而“c”不满足,因为它在第四个子序列中,出现在了第二的位置。

去掉“i”在子序列中的所有存在,继续查找。

[“c“,“l“]

[“o“,“a“]

[“c“,“o“,“s“]

[“c“,“o“]

[“o“,“l“,“s“]

“c”满足条件,去掉存在,继续查找。

[“l“]

[“o“,“a“]

[“o“,“s“]

[“o“]

[“o“,“l“,“s“]

“o”满足条件,去掉存在,继续查找。

[“l“]

[“a“]

[“s“]

[]

[“l“,“s“]

“l”满足条件,去掉存在,继续查找。

[]

[“a“]

[“s“]

[]

[“s“]

“a”满足条件,去掉存在,继续查找。

[]

[]

[“s“]

[]

[“s“]

“s”满足条件,去掉存在。

[]

[]

[]

[]

[]

此时,所有子序列均为空,查找结束。

然后,将这些满足条件的所有字符,依次缀连在一起,就能获得重要线索。

“nicolas(尼古拉斯)”。

“就是你了!”

杨成得出了结论,并没有停止思索。

他发现这个算法有一个前提,那就是,原字符串要求没有重复的字母出现。

如果有重复的字母,那这个算法就会失效。

换句话说,这个前提降低了问题的难度。

另外,给定的子序列是充足的,足以构成一个完整的字符串,这也是能够解题的关键。

第一百零九章 方差

“成成”,系统的声音飘然而至。

“有需要你帮忙的地方啦”。

“我们项目组有一些简单的数学方法,需要人来设计实现”。

“不知道你是否有空呢?”

“木有问题”,杨成很爽快地答应了。

系统接着说道。

“第一个方法是:求方差”。

“方差通常用于统计学和概率论中。”

“如果是你,会怎样设计这个方法呢?”

杨成摸了摸下巴,开始回忆初中学过的方差这个概念。

求方差的第一步往往是先数字序列的平均数。

“先预置一个求平均数的方法,这个方法接收一个数字序列”。

“而求平均数的方法可以抽出一个对数字序列求和的方法”。

“先数字序列求和,用总和除以数字序列长度,就可以得到平均数”。

“然后,预置求方差的方法”。

“用序列中的每一个数减去平均数,求出它们的平方和,最后再除以序列的长度,就可以得到方差”。

“这个过程并不复杂,但有一些问题值得考虑”。

“有时候,这个求方差结果它会是个很长的小数,我们不用求出这么多位,保留3,4位小数就可以了”。

“这个时候,根据需求,可以进行四舍五入或者截断操作”。

“总而言之,这个小功能由四个方法组成:”

“1数字数组求和方法”。

“2数字数组求平均数方法”。

“3数字数组求方差方法”。

“4对小数的舍入或截断方法”。

“嗯,考虑得很详细”,系统表示肯定。

第一百一十章 奇偶数

“那第一个问题就先到这里吧”。

“咋们来看看第二个方法”。

“如何判断一个整数是奇数还是偶数?”

杨成一拿到这个问题,很快就给出了答案。

“因为数学上是这样定义奇偶数的”。

“能够被2整除的整数是偶数,否则就是奇数”。

“所以,我拿这个整数,对2做取余运算”。

“余数如果为0,那就是能整除,可以判断是偶数”。

“余数如果为1,那就是不能整除,可以判断是奇数”。

话说到这儿,杨成突然感觉有些不妥。

但他又不明白到底哪里出了问题。

于是,他调出了编辑器面板,手写了几段代码,来验证内心的猜想。

1,3,5,7

这些奇数对2做取余运算,都是返回1,他刚才说的话似乎也没有错吧~

但杨成还是感觉,自己还没从盲区里走出来。

一定有自己没有考虑到的地方!

于是,他回忆整数的概念。

整数有奇偶之分,也有正负之分。

他刚才的自主测试,用到的全是正整数。

假如用负整数,会出现怎样的情况呢?

-1,-3,-5,-7

这些测试例子一用上,结果自然是让他大跌了眼镜。

无一例外,通通返回了-1!

也就是说,刚才他对于判断奇数的论断,只对了一半!

对于负整数的情况是不合适的。

杨成思索了片刻,觉得自己刚才过于草率了,才导致出现这样的错误。

他深吸了一口气,修改自己的观点。

“拿该整数对2做取余运算”。

“结果如果为0,那就是能整除,可以判断是偶数”。

“如果非0,那就是不能整除,可以判断是奇数”。

“哈哈,成成也有犯迷糊的时候啊”,系统打趣他。

第一百一一章 壮士(上)

“系统妹子,先打止吧,哥想去环游世界,调剂一下心情”。

“没问题,我给你准备一场说走就走的旅行,一定让你放松的同时,能学到些东西”。

一望无际的大海,这里是贴近赤道的太平洋海域。

在这距离海面数百米的高空,一个小小的黑点在视线中渐渐地放大。

这个黑点是一台属于科学考察队的热气球,上面载着九位数学家,还有一位特殊的乘客。

“诸位同仁,我们即将穿越赤道”,热气球上一位花白胡子的老教授用激动的语气说道。

“在这历史性的一刻,我有幸和你们分享喜悦”。

通过这几天的交流,杨成认识了九位数学家,其中老教授叫约翰,他渊博的学识给杨成带来了深刻的印象。

说着,约翰教授从背包里拿出了一瓶珍藏了很久的法国香槟。

“我这瓶老伙计就在这里开张吧!”

教授用大拇指和食指按住软木塞,将瓶身倾斜,然后用力地转动瓶身。

“嘭!”,一声巨响。

只见那软木塞犹如离弦之箭,瞬间向上击穿了热气球。

呼呼的风灌进来,热气球顿时一阵倾斜。

众人傻眼了。

约翰教授拿着冒出泡沫的香槟,呆若木鸡。

热气球内的氢气开始泄露,其本身更是开始缓缓下降。

看样子,用不了多久,热气球就会倾倒进海里。

这片海域传闻可是有饥饿的捕食者——大白鲨!

约翰教授不禁倒吸一口凉气,他当机立断地说道。

“不能再这么下去了,热气球必须开始减重!”

于是大伙纷纷把随身物品往下面扔。

可是这样似乎没什么显著的效果,热气球还是在逐渐下降。

大伙面色变得凝重起来。

“我们必须有人做出牺牲了,否则大伙都会玩完!”,有人提议道。

在这样的危急关头,似乎也只能这么做了。

“大家都是搞数学的,为了公平起见”。

约翰教授说着,拿出了10张白纸。

“这位壮士就由数学方法来选出吧!”

第一百一二章 壮士(中)

热气球继续下沉,决定人们命运的时刻来了。

“来来来,每人拿一张”,约翰教授分发白纸。

“大家在纸上写一个1-9之间的整数”。

“然后,计算这10张白纸上整数的乘积”。

“接着,计算这个乘积有多少个正整数因数,我暂且把它定为n”。

“最后,取n的最后一个数字,它肯定是0-9之间的一个整数”。

“这个范围0-9正好对应咋们10个人”。

“而壮士就是整数代表的那位”。

“这个方法怎么样?”,约翰教授扫视众人。

“没问题”,大伙纷纷附和。

在这样的形势下,这也是没有办法的办法了。

约翰教授很快在白纸上写下了一个“1”,他的序号是0。

另一位数学家汤姆写下了“2”,将白纸递给约翰,他的序号是1。

杰利教授写下了“6”,递上白纸,序号为2。

九位数学家很快写上了自己数字,只剩下犹豫不决的杨成。

“小伙子,时间不多了”,约翰教授提醒他。

杨成挠了挠脑袋,脸上带着愁苦的表情。

丫的,这里面到底是怎样的规律啊?

不过,好在他很快发现了一个规律。

大部分数学家写在白纸上的都是“1”,这莫非有什么蹊跷?

不管了!

杨成咬咬牙,也在白纸上写下个“1”,递给约翰,序号为9。

约翰教授收集好白纸,公布大家的提交:

{

john:1,

tom:2,

jerry:6,

mike:1,

lee:3,

richard:1,

peter:1,

jack:1,

robot:1,

alex:1

};

杨成看着自己英文名字的位置处在最末,内心顿时升起一种不好的预感。

“好,诸位同仁”,约翰教授清了清嗓子。

“在这危机的关头,咋们共同计算出这位舍己救人的壮士”。

“无须担心,你的妻儿我们会照看好的”

第一百一三章 壮士(下)

数学家们开始了计算。

“1x2x6x1x3x1x1x1x1x1”。

“乘积得36”。

“下一步,开始统计因数!”

“36有因数”

“1,2,3,4,6,9,12,18,36”

“一共是9个因数!”

“n为9,最后一位数字是它本身!”

“所以,序号为9的人alex是被选中的壮士!”,约翰教授宣布了最终的结果。

杨成听到这最终的审判,顿时面无人色。

“风萧萧兮太平洋,壮士一去兮不复返”

他全身颤抖着,一步一步地走到热气球边。

尽管已经经历过一次高空跳伞了,但再次尝试一遍这种极限运动,对他的心脏也是不小的负担。

更别提,下面还有大白鲨打算享用这顿美餐。

杨成闭上了双眼,万念俱灰。

然后,他纵身一跃,跳下了热气球。

“噗通~”,就如同一枚小小的石子,在大海里激起一点点涟漪。

杨成感觉那冰冷的海水瞬间将自己吞没,窒息感袭来。

他很快失去了知觉。

“警告!玩家生命值过低!”

“警告!玩家生命值过低!”

第一百一四章 自动导航(上)

就在杨成即将失去意识的前一刻。

一个透明的巨大气泡自动出现,将海水隔绝开来,笼罩他全身,保护他不受侵袭。

又过了一刻钟,杨成苍白的脸上终于有了血色,呼吸也均匀了起来。

他缓缓地睁开眼睛,扫视这海洋世界。

只见那调皮的游鱼,在气泡外面打着转转,好奇地看着这个人类。

“系统妹子”,杨成呼唤道。

“在的”,那甜甜的声音很快就出现了。

“接下来我该怎么做?”

现在身处这汪洋大海里面,要想找到陆地还真不是件容易的事儿。

“先别急,我来帮你确定安全陆地坐标”。

系统沉默了几秒钟,似乎在进行分析。

“离你现在最近的安全陆地位于坐标(8,64)”。

“你可以进行自动导航”。

“不过嘛”

“你得给导航系统编写指令”。

“什么?还得写代码?”,杨成端坐在气泡内,挠了挠头。

“不写也可以啊,嘻嘻~”,系统狡黠地一笑。

“那你就自己游过去呗!”

“”,杨成顿时一阵无语。

“好好好,我写!”

这还有的选择嘛!

“我们的自动导航系统提供了4个指令,每个指令都是1个字符的长度”。

“你仔细听好咯”。

第一百一五章 自动导航(下)

“你有一个初始化值可以利用,它最开始是0”。

在杨成眼前很快出现了一个3d成像的表格,上面记载了指令及其用法。

“i”——对初始化值进行1操作。

“d”——对初始化值进行-1操作。

“s”——将初始化值置为原值的平方。

“o”——将值输出到空坐标中。

“因为一个标准的坐标点包括横坐标及纵坐标,所以你需要使用2次o指令”,系统接着解说道。

“也就是说,看你用怎样的方法,得到坐标(8,64)”。

“行动吧,骚年!”

“唔”,杨成用手掌托了托下巴。

“最简单的方法”。

“连续8次i指令,得到8,输出”。

“接着连续56次i指令,得到64,输出”。

“不过~”,杨成摆了摆手。

“这样不符合我的一贯风格~”

“那就这样吧”,他思索了数秒。

“先连续3次i指令,得到3”。

“紧接着,执行一次s指令,3的平方是9”。

“然后,执行一次d指令,9减去1得到8”。

“o指令输出8,作为横坐标”。

“再执行一次s指令,8的平方得到64”。

“o指令输出64,作为纵坐标”。

“这样,整个指令顺序就是这样”。

“iiisdoso”。

“棒棒哒!”,得到了最终结果的系统显得很兴奋。

“那就开始系统定点传送吧!”

“导航系统已接受指令,确定方位”

“传送系统准备中”

“系统开始传送”

杨成眼前的海底世界顿时一黑,暂时失去了视野。

第一百一六章 海岛

场景迅速切换。

温暖的阳光播洒在脸上,海风轻拂,一望无际的沙滩,潮涨潮落,真是一道美丽的风景!

可是杨成左顾右盼,半个人影也没发现。

说好的海边度假村,穿比基尼的美女以及沙滩排球呢?

大约过了半晌,杨成才回过神来。

这丫的是一个荒岛啊!

杨成顿时有种被骗了的觉悟。

“系统妹子,你把我带到了什么鬼地方啊?”

“我早说了,只是保证安全,没说给你安排五星级服务啊”,系统也有些恼了。

“那再传送一次呗”,杨成不死心。

“传送系统冷却中,等cd吧”,系统丢下这句话。

“”,杨成举目四望。

大片大片的椰子树,还有

一间茅屋!

杨成心中燃起了一丝希望。

总算还有人能聊聊天,带着这样的想法,他朝着那茅屋走过去。

“嘿!有人嘛!”,杨成边走边喊。

“谁?!”,茅屋里探出一个黑乎乎的脑袋。

“我的上帝啊!”,茅屋主人看见迎面走过来的杨成,一声惊呼。

随即,茅屋里钻出一个黑人,身上穿着椰树叶织成的衣服。

此情此景让杨成想起了黑人牙膏,科比布莱恩特,巧克力等一大堆不相干的东西

“抱歉”,黑人挠了挠头。

“我的岛上很久没来过客人了”,他伸出一只手。

“你可以叫我鲍勃”。

“杨成,幸会,幸会!”,杨成上前几步,想要握手。

就在两人相隔不到几米的距离,突然发生了变故。

“唧唧!”,只听见一声怪叫。

一道不大不小的身影从旁边闪电般蹿出,挡在杨成面前。

第一百一七章 猴子

“唧唧!”

那身影迅速定格成了一只体型肥胖,龇牙咧嘴的猴子。

它用不怀好意的目光瞄着杨成,双爪比划着,尾巴高高翘起,似乎随时要发动攻击。

杨成不敢上前,只好僵持在原地。

“吉吉,别这样”,鲍勃摆了摆手。

那猴子这才转过身子,大摇大摆地爬上鲍勃的肩膀。

鲍勃轻轻地拍着猴子的后背,安抚它。

“吉吉很聪明,我是它的老师兼饲养员”。

“你是他老师?”,杨成顿时很好奇。

“嗯,我最近在教他数字方面的知识,现在在教0的识别”,鲍勃说道。

“怎么个教法?”,杨成越发地感兴趣起来。

“在吉吉的眼中,零是一个包含圆圈的字符”,鲍勃继续解说道。

“在它看来,小写字母a是零,因为它里面包含一个圆圈”。

“6也是零,一个圆圈”。

“8是零,两个圆圈”。

听到他这么一说,杨成顿时脑洞大开。

“那这些字符,不都是0麽,哈哈!”

“abdegopq0689bdopqr”。

“杨,你真棒!”,鲍勃竖起了大拇指。

“那百分号%也是0啊”,杨成继续发挥他的想象力。

“&(and)也是0”,他又举了几个例子。

“叼!”

“兄弟,你思维这么敏捷,能帮我解决一个问题麽?”,鲍勃提出请求。

第一百一八章 卖椰子

“唉呀”,鲍勃脸上流露出一丝苦涩。

“我这岛上土地贫瘠,啥都种不了”。

“前年倒腾了些黄瓜来种,亏得我是裤衩都输了~”

这就是你穿椰树叶衣服的原因?

杨成心里腹诽着。

我还以为你有暴露癖呢!

“去年一年,我向商人推销岛上的椰子特产”,鲍勃咂咂嘴。

“俺忒老实,还不知道被奸商们坑了多少钱”。

“成哥帮我看看,这是去年12个月份的椰子售价”,鲍勃掏出一张纸。

杨成接过,定睛一看。

[53,48,45,39,26,37,43,49,50,56,47,30]

“你帮我算算,这12个月最大的跌值是多少?”

“我好规避风险呐”,鲍勃饱含期待地看着杨成。

“待我三思”,杨成当然不会放过这个装x的机会。

他半眯着眼睛,一副沉思的模样。

杨成当然不会幼稚地认为,拿最高值减去最低值,就是最大跌值。

如果是那样,跌值就是56减去26,得到30。

所谓跌值,应该是历史上某个价格高位,和它之后的低价位,两者相减。

按照这样的概念,可以算出。

1月份椰子价格是53,作为价格高位,在它之后的价格最低位是5月份的26。

两者相减得到27,这就是跌值。

而且,不难验证,27是去年12个月的最大跌值。

“鲍勃兄”,杨成回过神来。

“结果是27”。

“太感谢你了”,鲍勃顿时兴高采烈。

“吉吉,去摘几个椰子!”

只见那猴子从他肩膀上跳下,一溜烟地跑开了。

第一百一九章 电话号码

五分钟后,杨成喝上了正宗的海岛椰子汁。

“嗝~”,他深吸一口那新鲜的浆液,顿时感觉神清气爽。

“唧唧”,猴子吉吉坐在杨成后面,帮他捶背挠痒。

温暖的海风吹拂着,此时天高云淡,杨成先前的郁闷被一扫而空。

远远望去,遍地是金黄的沙砾与土壤,还有那高大低垂的椰树。

此地虽然荒无人烟,却有一份安详与宁静,这不就很难得了么?

“杨兄”,鲍勃从茅屋里走出来,手里拿着一个小小的电话薄。

“我经常给客户们打电话”。

“但我这电话号码却记载得很潦草”。

“你能帮我格式化一下嘛?”

“没问题”,杨成放下手中的椰子,站起身子。

“电话号码都是10个数字,包括3位区号和7位号码”,鲍勃把电话簿递给杨成。

[1,2,3,4,5,6,7,8,9,0]

像这样的电话号码该怎么格式化呢?

先确定一个格式化模版,比如像这样:

(xxx)xxx-xxxx

然后,从左到右,依次遍历10个数字,替换x字符为当前的数字。

这样就能得到:

(123)456-7890

这就是格式化的结果。

杨成一运行代码,原本潦草的电话号码很快变得井然有序起来。

“可以啦”,他将电话簿交还给鲍勃。

“成成”,这时系统的声音冒了出来。

“可以再使用传送系统了!”

“那就开始传送吧”,杨成淡淡地说道。

他的身影渐渐变得模糊起来。

鲍勃肩膀上站着吉吉,一人一猴朝他挥手告别。

“再见,我的朋友”。

“唧唧”。

第一百二十章 随机数

“系统开始机选关卡”

只见虚空中一个巨大的骰子翻转了几圈,最终给出点数。

杨成只感觉眼前的视野由明转暗,又由暗转明。

海风依旧,阳光明媚。

熟悉的小茅屋前,黑人鲍勃和猴子吉吉呆立在原地,脸上满是难以置信。

“成哥,你怎么又回来了?”,鲍勃擦了擦自己的眼睛。

“呃”,杨成感觉有些尴尬。

“看来有点小问题”。

“系统随机传送!”,他再次发出指令。

虚空中的骰子犹如陀螺般飞转,再次给出点数。

场景切换。

“啪嗒”,鲍勃手里的电话簿掉落在地上。

“成哥,你是在逗咋们玩嘛~”

杨成顿时脸上挂不住了。

“系统随机传送!!”

“系统随机传送!!!”

一连四次,杨成都出现在原地。

“成哥,你还是别传送了,留下来陪吉吉吧”,鲍勃好心地劝告道。

“法克!”,杨成有些恼火了。

“系统妹子,发生什么事了。”

“为啥传送失败了?”

“成成,抱歉啊”,系统声音及时地出现了。

“我们系统使用的随机数算法貌似存在问题”。

“你来给我们看一看好嘛?”

“好的”,杨成恢复了镇定。

海岛的天空顿时浮现出一道七色彩虹。

那彩虹的下方悬挂着一张计算机屏幕,上面密密麻麻地排布着很多代码。

杨成伫立在原地,看着这些代码,陷入沉思。

鲍勃和吉吉,这一人一猴,则像看广场电影般,好奇地围观。

第一百二一章 友好型随机数

天幕上悬挂的显示屏一闪一闪。

杨成仔仔细细看了几遍代码,这才开口。

“你们游戏中使用的随机数算法存在问题”。

“它计算后得出的结果给人们的感觉,并不是随机的”。

“就好比你连续投掷4次硬币,连续4次出现正面或者反面的概率也是存在的”。

“通常情况下,这种算法用在抽奖或其他方面,是有效的”。

“但对于机选关卡这个业务,就显得不那么友好了”。

“跟投掷硬币一样,我刚才连续4次随机到了同样的关卡”。

杨成给出了最终的结论。

“噢”,系统表示赞成。

“那么依你之见,该怎么改进呢?”

杨成擦了擦鼻子。

“很简单地改动一下,就可以让它变得友好起来”。

“假设用一个用户个人列表保存了所有的关卡”。

“每次随机出一个关卡,便将该关卡从列表中删除”。

“这样就不会出现连续随机到同样关卡的问题”。

“这种算法就好比三分之一的概率中奖,连续抽三次100%中奖是一个道理”。

“之前的算法就如同三分之一的概率中奖,连续10次抽都中不了奖一样~”

“成成好棒啊!”,系统点了个赞。

“你的提议我会给开发团队看的”。

“我想,我得给你些奖励”。

“什么奖励?”,杨成顿时来了兴致。

“海岛度假七日游”。

“”

“嘻嘻,骗你的啦”。

“叮!当前积分260分,击败了全球55%的玩家,请您再接再厉!”

第一百二二章 购物(上)

“阿历克斯,有没有想法陪我去森林公园探险?”

“动物学家”科勒文发来讯息。

“有想法!咋们是现在就出发嘛?”,杨成很快就回复了。

“先去超市买点干粮吧”,科勒文挂断了。

一家充满了现代感的购物中心。

两个背着背包的年轻人直奔食品区。

“科兄,买点什么好呢?”

看着这琳琅满目的食品货架,杨成一时还真拿不定主意。

“面包?蛋糕?鸡腿?”

“no”,科勒文摆摆手。

“那是给旅行者准备的”。

“作为一名合格的探险者,巧克力是必备的”。

“它可以快速地补充体力”。

科勒文大手一招,抓取了5大块巧克力。

“然后呢?”,杨成推着购物车,挠了挠头。

“当你面临食物匮乏时,缺水是很可怕的”。

“所以,橙汁是最佳选择”。

科勒文拿了一打橙汁,又多抓取了几瓶。

“这样就非常完美了,有吃有喝的”。

“走,咋们去结账吧!”

杨成推着装得满满的购物车,往收银台走去。

排队人很少,两人几乎不用等。

科勒文掏出他的信用卡。

就在这时,收银机上突然一黑。

“发生什么事了?”,杨成顿时左顾右盼。

“各位尊敬的顾客,很抱歉,系统出现了些故障,请各位自行结算”。

购物中心的广播声响起。

自行结算?

这意味着又触发了任务。

科勒文耸了耸肩,瞅了瞅杨成。

“哥们儿,靠你了”。

第一百二三章 购物(下)

“先来统计商品的类型和数量吧”,杨成翻了翻购物车。

“咋们一共就买了2种商品,巧克力和橙汁”。

“其中,巧克力是5块,橙汁是一打加上3瓶,等于15瓶”。

“所以购物车内有如下的内容:”

[[“chocolate“,5],[“orange-juice“,15]]

“再来看看商品价格”。

杨成把目光停留在商品上,眼前很快浮现了一个面板。

上面印着一些属性表:

“orange-juice“:{

“price“:15,

“discount“:10,

“bogof“:false

},

“chocolate“:{

“price“:2,

“discount“:0,

“bogof“:true

}

很显而易见的,“price”是商品的价格,“discount”是所享折扣。

“bogof”是个啥东西?

杨成调出搜索面板查了一番。

原来是这样!

“buy-one-get-one-free(买一赠一)”。

好了,这些情况都搞清楚了,该开始结算了。

从左到右遍历购物车商品列表,第一类商品是巧克力。

按照下面的计算方法:

商品单价x商品数量x折扣

巧克力享受买一赠一优惠,买5块相当于只需要出3块的价钱。

巧克力无折扣,结果就是2x3=6。

橙汁享受九折优惠,结果就是15x15x09=2025。

购物车内商品总价就是62025=2625。

“牛仔,结帐吧,一共是26块2毛5”,杨成拍拍科勒文肩膀。

“阿历克斯,你可真够速度的”,科勒文说着掏出张百元大钞。

第一百二四章 森林公园(上)

从购物中心出来,杨成和科勒文上了私家车。

“哥们,咋们得在天黑之前赶到森林公园”,科勒文提醒他。

“系好你的安全带,牛仔”。

“待会儿让你感受下速度与激情,嘿嘿!”

杨成发车了。

从城市中心到森林公园这一条线上,开始车流如过江之鲫,杨成也没有机会施展他的车技。

随后,车辆越渐稀少,郁郁葱葱的森林出现在道路两侧。

“抓稳啦!”

杨成话音刚落,一踩油门。

车子猛然加速,呼呼的风声传进车内。

“真棒!”,牛仔点了个赞。

“如果能再来点劲爆的音乐就更好了”。

“你想听啥?”,杨成点开车载音乐。

“嗯那就迈克尔-杰克逊吧!”

“nice~”,杨成点了几下按钮。

“billie-jean”。

“就这首了”。

mj那熟悉的歌声响起。

杨成顿时回忆起他年少的时光,那些陪伴他度过岁月的金曲。

歌者会逝去,他们留下的经典却会被几代人回味。

一路上歌声相随,时间过得很快。

不远处,出现了一个检查站。

“游客们,请接受检查”,工作人员提示。

杨成和科勒文展示自己的个人物品。

“嗯,感谢你们的配合”,工作人员点点头。

“记住,如果你们遇到任何的麻烦,难以解决,可以把坐标报告给我们”。

“我们会尽力相助”。

杨成的私家车驶过了检查站。

第一百二五章 森林公园(中)

参天的古木,绿水与青山。

森林公园的全貌逐渐展现在杨成眼前。

林间有来自大自然的窃窃私语。

私家车驶过一座拱桥,桥下的溪水潺潺地流淌着。

“真是让人赏心悦目”,杨成发出感叹。

“不过”,牛仔摇下车窗。

“坐在车上只能观光,咋们还是下车吧”。

“有道理”,杨成表示赞同。

他把车停在拱桥一侧。

两个人背着背包走了下来。

“阿历克斯”,牛仔双手叉腰。

“作为一名老兵,我的嗅觉告诉我,附近一定有动物”。

“哦?”,杨成四处张望。

不远处的草丛里,传来些窸窸窣窣的声音。

那翠绿的青叶间,探出一个小小的脑袋。

“呼哧呼哧”,一阵低沉的粗喘。

“呼哧呼哧”。

嘴尖长有两条弯月般的獠牙,还有圆滚滚的大肚子。

这赫然是一头小野猪!

它用鼻子四处嗅探着,期望能找到最爱的橡木果。

于是,它蹬起粗壮的后腿,向远方观望。

这一看不要紧,跟杨成等人来了个对视。

小野猪的模样既憨厚又可爱。

杨成顿时咽了咽口水。

“伙计”,科勒文也是两眼放光。

“要不要考虑晚上加个餐?”

第一百二六章 森林公园(下)

杨成还在迟疑,思忖着是红烧还是清蒸。

科勒文这厮却已经展开行动了。

只听见“唰”的一声,一道身影犹如离弦之箭,朝草丛狂奔而去。

那小野猪本来还在哼哼唧唧地寻找食物,突然感觉到一股强大的杀意迎面扑来。

它禁不住腿哆嗦了几下,看到两位食客一前一后朝它攻过来。

“吼吼!”,小野猪受到了惊吓,扭转屁股,撒腿就跑。

此时,两者距离不到二十步。

再看科勒文这边,不愧是海军陆战队出身,久经考验的老兵。

他那沉稳的步伐,矫健的身躯,一下子将距离缩小到了十几步。

而杨成则更多地像是在竞走,被牛仔甩下了一大截。

两人一兽开始了竞速比赛。

这小野猪面临危机,使出了吃奶的力气,更是利用各种天然屏障跟科勒文周旋。

牛仔几次被树枝划到,被石头绊倒,但他锲而不舍,爬起来继续追赶。

很快,这三个跑出了五公里。

五公里对于军人而言,不过是例行训练。

但对于程序员,不亚于魔鬼式考验。

杨成只感觉骨头都快散架了,他停下来,扶着一颗古树,大口大口地喘气。

科勒文也停下了脚步,目送小野猪的身影消失在远方。

“真倒霉~”,牛仔鼻青脸肿地叹了口气。

他朝杨成走过来。

“更麻烦的是,咋们俩迷路了”。

第一百二七章 地图压缩(上)

夕阳西下,一群乌鸦飞过天空。

“伙计,来点巧克力吧”,杨成吧唧吧唧地吃着。

“不不,我没有胃口”,科勒文拿了瓶橙汁灌进嘴里。

他抹抹嘴,眼中有些担忧,眺望远方。

“阿历克斯,很快就要天黑了”。

“夜晚是某些猎食动物最喜欢的环境”。

“咋们必须找个安全的地方”。

“可是”,杨成把个包装纸丢在地上。

“帐篷什么的都丢在车上了”。

“呃,那没办法了,发送求救信号吧!”,科勒文说着掏出手机。

他按了几个按钮,将导航系统定位到当前所在的区域,再发送给检查站。

只见那手机屏幕显示加载中。

过了那么几秒钟,屏幕上弹出一个警告框。

您手机当前存储空间不足!

“wtf?”,牛仔顿时眼睛都瞪直了。

他调出存储空间一看,竟然只能再容纳10个字符的长度!

“god!”,科勒文捂着额头。

“发生啥事了?”,杨成凑过来一看。

他也是很吃惊。

“卸载,删掉某些大文件吧”,杨成立刻给出了方案。

“no!”,科勒文摇摇头。

“为什么?”

“这里面有大量的我和前女友的照片和视频”,科勒文态度很坚决。

“哼!”,杨成比了个中指。

还前女友呢,只怕是些祸害青少年的玩意儿吧!

第一百二八章 地图压缩(中)

“阿历克斯,再想想别的法子吧”,牛仔央求地说道。

“唉,好吧”,杨成只好单手托腮,开始了思考。

地图信息实例像这样:

[true,true,true,false,true]

[false,false,true,false,false]

[true,false,true,false,true]

[true,false,false,false,true]

[true,true,true,true,true]

这是一个5x5的矩阵。

其中true代表可通行的区域,false标注的区域无法通行。

那么,怎么把这个地图实例转为手机存储呢?

一种最简单的方法,是把这个实例序列化为字符串,就像这样:

“[[true,true,true,false,true],[false,false,true,false,false],[true,false,true,false,true],[true,false,false,false,true],[true,true,true,true,true]]“

这种方法很有效,但缺点也很明显。

占用的存储空间太多了,远远超过了10个字符的长度。

所以,必须想一个方法,对地图信息进行压缩。

杨成通过观察,发现了一种比较好的压缩方法。

使用二进制!

true可以用数字1来替代,false用数字0来替代。

那么矩阵就成了0和1构成的数字矩阵。

然后,将矩阵的每一行,看作是二进制数字。

比方说,第一行:

[true,true,true,false,true]

替换成数字:

[1,1,1,0,1]

看作二进制数字:

“11101”

然后将这个二进制数字,转换为36进制。

得到小写字母“t”。

这样,足足减少了4个字符,达到了压缩的目的!

对矩阵的每一行都这么处理,就可以得到5个36进制字符。

再将这5个字符用逗号分割开来,以表明行结束。

总共只需要54=9个字符,其中包括4个逗号。

这个方法是切实可行的,但还有更好的办法!

第一百二九章 地图压缩(下)

二进制转36进制的方法,能够胜任这个地图实例的压缩。

但如果地图更大些,比如6x6,7x7大小,就会暴露出一个问题。

一行的二进制数字有可能需要更多字符来表示。

比如:

“100110“

这个二进制数字用36进制表示,得到:

“12“

压缩后的字符串还是占了2的长度。

压缩效果并不理想。

那么该怎么改进呢?

将这个二进制数字用10进制来表示,得到:

“38”

然后将这个10进制数字看作数字unicode编码,返回字符。

unicode编码可以容纳上百万的字符。

所以对于这个问题,即使地图更大些,一行的二进制数字也可以只用一个字符来表示。

这样的压缩方案,更彻底。

有了方案,编写代码自然是很容易的事情。

杨成对地图信息实例压缩后,给检查站的工作人员发送短信。

“哥们,真感谢你”,科勒文拍了拍他的肩膀。

此时,夕阳落山,大地被黑暗所笼罩。

“嘀嘀”,科勒文的手机铃声响起。

“游客您好,我是景区工作人员,刚收到了你们的坐标信息”。

“鉴于夜晚来临,会给搜救工作带来麻烦”。

“请你们先找个安全地方,耐心等待”。

“我们将派出寻路机器人,带你们返回”。

第一百三十章 机器人罗比(上)

天空,有一轮弯月高悬。

“嗷唔”,远处的山坡上传来一阵狼嚎,给整个黑夜铺上一层神秘的面纱。

丛林间,一幕幕猎杀的场景正在上演。

而距离地面十米高的一棵大树上,传来不同寻常的声响。

“科兄”,杨成远眺四方。

“咋们这地方够安全嘛?”

“那当然”,牛仔肯定地说道。

“只要能支撑到寻路机器人赶到就行”。

距离杨成等人五公里外的一处丛林。

一道光柱四处扫射,所到之处,惊起一团鸟兽。

“机器人罗比距离目标5公里”

“全速前进中,前方没有障碍”

一个半人高的小机器人,手里握着个手电筒,打量着四周。

“嗷嗷!”

只听见一声咆哮。

一头孤狼掀起一阵恶风,从树丛中冲出来。

那孤狼利爪如闪电般,狠狠地拍击在小机器人身上。

接着,又是一阵凶猛地啃咬。

“哎哎呀!”

“罗比遭袭了!”

小机器人倒在地上,动弹不得。

机器人罗比拼命地挣扎着,可那孤狼越咬越狠,很是不罢休。

“系统模式切换”

“电击模式开启”

只见那罗比身上一道电弧发射出来,击在孤狼身上。

“呜呜呜”,孤狼一声哀嚎。

空气中弥漫着一股烤肉味。

孤狼夹着尾巴,落荒而逃。

小机器人爬起来,调整姿势。

“系统自检中”

“部分逻辑失效”

“切换到省电模式”

“继续前进”

第一百三一章 机器人罗比(中)

月色越发深沉。

十米高的大树上传来一阵又一阵的打鼾声。

原来,杨成和科勒文实在挡不住倦意,都陷入了熟睡中。

此时,四周静寂无声。

“咚呲哒呲”

“咚呲哒呲”

百米开外,微弱的机械声传来。

这声音丝毫不能影响到大树上的睡者。

估摸着又过了三分钟。

“机器人罗比到达指定区域”

“暂未发现异常情况”

小机器人把个手电筒照来照去,却没有发现半个人影。

一个大大的问号出现在它的镜框中。

小机器人绕着大树跑了几圈,还是没有线索。

于是,它停下来,陷入沉思。

“传统搜索无法找到目标”

“启发式搜索模式开启”

罗比抬起头,把个手电筒往上一照。

“唰唰”。

睡梦中的杨成被这手电筒光扫到眼睛,顿时倍受刺激。

他身子一偏,冷不防摔了下来。

“唉呀!”,杨成一声惨叫。

从10米高的地方摔下来,可是很严重的!

就在这危机的关头。

“切换为营救模式”

小机器人话音刚落,整个身体卧倒,平铺。

“嘭!”,一声响。

杨成整个人砸在罗比身上。

“寻路逻辑遭到破坏”

“请自行修复”

“请自行修复”

第一百三二章 机器人罗比(下)

“唰唰!”,牛仔从大树上跳下来。

然后,他看见了倒在地上,奄奄一息的小机器人罗比。

“哥们,发生啥事了?”

杨成看了看小机器人,脸上很是诧异。

就在这时,罗比开口了,它的声音很微弱。

“主人”

“罗比的寻路逻辑被破坏了”

“想让罗比带你们回家”

“请先修复”

杨成听到这里,已经有了些眉目。

这个关卡敢情是考寻路算法啊。

对于要判定地图中两点间的路径,有一种简单粗暴的做法。

使用深度优先遍历!

它的实现方式很简单,但有2点不足:

1效率低下

2它找到的路径不一定是最短路径

第二点尤其致命,绕远路白费力气。

所以这个问题应该是寻找图中两点的最短路径。

当前的地图有什么特点?

它并没有“权重”。

对于有权重的地图,寻找最小权重和路径,有一种经典的算法。

迪杰斯特拉最短路径算法。

但这个地图是没有权重的。

事实上,这里也可以应用迪杰斯特拉算法,但效率不高,而且需要大量的额外空间。

怎样找到一种,足够简单,实现方便,而且效率不会很低的最短路径算法呢?

杨成想到了老朋友。

广度优先遍历算法。

这个方法可以做到!

但是,我们得给它做点小小的改变。

-------------------------------

这个最短路径问题,迪杰斯特拉算法经过优化后的时间效率是o(n*logn),而广度优先遍历是o(n)的,而且迪杰斯特拉需要的额外空间也更多。

第一百三三章 最短路径

要将广度优先遍历算法,转变成最短路径的算法,需要在遍历的时候,对地图的每一个节点额外存储两个信息:

1从起始节点到当前节点的路径长度(非必须)

2当前节点之前的那个节点(前驱节点)

在遍历的过程中,如果抵达了目标节点,就终止遍历。

最短的路径就是:

目标节点,目标节点的前驱节点,前驱节点的前驱节点

直到起始节点。

相当于是一个沿着目标节点的前驱链表回溯的过程。

这个实现并不复杂,杨成很快就写完了代码。

但他也注意到了这个算法的不足之处:

消耗的时间比较大,遍历的点会很多。

有没有办法让这个算法变得更加智能呢?

“哎哎呀”,只听见小机器人罗比闷哼了一声。

它骨碌碌地爬起来。

“主人,感谢你修复好了罗比的寻路逻辑”。

“那么,下面开始导航吧!”

只见那罗比耷拉着脑袋,一副沉思的模样。

“确定当前为起始节点”

“确定检查站为目标节点”

“寻路算法执行中”

“请稍候”

罗比一只手握着手电筒,另一只手托着下巴。

杨成和科勒文则呆呆地看着它。

时间一分一秒地过去了

罗比这边还是没什么动静。

“我的天哪”,杨成以手扶额。

这就尴尬了!

杨成心里忐忑不安。

就在这时,小机器人身上发生了变故。

只见它头顶冒起一股白烟

第一百三四章 返程

小机器人罗比的镜框中风云变幻。

一团团雾气萦绕在它周围。

这似乎是在进行艰难而繁重的计算啊!

杨成搓着手,脸上阴晴不定。

一想到自己的算法如此的低效,他就有种程序员的忏悔。

就在这时,罗比身上再次发生了变故。

一种类似于机械齿轮碰撞的声音传来。

“嗤嗤!”

“嗤嗤!”

这厮不会要爆体身亡了吧!

杨成心中一个念头闪过。

下一刻,他做好了卧倒的准备。

就在大家都心惊胆战的时候。

“噗~”

罗比突然就熄火了。

它的镜框中,一个绿色的对勾悄然浮现。

“机器人罗比完成了计算”

“耗时5分38秒”

“已获取最短路径”

杨成顿时如释重负。

他长吁了一口气。

“主人们,请跟我来”。

小机器人转过身子。

它拿着手电筒,朝着一个方向,一步一步地驶去。

“伙计,快跟上”,科勒文拍拍杨成的肩膀。

两人跟随罗比的脚步,踏上了返程。

第一百三五章 二叉树森林

皎洁的月光下,杨成等人行走在丛林间。

夜更深了,林间多了一份静谧与祥和,少了一份喧嚣与狂热。

此时晚风习习,空气中弥漫着花草的香味,沁人心脾。

“不要急着走嘛”,杨成四处瞅了瞅。

他弯下腰,采了几朵五彩斑斓的鲜花。

“路边的野花你不要采”,科勒文打趣地说道。

杨成抬起头。

他看到树枝间那翠绿的枝叶。

“哗”,手中的鲜花纷纷滑落。

“哥们,快来看!”

“这是啥品种的树哟?”

科勒文走过来,仔仔细细地一端详。

“god”

饶是这动物学家见多识广,也认不出个所以然来。

只见这树枝繁叶茂,一节点开二叉,无一例外!

这绝对是在现实中没有的品种。

杨成丰富的联想给了他启发。

这难道是数据结构中定义的二叉树?

二叉树区别于普通的树,它一个节点最多只能包含2个子节点。

好比现实中的树,枝干与枝干的交界处称之为节点。

一个节点最多包含2个分支,这就叫二叉树。

不过数据结构中的二叉树,它一个节点的子节点是严格区分的。

分为左子节点和右子节点。

“这周围还有二叉树嘛?”

杨成四处搜寻,发现了更多的惊喜。

这里不但有普通树,普通二叉树,还有一些二叉树的特例。

比如完全二叉树。

甚至还有特殊的完全二叉树——满二叉树!

换句话说,杨成等人来到了一片二叉树的森林。

第一百三六章 随机取样(上)

“你看这颗满二叉树”。

“假设它的高度为k,那么它就有2的k次方减去1个节点数”。

杨成边走边向科勒文介绍。

随着一行人深入二叉树森林,越来越多奇形怪状的树出现在他们眼前。

有一种树,它的节点要么是红色,要么是黑色的。

但它的叶子却都是黑色的。

如果你仔细地观察每个叶子到树根的路径,就会发现一个惊人的规律:

节点间不会出现连续的红色节点,而是红色与黑色交替出现。

“红黑树”,杨成很快就认出了。

这种树最早的学名其实是叫“对称二**树”,后来才提出的“红黑树”这个概念。

它应用很广,常常用来实现关联数组。

很多开发者可能感觉不到自己和二叉树有关联。

但实际上,比如java,treemap这个类就是红黑树的底层实现。

再比如说javascript的数组,很多种宿主环境实现都是类二叉树的形式。

“哥们儿,你很棒棒喔”,科勒文竖起大拇指。

“我突然有个想法”。

“动物学家”看了看四周。

“反正还早着哪”。

“不如,咋们来调查一下,这块区域的二叉树密度,怎么样?”

“可以啊!”,杨成表示赞成。

“怎么做呢?”

“随机抽样呗!”

第一百三七章 随机取样(中)

“阿历克斯,这方面你最擅长,就由你来制定方案吧!”

牛仔拍了拍杨成的肩膀。

杨成望着眼前的二叉树森林,陷入沉思。

在产生随机样本之前,先要设法产生单个的随机数。

对此,大部分编程语言都提供了类似rand的函数。

rand函数一般是返回0到1之间均匀分布的一个随机实数。

杨成调出编辑器面板,开始了编写。

第一步:

将二叉树森林的每一棵树,编号为1到n的整数。

目标是从中机选m个(m小于等于n)。

第二步:

根据rand函数编写randint函数,它返回某个区间均匀分布的一个随机整数。

第三步:

开始编写取样算法。

初始化空集合s。

利用randint函数产生1到n之间的随机数。

如果这个随机数,集合s中找不到,就添加进s。

如果这个随机数,集合s中已存在,就产生新随机数,继续判断。

整个算法持续到,集合s内元素个数等于m,达到我们的要求,终止。

通过这三步,就能够产生m个无重复元素的随机样本。

杨成一口气写完,长吁一口气。

“写完了?”,牛仔关切地看着他。

“嗯”,杨成擦了把汗。

在他看来,这个算法有很多优点:正确,很高效,非常简洁。

至少在他目前看来,是没办法再改进了。

“主人”,一直在旁沉默不语的小机器人罗比突然发话了。

“你这个算法存在一个缺陷”。

第一百三八章 随机取样(下)

“什么缺陷?”

杨成难以置信地看着小机器人。

不可否认,在这一块ai是要远远强于人类的。

罗比的镜框中光点一闪一闪。

“根据我刚才的分析测试”

“当m=n=100时就明显存在一个缺陷”

“当集合s中已有99个整数,只差1个整数”。

“就是这一个整数,算法得闭着眼睛乱猜,直到偶然碰到正确的那个为止”。

“相当于100选1(99个已在集合中),这平均需要猜100次,最坏的结果甚至更糟糕”

听到罗比的话,杨成顿时就明白了。

等于说,这个算法越执行到后面,需要猜的次数就越多,效率越差。

“那么,我该怎么来改进呢?”

杨成诚心地请教它。

“你可以看看floyd算法,它提供了一种优雅的实现”。

小机器人说完,小步小步地走出二叉树森林。

杨成和科勒文赶紧跟上。

当他们拨开那遮挡视线的最后一束枝叶。

耳畔传来熟悉的清泉流响。

先前来时的拱桥上,还停留着私家车。

第一百三九章 行道树

私家车启动。

小机器人罗比端坐在后排。

“罗比顺利完成搜救任务”

“电量不足百分之十”

“进入休眠状态”

只见罗比的镜框中,光线一黯,它全身瘫倒在座位上。

车子很快行驶在森林公园的主干道上。

东方的地平线上,第一抹光亮浮现。

两侧遮天蔽日的行道树上,一滴滴露水纷纷洒落。

看着这道路边上的树和二叉树,杨成心中似乎又有所明悟。

由于已经有了不少的编程经验,他此时是完全不同的感受:

树代表一种非线性的数据结构,如果一组数据,它的节点之间存在复杂的一对多关联,程序就可以考虑使用树来保存这组数据。

当那朝阳的光芒照射进车窗内,杨成已是豁然开朗。

如果一直停留在用类库的层次,树和二叉树这些经典数据结构可能没什么太大的用处。

而程序员如果想突破自身,进入更高的层次,想开发自己的类库,那么这些东西就是必须掌握的。

想到这里,杨成摇下车窗,任由阳光抚摸自己的脸庞。

“科兄,让我们踏上新的旅程吧!”

第一百四十章 艾萨克牛顿

“系统妹子,这次森林公园的旅行真不错!”

“亲,记得五星好评喔~”,系统也很高兴。

“下一个关卡,我选择一个历史名人”。

“选谁啊?”

“艾萨克牛顿!”

位于英格兰林肯郡的沃尔索浦小镇,这里迎来了收获的季节。

金黄的麦田里,处处可见忙碌的人们。

田野上,一个年轻人手里拿着一摞书籍与资料,走向不远处的果园。

他的眼中十分宁静,表情专注。

从剑桥拿到学士学位后,他选择回到家乡,在这里沉淀已有的学识。

年轻人选择了一棵苹果树,他弯腰坐下,靠在树干上,打算在这里度过一下午的时光。

他翻开书页,很快被一个问题所吸引,陷入沉思。

树枝上传来些许骚动,不过这丝毫没有影响到思考中的艾萨克牛顿。

那些精妙的数学知识,让他沉浸其中。

直到

“咚!”

一个东西重重地砸到他的头上,那种痛楚让他暂时失去了思考能力。

一阵头晕目眩过后,牛顿顿时有些恼火。

“是谁?!!!”

这根本不是树上结的东西能达到的击打效果。

除非,树上长了南瓜!

有人要暗害我?

牛顿一惊,抬起头,倒退几步,想看个究竟。

树枝上,一个身影渐渐浮现。

“艾萨克牛顿!”

“我阿历克斯在此恭候多时了!”

第一百四一章 平方根

“唰唰!”,一道身影从树顶径直跃下。

只见那杨成手里拿着个大苹果,还掂量了几下。

“咔嚓”,他咬了一口,感觉满口都是清香。

“我说你这狂徒”,艾萨克牛顿摸了摸自己的脑袋,心有余悸地说道。

“看你也衣冠楚楚,怎么会做如此不堪之事?”

杨成嘿嘿一笑。

“俺只是想看看,能不能帮你把万有引力定律给砸出来”。

“胡说八道!”,牛顿有些愤慨。

“你如果有心学术,不如来看看我正在研究的问题”。

“什么问题?”,杨成顿时来了兴致。

“给定一个数,你能求出它的平方根嘛?”,牛顿眼中闪烁着狡黠的光芒。

“很easy啊,大部分编程语言的数学库都封装了类似sqrt的函数,直接调用就ok了呗!”

“这都是前人的宝贵实践经验”,牛顿不以为然。

“如果要你来编写一个这样的函数,你会怎么做呢?”

第一百四二章 对分法

历史上,数值分析家们发展出了很多种技术来计算平方根。

杨成眉头紧锁,很快想到了一种方法。

可以利用老朋友:二分搜索。

假设一个数a,它大于等于1,要求它的平方根。

这个平方根肯定是在1到a之间的某个实数。

利用二分搜索的思路,我们可以每次把查找范围缩小一部分,直到得到a平方根令人满意的近似值。

例如,当a=4时,有范围1-4。

接着范围缩小,1到25。

接着是175到25。

175-2125

最终得到近似于2的值。

这种方法被数值分析家称为对分法。

相当于每一步查找都能达到更精确的目的。

艾萨克牛顿目不转睛地盯着杨成的编辑器面板。

他看到那一行行测试用例通过。

“嘿,哥们”,杨成擦了擦鼻子。

“我这方法怎么样?”

“还行咯”,牛顿表示肯定。

“不过嘛”,他话锋一转。

“你这迭代次数有点多诶~”

“我有一个更好的方法”。

第一百四三章 牛顿迭代(上)

“我的方法并不是显式地计算区间,而是从一个猜测的数开始,生成逼近序列”

艾萨克牛顿的嘴角一丝上扬,洋溢着自信。

“你来看看我的迭代公式”。

他弯下腰,随手捡了个小石子,在地面的沙砾与土壤上写下一个公式。

“这个算法将迭代到,当前计算出的项数,与前一项的差的绝对值达到指定的精度为止”。

杨成将信将疑地看着这个公式。

他将编辑器还原,开始依照这个公式编写代码。

代码量不多,也就十来行,杨成很快就搞定了。

“那就开始计算2的平方根作为测试吧!”

他将2作为输入,提交运行代码。

“唰唰!”,编辑器很快弹出运行结果。

“呵”,杨成不禁倒吸一口凉气。

求2的平方根,精确到小数点后16位,竟然只需要5次迭代!

这种求解速度实在是太快了,相当于每一次迭代都会使精确位数翻倍!

第一百四四章 牛顿迭代(下)

“和您的迭代方法相比,我用的对分法就像小孩子的玩具一般”

杨成由衷地赞叹道。

他在脑海中总结巩固所学的知识。

牛顿迭代可以用于哪些方面呢?

比如计算平面或者空间上面,任意两点间的距离。

利用牛顿迭代计算平方根,可以确保精度,健壮性,以及高性能。

再比如计算大数开方,牛顿迭代更能显现出威力。

当然,前提是有一个精密的大数计算库做保证,提供大数加法,大数除法这样的方法,在迭代中调用。

杨成过了良久,才从思索中回过神来。

“咦?”

他左顾右盼,却没有发现艾萨克牛顿的半个影子。

就在他纳闷的时候,身旁的大树上发生了变故。

“喝!”

一道身影从天而降。

“啪!”

“哎哟喂!”

杨成突遭重击,瘫倒在地。

牛顿扬长而去,他丢下一句话。

“小子,好好学”。

“这算做你冲动的惩罚!”

第一百四五章 帕斯卡

杨成缓缓地爬起来,擦了擦嘴巴上的泥土,目送牛顿远去。

他不但没有恼怒,反而有着一份欣喜。

“成成,你太跳啦!”,系统的声音冒出来。

“哈哈!”,杨成双手叉腰,放声大笑。

“又是获益匪浅的一个关卡”。

“应该说,艾萨克牛顿是世界上最早的计算机科学家”,他打趣地说道。

“当然,他也涉足于数学和物理领域呢~”

“嗯嗯”,系统表示赞同。

“那下一个关卡你怎么选择呢?”

“我选择另一个国家的历史名人。”

“帕斯卡!”

1648年,法国巴黎。

中央广场,熙熙攘攘的人群,他们朝着同一个方向涌过去。

“听说了吗?”,人群中有人议论纷纷。

“去年做出轰动全市实验的那个布莱士-帕斯卡,他又在倒腾个不得了的东西呢!”

“哦?是嘛!”

“我也去看看吧!”

杨成在其中一言不发,只顾跟着大队人马前行。

第一百四六章 裂桶实验

“女士们,先生们,大家下午好”。

一栋高楼的二层阳台上,一位绅士朝人群脱帽,致以敬意。

望着四周黑压压的一片观众,布莱士-帕斯卡那深邃的眼眸中,流露出一份沉稳与执着。

是该向世人展示自己的新发现了!

他那表面上的波澜不惊,其实内心却是炽热的。

“今天,帕斯卡将为大家带来一个小型实验”。

“大家请先看下方”。

帕斯卡手指阳台下面。

一楼的地面上,放着个密闭,装满了水的木桶。

在桶盖上插了一根细长的管子,一直延伸到二楼,帕斯卡触手可及的地方。

“接下来,我将往细管子里面灌水”。

帕斯卡拿出一个装满了水的杯子。

“大家看看会有什么样的结果”。

只见那杯中水一股股涌入细管子中。

大半杯水倒完,没有丝毫异样。

直到

最后一股清水注入。

“嘭!”,沉闷的声音响起。

木桶分崩瓦解,裂作数块,水流四处蔓延。

“呵”

人群中惊叹声响起。

在这个下午,大众又一次见识了科学的魅力。

第一百四七章 液体压强

就在人们都感觉不可思议的时候,帕斯卡发话了。

“诸位有谁知道这个实验的原理吗?”

大家都陷入了一片安静。

能直接把一个密闭的木桶裂开,这得需要多大的力气啊。

即使是法兰西最强大的勇士恐怕也难以做到!

对于这个问题,人们心中不解又充满了震撼。

“如果有人能解答,那么他将得到100镑作为报酬”。

帕斯卡鼓励大伙,他相信重赏之下必有勇士。

就在这时,一个有力的声音从人群中钻出来。

“我来回答吧!”

“因为木桶里原本装满了水,而细管子的容积比较小”。

“所以一杯水灌进去,水的深度很大,导致压强很大”。

“桶壁经受不住压强,才开裂的”。

“这证明了一点”。

“液体压强与液体的深度有关!”

四周的人们纷纷以好奇的目光看着这个年轻人。

阳台上的帕斯卡和这位解答者四目相对,他投以和煦的笑容。

“真不错!”

“小伙子,我想请你喝一杯”。

第一百四八章 帕斯卡三角形

夜幕降临,巴黎最有名的月光酒馆。

这里人声鼎沸,无数的酒客把酒言欢。

就在这酒馆偏僻的一角,端坐着一位中年人和一个年轻人。

“酒保,来两大杯麦酒”,帕斯卡排出几枚大钱。

“这里的麦酒口感纯正,但愿能合你的口味”。

杨成打量了一下四周。

“我有一个秘密要和你分享”,帕斯卡神神秘秘地说道。

“什么秘密?”,杨成顿时来了兴趣。

帕斯卡从口兜里摸出一枚小石子,在酒桌上开始了刻画。

他首先写下了一个1。

紧接着在第二行写下了1,1。

第三行写下1,2,1。

直到第六行。

“阁下见多识广,可曾见过这样的数字排列?”

杨成仔仔细细地一看。

“杨辉三角!”,他脱口而出。

“杨辉是何人?”,帕斯卡眼中既好奇又疑惑。

“他乃是我东方国度,古代伟大的数学家”。

杨成脸上带着些许自豪。

“哈哈!”,帕斯卡爽朗地一笑。

“原来在我之前,已有先哲发现了这个问题的解法”。

“杨辉三角,帕斯卡三角,殊途同归啊!”

第一百四九章 计算杨辉三角

“来,咋们干了这杯!”

“呯”,清脆的碰撞声响起。

杨成仰头,把那麦酒咕噜噜地喝进嘴中。

“咂”。

“真是好酒哇”,他脸上有了些许红晕。

“小杨啊”,帕斯卡也有了醉意。

“你既然熟知这杨辉三角”。

“你看我这里只写了前六行”。

“假如要你求第七行的数列,你会怎么做呢?”

杨成抹了抹嘴,让自己清醒几分。

他脑海中开始回顾杨辉三角的相关性质。

如果已知上一行的数列,怎样求下一行呢?

首先,最左侧和最右侧,雷打不动的是1。

然后,其它数字等于上一行的左右两个数字之和。

利用这个性质,就很容易求解了。

杨成在帕斯卡写下的数列后面,又补全了如下的:

1,6,15,20,15,6,1

可以观察到另一条性质:

第n行就有n项的数字。

“好!”,帕斯卡鼓掌称赞。

“我们东方有句古话”,杨成捋起衣袖。

“人生得意须尽欢,莫使金樽空对月!”

“再来一杯如何?”

第一百五十章 二项式系数

月光酒馆里,觥筹交错。

三两杯下肚,杨成只感觉浑身有使不完的劲。

仿佛又回到了那个充满激情的青春岁月!

帕斯卡也有些醉醺醺的。

“小友,你如此了解这杨辉三角”。

“可知它有什么实际运用吗?”

“这”

杨成一听顿时酒醒了大半。

自己还真不知道诶!

初中的时候只知道此三角中的某数等于它上排相邻两数之和。

但实际运用又是怎样的呢?

“你且听我道来”,帕斯卡清了清嗓子。

“如果已知a和b两个未知数”。

“求它们和的幂次方运算”。

“比如(ab)的平方,你观察这个展开后各个项的系数”。

“1,2,1”。

“这是不是对应杨辉三角的第三行?”

“再比如(ab)的立方,展开式的各项系数”。

“1,3,3,1”。

“正好对应杨辉三角第四行”。

“依此类推到四次方,五次方”

杨成拍了拍脑袋,努力让自己清醒。

过了良久,他才想明白。

“原来,杨辉三角对应的是二项式系数啊!”

“杨成小友”,帕斯卡这时站起身子。

“今晚和你相谈甚欢”。

“我得回去准备下一场实验了”。

“您慢走”,杨成目送帕斯卡离开酒馆。

第一百五一章 城市规划局

“成成,这个关卡怎么样?”,系统声音冒出来。

“非常棒哦!”

杨成把个酒杯,拿在手上把玩。

“帕斯卡那老哥,真是够豪爽!”

“真想再跟他痛饮一番”。

“嘿嘿”,系统笑嘻嘻地说。

“当然会有机会的啦”。

“你又有新任务了”。

“哦?”,杨成顿时来了精神。

“我们代码战争虚拟城市规划局发布了最新任务”。

“要不要去看看?”

“go!”,杨成充满了激情。

在这款游戏的这么多天,他接触了很多名人和先哲。

他们的言传身教,让自己收获了很多。

如果有机会,一定要为这款游戏做点什么。

杨成在心里对自己说。

就在他思绪万千的时候,场景发生了切换。

灯火通明的月光酒馆,所有灯光熄灭,耳畔的喧嚣声化作一片寂静。

很快,他出现在了一间宽敞的办公室。

阳光照亮了整个屋子。

摆放的整整齐齐的书架,擦得光亮的桌椅。

还有,一位白发苍苍,精神矍铄的老者。

“欢迎来到代码战争城市规划局!”

第一百五二章 路线规划

“尊敬的挑战者,我是城市规划局负责人”,老者自我介绍道。

“您好”,杨成同他握了握手。

“那我就先谈谈任务吧”,负责人开门见山地说道。

“请先看这幅地图”,他手指一个方向。

只见那光洁的墙壁上,挂了一幅很宽广的路线图。

上面各种密密麻麻的,各种线路纵横交错,让人眼花缭乱。

“这样的一幅地图,能表示很多东西”,老者继续说道。

“点可以表示一个节点,可以是交通枢纽,中转站,或其他意义”。

“边则可以表示路线,比如航线,公路,铁路,水路等等”。

“而一条路线的费用或者距离,可以用权重来表示”。

“在这么大的一个城市网络,维护的费用是巨大的”。

“如何将成本最小化,是每一位城市规划者必须考虑的问题”。

“所以”,负责人盯着杨成,眼中有着期许。

“如何在保障城市网络畅通,各个节点间无阻碍访问的前提下”。

“撤销掉某些开销很大的路线”。

“就是这次的任务主题”。

第一百五三章 最小生成树(上)

听到负责人对任务的描述,杨成联想起了一种经典而古老的问题。

早在上个世纪初,那时候,连世界上第一台计算机都没有诞生。

人们在设计电力分配网络时,就遇到了如何将成本最小化的问题。

后来,有人将它系统地归纳成了一种算法——最小生成树。

这种算法,如今在设计各种类型的网络,比如通信,电子,水利,计算机,路线规划等领域,都起到了重要作用。

既然是最小生成树问题,那么我该如何设计呢?

杨成捶了捶脑袋,感觉有些头疼。

首先应该考虑的,是采用哪种算法。

早在上个世纪60年代,就有一位先哲提出了一种到现在还在被广泛应用的算法。

算法以他的姓氏命名。

prim算法。

这种算法有什么优点?

它的实现非常简洁,优雅,而且效率足以胜任大部分的应用。

好,就决定是这种了!

先贤们赐予我力量吧!

杨成在心中呐喊。

第一百五四章 最小生成树(中)

好,既然决定了使用哪种算法,那就开始准备工作吧!

杨成调出编辑器面板。

首先应该准备的,是一个无向图。

无向图,顾名思义,没有限制具体方向的地图。

就好比两点之间,你可以到我这儿来,我也可以到你那里去。

对于地图底层实现,一般有两种方式:

邻接表和邻接矩阵。

杨成决定使用邻接表来实现这个无向图。

那应该提供哪些方法来方便调用呢?

像节点和边的增删改查方法,这些肯定是必备的啊。

然后,像检测图连通性的方法,也是必须的吧!

prim算法的性质决定了,它只能处理无向图和连通了的图。

然后接下来呢,应该准备一个优先级队列。

它是prim算法能够加快效率的秘诀。

这个优先级队列的底层是最小堆。

上面这两个子任务就花掉了杨成几个小时。

他长吁一口气,擦了一把汗。

现在万事俱备,只欠东风咯!

第一百五五章 最小生成树(下)

那么,就开始编写prim算法吧!

首先,做异常情况判断。

两种情况视为异常:

1地图为空(没有意义嘛)

2地图连通性无法保证

这些情况,通通返回空地图。

然后,从地图中选取一个点,作为起始顶点。

随便哪个点都可以的!

将该点标识为已访问,并将含有起始顶点的边添加到优先级队列。

接下来,是算法的关键性部分。

1从优先级队列中取出权重最小的边。

2如果这条边,两端的点都被访问过,说明是失效的边,将其舍弃。

3这条边没有被舍弃,那就是有效的,加入最小生成树。

4以这条边,没有被访问过的端点,继续标识为已访问,并将含有该端点的边添加到优先级队列。

5又从1开始,反复循环。

这似乎是个从1到4阶段永不停歇的贪心计算过程。

然而,万物有始必有终结。

当图中所有的顶点,都被最小生成树得到(顶点数量相同)。

或者,当优先级队列为空。

这个算法就结束了它的使命。

此时得到的,就是原来地图的最小生成树。

第一百五六章 执行算法

当杨成编写完最后一行代码。

他点击提交,执行算法。

令人惊讶的事情发生了!

只见那宽大的路线规划图,上面一个个节点,一条条路线,正以肉眼可见的速度消失,露出一片片空白。

直到

整个地图变成了一张白纸。

这个阶段停留了几秒钟。

然后

一张全新的路线规划图覆盖在了白纸之上。

如果仔细一观察,有些开销很大的路线被撤销了。

这就是,最小生成树算法所能做到的!

prim算法尽管诞生已有半个多世纪之久,但它依然被很多应用所使用。

即使是科技日新月异的现在,想要找出比prim算法快上很多倍的算法,也是很难的!

甚至只是一个小常量级的提升。

这让杨成不得不佩服前人的智慧。

“年轻人,你做的很棒!”

这时,一直在旁默默观察的负责人发话了。

他那饱经沧桑的脸上流露出微笑。

“你解决了本次城市规划局的难题”。

“我们将授予你荣誉市民的称号”。

“很多机密区域将对你开放!”

第一百五七章 计算中心

“成成,恭喜你成为了荣誉市民!”

“我们代码战争的城市计算中心对你开放了”。

“去看看吧!”

坐落在虚拟城市一角的计算中心。

这里有着最顶尖的人才,与运算速度最快的计算机,承担着大部分的科学计算工作。

白色的内部风格,一眼望不到边的机房。

“访问者,你好”。

一位身穿白色工作服的科研人员接待了杨成。

“您是做哪块研究的?”

看着这位的打扮装束,杨成内心升起一种天然的亲近感。

这或许就是他所向往的职业吧!

“我啊”,对方挠了挠头,流露出腼腆的微笑。

“搞数论方向研究的”,他又补充了一句。

“最近的课题,是研究一种特殊的数呢”。

“嗯”,杨成顿时兴趣大增。

“能看看您的研究吗?”

“没问题”,科研人员做出个邀请的手势。

“请跟我往这边来”。

他带领杨成往一个机房走过去。

第一百五八章 196算法

机房里,灯火通明。

一台台计算机的屏幕上,一行行代码自动浮现,快速地刷屏。

真是让人眼花缭乱!

“这个机房究竟承担的是怎样的计算任务啊?”

杨成情不自禁地问道。

科研人员笑了笑,没有说话。

他带着杨成径直来到一台主机前。

和其他主机截然不同的风格。

这台机子的屏幕是静止的,似乎什么事也没有做。

上面只有一行代码:

continue

看着杨成诧异的眼神,科研人员给出了解释。

“这台主机是在执行196算法”。

“它已经运行快三年的时间了”。

“几百万次的迭代”

“现在每一次迭代都需要好几天的时间呢”。

“原来是这样!”

杨成这才恍然大悟。

这台主机看起来什么事都没做,其实承担了这么繁重的任务啊!

“那您能谈谈196算法的实现原理吗?”

杨成顿时非常好奇。

什么算法,居然这么耗时?!

第一百五九章 翻转与相加

“196算法的原理很easy”。

科研人员耐心地解释道。

“首先你要知道回文数的概念”。

“如果一个自然数,把它翻转过来,和原数相等,这就是个回文数”。

“如下的就是回文数:”

12321

124421

“而很多数字可以被转换成回文数,通过使用196算法”。

“196算法过程可以概括为一句话:”

“先翻转,再相加”。

“以48这个正整数为例:”

“48先翻转,得到84”。

“48和84相加,得到132”。

“132再翻转,得到231”。

“132和231相加,得到363”。

“通过两次迭代,就能得到回文数363”。

“再比如59这个数:”

5995=154

154451=605

605506=1111

“通过三次迭代,就能得到回文数1111”。

“事实上,绝大部分数都可以通过196算法得到回文数”。

“soga”。

杨成一下子就明白了。

但他的疑惑却加深了。

“196算法既然这么简单”。

“那这台主机为啥跑了三年之久呢?”

又不是埃尼阿克!

第一百六十章 利克瑞尔数

“然而”

科研人员话锋一转。

“还有极少的数,调用196算法不会停止”。

“或者说,以现有计算机的运算能力,无法得到回文数”。

“这一类数,被称为:”

“利克瑞尔数”。

“这也是我现在的研究方向!”

科研人员眼中有着一份自豪。

“迄今为止,对于10进制,还没有数字被证明是利克瑞尔数”。

“但是,有一些候选的利克瑞尔数,它们通过上百万次迭代都无法得到回文数”。

“这些候选数中,最小的是196”。

“所以196算法因此得名”。

“原来如此!”

杨成心中的疑惑顿时烟消云散。

难怪这台主机三年都无法求解。

利克瑞尔数还真是一个未解之谜啊!

就在杨成沉浸在思考之中,科研人员拍拍他的肩膀。

“同学,你可以尝试自己写个196算法”。

“自己写?”

杨成顿时一愣。

似乎也不是很难的事儿吧!

第一百六一章 编写196算法

那么就开始编写吧!

杨成调出编辑器面板。

firstly,心中谨记规则——先翻转,再相加。

所以,一个对正整数作翻转的函数是必须的。

因为,结果是要得到回文数。

所以嘛,一个判断正整数是否是回文数的函数也是必须的。

这些都是小case,杨成很快就搞定了。

然后,开始切入正题,怎么编写196算法呢?

接收一个正整数,对它做翻转。

和原数相加,得到和。

如果这个和是回文数,那么就ok,返回结果,终止算法。

如果不是回文数,将和继续翻转,相加。

continue

这个过程很简单,反复迭代。

关键在于考虑“利克瑞尔数”。

如果超过了一定的时间或范围,应该及时中断。

否则,就会陷入可怕的死循环。

杨成的处理是这样:

一旦当前运算会丢失精度,就返回-1。

很多语言如果不使用大数计算库,一定数值范围外运算会丢失精度。

这样确保了小数值范围内求解,不会出现死循环。

通过以上几个步骤,简易版的196算法就成型了!

第一百六二章 整数拆分

时间过的很快

计算中心即将下班,杨成在这里度过了有收获的一天。

“同学”。

科研人员一边整理文档,一边叫住杨成。

“我发现你对数论这块挺感兴趣的”。

“我就留个简单的问题,你回去琢磨吧”。

“请讲”,杨成尽管有些疲惫,精神还是很振奋的。

“我不知道你有没有听说过整数拆分问题”。

科研人员接着说道。

“简单来说,就是把一个正整数拆分成几个正整数之和”。

“例如:4可以拆分成5种不同的方式”。

4

31

22

211

1111

“那么,给定一个正整数n,你能否对它做拆分,并且罗列结果呢?”

“记住,不要尝试太大的数,这个结果随着n变大,会增长得非常快哟~”

“当n为50时,就有204226项结果”。

“而当n到了80,项数达到了15,796,476!”。

“嗯,好的”,杨成点点头。

这个问题,他有了些主意。

“感谢您的指导”。

第一百六三章 约翰教授的研究

计算中心的大门缓缓地闭合。

很快,街边的路灯亮起。

看着自己被拉长的身影,杨成在街边漫步。

城市的夜景,美丽而又深邃。

“系统妹子,我以后还可以来计算中心这边吗?”

“当然可以的”,系统及时地回复道。

“这里的大门永远为你敞开”。

“对了”。

“约翰教授在研究一些有趣的东西呢!”

“要不要去看看?”

“马上出发吧!”,杨成立马就答应了。

自己正愁晚上没地方去呢!

一座小小的院落,居室里一盏昏黄的灯亮着。

年迈的教授约翰,捋着他的花白胡子,饶有兴趣地打量着眼前的年轻人。

“你小子”。

“晚上不陪你的那些邋遢朋友们厮混”。

“倒有兴致来看我这把老骨头的研究”。

“您见笑了”,杨成挠了挠头。

“上次在热气球上跟您请教了很多问题”。

“这次还要多学习才是”。

“年轻人,不错!”,约翰教授赞叹道。

“上次的法国香槟浪费了”。

“老头子我没什么可以招待你的”。

“那就给你看看我的最新研究吧!”

第一百六四章 质数蚁(上)

约翰领着杨成来到他的工作室。

这里的各种仪器摆放的整整齐齐,一丝不苟。

最显眼的当属一台闪烁着荧光的电脑。

屏幕上,乍看之下,有着一连串的数字序列。

2,3,4,5,6

“您的研究成果,就是这个序列吗?”

杨成道出心中的疑惑。

就是一个从2开始的递增序列嘛。

有什么显眼的地方?

“不不不”,约翰教授摆摆手。

“你仔细观察2这个数字”。

杨成凑近了电脑一看。

2上面似乎有个小黑点。

咦?

竟然是一只蚂蚁!

它停在2这个数字上面一动不动。

杨成伸出食指,想把它弹走。

“喂!你干什么?”

“不要乱动啦!”

约翰教授急忙劝阻道。

杨成只好悻悻地缩回手指。

不就是一只蚂蚁嘛!

值得这么大惊小怪?

“咳咳”,约翰一声咳嗽。

“年轻人,你可不要小瞅了这只蚂蚁”。

“它是能帮我解决问题的!”

第一百六五章 质数蚁(中)

“这是质数蚁”,约翰教授解释道。

“它是一种倔强而顽固的动物”。

“如果你把它放到这样的数字序列上面”。

“它将一直逗留,直到整个序列只剩质数”。

还有这样的生物?

杨成顿时十分惊奇。

“为此,我设计了一套算法”。

约翰望着荧屏,眼中炯炯有神。

“假设有指针指向蚂蚁在序列中的位置”。

“最开始蚂蚁站在了2这个数字上面”。

“每一轮,蚂蚁按照如下策略移动:”

“如果当前所站的数字是质数”。

“那么,蚂蚁向前移动一个数字的位置”。

“如果当前所站的是合数”。

“找出这个合数的最小因数f”。

“以4这个合数为例:”

“4最小的因数是2”。

“替换4为4除以最小因数f的结果”。

“也就是2”。

“让蚂蚁后退一个数字”。

“将4之前的数字,也就是3”。

“替换为3f”。

“也就是5”。

“经过这样一摆弄,整个数字序列的前端几个数变成了:”

2,5,2,5

“观察到一个现象没?”

“它们全部成了质数!”

第一百六六章 质数蚁(下)

“接下来”,约翰教授意味深长地说道。

“小伙子,轮到你动动手了”。

“怎么让这只顽固得可爱的质数蚁终止它的使命”。

杨成搓了搓手,开始了思考。

首先,肯定需要一个判断质数的方法。

这个方法,他早已烂熟于心。

如果是合数,需要提取它的最小因数。

所以一个提取方法也是需要的。

有了这两个方法,剩下的步骤按照老头子说的做就ok。

杨成调出编辑器,三下两下就搞定了。

他点击提交代码。

荧幕上的小黑点,那只质数蚁,开始了漫步。

只见它先从2移到3。

接着从3移到4。

4这个数字变成2。

蚂蚁倒退到3。

3变成了5。

20次漫步后,整个序列变成了:

2,5,5,3,3,5,2

已经是面目全非了。

质数蚁又停留了片刻,它的触须轻轻地晃动着,似乎在感应着什么。

接着,它离开了序列,头也不回地走了。

约翰教授脸上流露出微笑。

“如果研究者也有质数蚁这样执着的品质,那么一定会有所收获”。

第一百六七章 项目经理

“教授,感谢您的指导”。

“再会!”

杨成从约翰的小院中走出来。

一阵寒风掠过,杨成不禁缩了缩身子。

夜空有一轮皓月高悬,和城市的夜景,交相辉映。

然而,这里并没有属于杨成的立锥之地。

他没有立即返回任务中心,而是寻思着。

我该不会要到桥洞下,打个地铺吧?

就在杨成犹豫不决的时候。

他的短信箱突然亮了。

把闪烁着的短信箱一点开,一条最新讯息映入眼帘。

“你小子,在哪里荡?”

“项目出问题了,赶快回来解决!”

讯息的署名是项目经理。

紧接着,杨成眼前出现了一个选项卡。

接收?or否决!

长夜漫漫,能做做项目,似乎也是不错的选择呢。

起码比挨冻到天亮强!

杨成毫不迟疑地摁下了接收键。

选项卡立刻消失不见了。

天空的寒月眨了眨眼睛,夜空错乱开来。

场景发生了切换,伴随着延迟感。

第一百六八章 版本问题(上)

下一刻,杨成出现在了一栋高档写字楼内。

与其它楼层的漆黑一片相比,他们这公司就显得灯火通明了。

还有十几个码农在各自的“小格子”里通宵奋战。

“大家加把油”。

其中一个戴着金边眼镜的中年男子,鼓励大伙。

“距离项目上线只有一个星期了”。

说着,这位疑似项目经理的人走到杨成身边。

他手里拧着一盒咖啡,递给杨成。

杨成接过咖啡,眼中很是不解。

“小杨啊”。

项目经理语重心长地跟他讲道。

“咋们项目的某个版本出了问题”。

“后来的版本都是依赖先前的版本”。

“所以,这个坏的版本后面的版本都是坏的”。

“咋们有n个版本”。

[1,2,,n]

“我希望你能找出源头,也就是第一个坏的版本”。

“时间紧迫得很哪”。

“必须速度点”,项目经理扶了扶眼镜。

“做完之后,我给你们调休”。

“怎么样?”

第一百六九章 版本问题(中)

“那我怎么判断版本的好坏呢?”

杨成两手一摊。

总不能一个一个版本地去分析吧!

“嘿嘿”。

项目经理一声奸笑。

“这个你不用担心”。

“我们提供了api”。

“一个用来验证版本的isbadversion方法”。

“你只要传入版本号,就会自动验证,并且返回bool值”。

“原来如此”,杨成顿时明白了。

敢情是只需要编写查找过程就行了。

具体版本验证问题不用自己管。

“那很容易啊”。

杨成从盒里取出一小包咖啡。

他随手拿了个茶杯。

把小包咖啡倒进杯中。

“从第一个版本开始验证,顺序遍历”。

“直到找出第一个坏的版本为止呗”。

听到杨成的答案,项目经理表情变得凝重起来。

“小杨啊”。

“多想想,不要轻率地下结论”。

“这肯定不是最好的解法”。

杨成端起装了咖啡的茶杯,站起身子。

“请您稍等”。

“我先去泡杯咖啡”。

第一百七十章 版本问题(下)

盛满了咖啡的茶杯,表面蒙着一层水雾。

杯中液体微微荡漾,散发着浓郁的香味。

杨成轻抿一口,顿时感觉神清气爽。

深夜的瞌睡似乎也驱散了不少呢。

他开始思索这个问题。

顺序遍历判断,的确不是个好方法。

如何最小化判断次数,是这个问题的关键。

这个问题似乎跟二分搜索有关联?

杨成突然想到这点。

肯定是有所区别的,但思想上有共性。

二分搜索不断缩小区间的做法在这个问题同样适用。

不过得做一点小小的改变。

杨成在脑海中飞快地整理思绪。

假设left指针指向第1个版本。

而right指针指向第n个(最后一个)版本。

取left与right指针的中间版本mid版本。

如果mid版本是坏的,有一个问题值得注意:

它有可能是第一个坏的版本,我们无法确定。

所以将right指针指向mid版本。

相当于在右边缩小区间。

而如果mid版本是好的,说明一个问题:

第一个坏的版本肯定是在mid版本的右侧。

所以将left指针指向mid1的版本。

相当于在左边缩小区间。

在left和right做出改变后,继续分析mid版本。

重复这个过程

直到left与right指针碰面。

此时right指向的版本,就是第一个坏的版本。

思绪理通顺了,编写代码是水到渠成的事儿。

在项目经理的注视下,杨成写出了一段短小而精悍的代码。

他长吁一口气,干了这杯咖啡。

项目经理微微点头,拍拍他的肩膀。

“小杨啊,继续好好干”。

“我在你这个年纪,可是吃苦耐劳得很呢”。

公司里,依然灯火通明,热火朝天。

而窗外的黑夜却已是寂静一片。

第一百七一章 结束加班

加班的时光过得很快

窗外的月光由浓郁转淡,最后又隐匿了踪迹。

朝阳升起,呼之欲出。

“小伙子,做得不错,早点回去歇息吧!”

项目经理给予肯定。

杨成这才放下手头的工作。

他有些摇摇晃晃地离开座位。

这种如坐云端的感觉,自己有多久没体验过了?

还是大一那会儿,和几个哥们去网吧通宵,早上回寝室才有这种飘飘欲仙。

岁月不饶人啊!

转眼间,自打走上编程的道路,身体是一年不如一年了。

迟早身子会被掏空

终于走上了电梯,杨成突然想起一个典故。

曾经有记者问一位nba巨星,为什么会取得如此成功。

nba巨星反问他:你见过洛杉矶早上4点的样子吗?我见过!

杨成走下电梯,走出大厦。

他看到那冉冉升起的朝阳,现在起码是6,7点了。

他不禁想吐槽:

随便一个程序员都可以秒杀这位球星呢!

第一百七二章 计程车

杨成站在街边,有些百无聊赖。

接下来该去哪里呢?

要是有个地方,能美美地睡上一觉就好咯!

“嘀嘀!”

这时,一阵鸣笛声吸引了他的注意力。

这是一辆大街小巷随处可见的出租车。

司机探出个脑袋,笑眯眯地看着他。

“小伙子,要不要我带你四处转转?”

“很便宜的哟~”

杨成二话没说,打开了后座的车门,钻了进去。

他实在是没地方去了。

“年轻人,你是干it的吧?”

司机大叔热情地问询道。

“您怎么知道的?”,杨成有些诧异。

“这个时候下班的,不就是麽”。

司机发动车子,行驶在城市的街道上。

“尊敬的乘客,欢迎您乘坐编号1729的我公司出租车,如果您有任何疑问,可以拨打热线”

这时,一阵电子音响起。

司机大叔瞅了瞅后视镜,发话了。

“小伙子,你觉得我这编号,数字1729怎么样?”

“很普通啊”,杨成有些不以为意。

既不是“888”。

也不是“666”这样的吉利数字。

有什么稀奇的吗?

第一百七三章 的士数

“不不不”,司机大叔摆摆手。

“这个数字可是有趣的很呢”。

“它能够用2种方式表示成,另外2个正整数的立方和”。

“啊?”,杨成嘴巴张大得能塞进个苹果。

“请指教”,他当然不会放过这样的学习机会。

司机大叔一只手操作方向盘,另一只手从口兜里摸出根烟来。

“1的立方还是1,对吧?”

“12的立方是1728”。

“11728=1729”

“这就是第一种方式”。

“嗯嗯”,杨成点点头,心算了一番。

“至于第二种方式嘛”。

“你算算9和10的立方和,就知道了”。

杨成调出系统自带的小工具,计算器。

他摁了几个键。

“还真是1729呢!”

杨成顿时很信服,他又有些疑问。

“1729这个数字在学界有没有自己的分类呢?”

“这样特殊的数字”。

“的士数!”,司机叼着根烟,一踩油门。

“搜噶”,杨成在心里面记下了。

那其它的的士数又是多少呢?

他心想着,这个问题似乎有点难度诶。

疲倦感袭来,不一会儿他就打起了呼噜。

第一百七四章 黑衣人

躺在座位上,感受那车子轻微的颠簸,就像在云朵上小憩一般。

杨成舒舒服服地睡了好久。

他迷迷糊糊地睁开眼睛。

还是熟悉的出租车内,车窗外已是漆黑一片,看样子已经天黑了。

咦?

这司机大叔怎么感觉不一样了?

杨成擦了擦眼睛,以为自己看错了。

只见他一袭黑色风衣,戴着一副墨镜,握着方向盘的手还穿着黑色手套。

“你醒了”,司机沉声说道。

“是该告诉你一些关于这个世界的真相了!”

“真相?”,杨成吓得吃手手。

“什么真相”。

一种拨开迷云的既视感。

司机大叔取下墨镜,露出他那饱经沧桑的脸,眼中闪烁着睿智而坚定的光芒。

“其实,出租车司机只是我表面上的身份”。

“我的真实身份是”

司机欲言又止。

“联邦调查局的探员?”

杨成小心翼翼地猜测到。

“不不不”,大叔摆摆手。

“星际移民局的干事”。

“也就是你们俗称的黑衣人”。

第一百七五章 第五维度

“我问你”,司机大叔转过身子。

“你的积分是多少?”

杨成愣了愣,调出积分面板一看。

“350分,也算击败了百分之七十的人”。

“那你知道,为什么有些人能拿到2万分以上”。

大叔用暗示的语气问道。

“不知道,可能他们比较有天赋吧!”

“呵呵”,司机脸上流露出玩味的笑容。

“答案很简单”。

“大部分的这些挑战者都是来自于第五维度的高智慧种群”。

“第五维度?!”,杨成难以置信地睁大了双眼。

“也就是说,那些高端玩家,大部分都是外星人?”

“没错!”,大叔很肯定。

“不用太担心,小伙子”,司机脸上有着一丝怜悯。

“一个好消息是:我司的科学家发明了一种测试方法”。

“我们可以测试玩家们的昵称,来判定他们的宇宙能量等级强弱”。

“从而鉴别出这些外来世界的访客”。

第一百七六章 宇宙能量等级

司机大叔一抖身上的风衣。

“接下来,我将传授你一套,计算宇宙能量等级的方法”。

“仔细听好咯:”。

拿到一个昵称,如果里面含有数字,将“0123456789”各自替换为“olzeasbtbg”。

因为来自第五维度的人,他们都有一个识别。

“mxyzptlk”

我们从左到右遍历这个识别串,如果当前字符,在昵称中也能找到,那么替换当前字符为1,否则(昵称中找不到),替换为0。

注意,这个过程是忽略大小写的,也就是说,大写字母m和小写字母m视作相同。

然后,我们就能得到“00000000”,类似于这样的字符串。

接着,把这个字符串,当作二进制,转换成十进制。

最后,把这个十进制数,乘以100,除以255。

“这个分数,就是宇宙能量等级强弱的判断依据”。

这个过程似乎也不是很复杂啊。

“小伙子”,司机大叔意味深长地看着杨成。

“接下来,带你去实战一番”。

“咋们去揪出那些第五维度的家伙们!”

第一百七七章 街舞青年

灯红酒绿的城市广场一角。

这里远离跳广场舞的大妈们,但也绝非安静之地。

“呜哈!呜哈!”

“怎么改!”

“呜哈!呜哈!”

“哈哈!”

嘈杂而劲爆的街头音乐响起。

一群穿着时髦的青年在空旷的场地上纵情地跳街舞,宣泄着内心的激情。

为首领舞的男子,他的动作娴熟,一套下来,犹如行云流水一般,衔接得恰到好处。

只是他那黑色的瞳仁,不经意间会变成银色。

更是有着幻灯片般的效果,出现在眼眶中。

周围的人们对此毫无察觉。

没过多久,一辆普普通通的出租车停在了不远处。

出租车里,杨成脸上满是警惕之色。

“放松点,伙计”,司机大叔看出了他的不安。

“第五维度的人,都是有着高智慧的,他们可不是野蛮人”。

杨成这才稍稍放松了些。

“那个领舞的人”,大叔指着一个方向。

“用我刚才教你的算法”。

“计算他的宇宙能量等级”。

第一百七八章 砸场子(上)

杨成的大脑飞快地运转着。

他将目光聚焦在领舞者身上,很快便弹出了他的昵称。

“name:am4b0”

那么,第一步,去伪存真。

将昵称里面的数字替换成对应的字母。

得到“amabo”。

第二步,识别串替换。

识别串“mxyzptlk”,替换成二进制字符串“10000000”(只有字母m在昵称中能找到)。

第三步,二进制转十进制。

得到数字128。

第四步,套用能量计算公式。

128乘以100除以255,保留小数点后三位。

得到最终结果:50196

“告诉我,结果多少?”

司机大叔目光沉稳。

“50196”,杨成小心翼翼地报出这个数字。

“嗯”,大叔轻轻地应了一声。

“你记住”。

“普通人一般得分都会在50以下,他们散发不出强大的宇宙能量”。

“如果得分在90以上”。

说到这里,司机顿了顿,目光闪烁。

“那就不是我能够应付得了的问题”。

“至于50刚刚出头嘛”。

“你随我去会会它”。

第一百七九章 砸场子(中)

出租车上走下来两个人。

走在前面的中年人一袭黑衣,与夜色完美融合。

只见他面沉似水,给这夜晚平添了一份肃杀之气。

杨成走在后面,给自己壮胆。

跳街舞的人们自然注意到了,这来者不善。

他们纷纷停止了动作,把目光转向这边。

领舞者走上前几步,双手叉腰,挺起胸膛。

此时,双方距离不足五步。

“你们是警察吗?”

领舞者率先发问,他上下打量着这两个人。

“警察可管不了跳街舞”。

“我是,星际移民局的干事”。

“出示你的移民证!”

大叔不打算陪他们开玩笑。

“什么?!”

周围的人听了顿时目瞪口呆。

“星际移民局?”

“老鬼,你是不是电影看多了?”

有好事者嚷嚷道。

“我是认真的”。

司机大叔依旧面无表情,只是他的手悄悄地伸进了口兜中。

领舞者的脸上却是十分凝重,似乎有所忌惮。

“给你十秒钟考虑”。

大叔宣布了最终期限。

“我如果不呢!!!”

领舞者一声狂吼,露出了獠牙。

第一百八十章 砸场子(下)

说那时快,领舞者话音刚落,用一只铁拳朝大叔攻过来。

只见那大叔不慌不忙,侧身一跳,躲过这一击。

“你这是自寻死路!”

司机大叔从口兜中摸出一物。

杨成仔细一看,原来是一个漆黑的剑柄。

大叔摁了摁上面的按钮。

“嗞嗞”

一道粉红色的光柱眨眼间,冒出一米有余。

原来是把激光剑!

大叔把这利器紧握,然后狠狠地朝领舞者劈砍过来。

领舞者见势不妙,一声怪叫,拼命闪躲。

大叔不依不饶,一连挥出了十几剑,招招直指其要害。

只见那领舞者满头大汗,显然有些招架不住了。

“别打了!”

“我认输!”

领舞者慌不择路地说道。

“晚了”。

司机大叔犀利地一剑洞穿了他的身体。

“啊啊啊!!!”

领舞者一声凄厉的惨叫,难以置信地看着自己那碗口大的伤口。

“你的id我注销了!”

司机收回激光光柱,傲然屹立。

领舞者的身体化作一道黑雾,转瞬间烟消云散。

一旁的街舞青年们,原本还想看好戏,此时却是一个个呆若木鸡。

“这大叔不是普通人诶!”

青年们四散奔逃。

第一百八一章 深藏身与名

重新坐上出租车,杨成感觉这一天发生的事宛然如梦。

他所认定的世界观,悄然发生改变。

原来,你所看到的,也许只是冰山一角呢。

“大叔,你们黑衣人的职责是什么?”

杨成试探地问道。

“维护游戏的平衡,与破坏规则的人做斗争,就是我们的使命”。

司机身上的黑衣不见了,取而代之的是一套便装。

“嗯”,杨成点点头。

“我可以申请成为你们中的一员吗?”

大叔迟疑了片刻,似乎在斟酌。

“你不合适”,他给出了结论。

“关键时候,你躲在了我的后面”。

“这是明智的做法,但也决定了我们不可能成为队友”。

“对的”,杨成坦然承认。

“能认识您,跟您经历了这些事,我很荣幸”。

“就在这儿下车吧”。

司机大叔把车停在拐角处。

“天下无不散之宴席”。

“年轻人,祝你好运”。

杨成走下出租车,看着它缓缓开动,消失在街的尽头。

谁能想到,一个出租车司机,竟然肩负着如此的使命呢。

第一百八二章 设备故障

杨成漫步在街头,天空不知什么时候,下起了淅淅沥沥的小雨。

雨滴淋湿了他的衣服,带来一丝丝寒意。

一切的一切,如此真实。

就在他感到有些彷徨的时候,短信箱突然变成了通红的颜色。

有人给他发了消息!

杨成打开信箱一看,原来是项目经理。

“小杨啊,公司的设备出了点故障,你来看看吧!”

杨成顿时有点小郁闷,给他回复道。

“公司没有运维吗?!”

这本来就该是运维做的事儿,开发人员可不管哩!

项目经理回信的速度绝对是毫秒级的。

“运维请假了啊,来看看咯!”

杨成于是点击了确认键。

天空的场景立即发生了切换。

身上被雨水沾湿的衣服恢复如初。

“可把你盼来了!”

戴着金边眼镜的项目经理一看见杨成顿时两眼放光。

他邀请杨成坐在软椅上,指着一台设备说道。

“这个硬盘出了点问题,上面的数据丢失了”。

“高手帮我恢复下”。

第一百八三章 镜像恢复

“有没有镜像文件?”

杨成问项目经理。

一般公司为了防止硬盘损坏,数据丢失,通常的做法是用其它盘保存镜像信息。

这样恢复起来很方便,但效率并不高。

首先,镜像文件占用的空间很大。

其次,还原的速度较慢。

“有的”,项目经理递给杨成一个u盘。

“那就很好办咯”。

杨成一边用镜像还原,一边和项目经理闲聊。

经理递过来一小盒糖果,看那包装很是精致。

杨成接过,打开倒出几粒。

有黑色的,散发出浓郁的香味,看起来像是巧克力豆。

也有白色的,像是牛奶味或香草味。

杨成塞进嘴里,吧唧吧唧地咀嚼起来。

那种入口即溶,丝滑的感觉,真是不错!

吃了人家的东西,这印象嘛自然改善了几分。

“小杨,恢复成功了”。

经理拍拍杨成的肩膀。

“您还有什么事吗?”

杨成意犹未尽地抹了抹嘴。

“哈哈”。

经理爽朗地一笑,眼镜上闪过一道精光。

“你既然来了,不如帮我重新设计一套数据恢复机制”。

“如何?”

第一百八四章 异或运算

其实,杨成刚才就在思考这个问题了。

有没有更好的方法来进行数据保存和恢复?

答案是肯定有的。

可以使用xor(异或运算)来做奇偶验证!

一个简单的应用会像是这样:

首先,把硬盘上的数据分割成几份相同大小的数据块。

假设原始数据是这样:

[0,0,0,1,1,1,1,0,0,1,0,0,1,0,1,0]

我们从中间劈开成2块,分别命名为a和b:

a:[0,0,0,1,1,1,1,0]

b:[0,1,0,0,1,0,1,0]

然后,创建一个备份盘c,用来存储奇偶信息。

接着,对a和b的每一个相同位置,作异或运算。

a[0]=0,b[0]=0,异或得0,存入c[0]

a[1]=0,b[1]=1,异或得1,存入c[1]

a[2]=0,b[2]=0,异或得0,存入c[2]

一趟遍历下来,备份盘c被填充满信息,得到:

c:[0,1,0,1,0,1,0,0]

这么做有什么好处呢?

一旦保存原始数据的a盘或者b盘损坏,可以通过c盘重新计算异或来恢复。

假设a盘数据丢失了,我们对b和c的每一个相同位置,作异或运算。

这样就能还原出a盘数据。

另外,可以观察到一个有趣的现象:

和镜像保存所需的空间相比,这种方式得到的c盘空间是不是只有一半?

空间效率大大提高了!

嗯,就是这种了,得跟项目经理好好谈谈。

第一百八五章 最好的奖励

“小杨啊”,项目经理竖起大拇指。

“你的方案真的很不错”。

“说吧,你想要什么奖励?”

“我们公司尽可能地满足你!”

“我只想要一盒最好的巧克力~”

杨成舒服地把双手交叉在后脑勺。

“这么简单?”

经理表示很easy。

“唯一的问题是,我怕你吃多了会长胖”。

“哈哈!”

两人不约而同地大笑起来。

五分钟后,杨成如愿以偿地得到了一盒高级巧克力。

杨成在享用美味,心情愉悦,项目经理乘机提出新要求。

“咋们公司的系统即将上线”。

“一连几个星期,项目组都是彻夜奋战”。

“但测试组却反馈了一个问题:系统在运行几个钟头后,系统响应速度就会变得难以忍受”。

“咋们的开发人员辛辛苦苦摸索了一个星期,系统性能依然没有得到实质性的改善”。

“大侠,帮我们看看吧!”

第一百八六章 内存泄漏(上)

宽敞的开发部办公室里灯火通明。

“给大家介绍一下,这位是我从外面找来的老程序员,他来帮大家解决问题哈!”

项目经理拿了张椅子,让杨成坐下。

我看起来有这么老嘛?

杨成在心里面嘀咕。

然后,他开始看屏幕上的项目代码。

原来,这项目后台用的java技术啊。

杨成很快就发现了问题。

“咦?这些对象数组的元素怎么一直没有释放?”

他有些疑惑地问道。

在旁边观看的项目组长顿时就不服气了。

代码是他写的,总不能让一个后生晚辈来指点吧!

“java不是有垃圾回收机制吗?不用我们手动释放吧!”

“哦”,杨成轻轻地应了一句,接着看代码。

“这里也没有释放”,他发现了更多的问题。

“”

这位组长的代码实在是让人无语了。

“java一样会有内存泄漏的!”

杨成肯定地说道。

第一百八七章 内存泄漏(中)

“而且,java的设计者向我们这些开发者许下了垃圾回收的美好承诺,因此导致java的内存泄漏更为隐蔽,往往更不为开发者所注意。”

杨成耐心地继续解释道。

“一个内存泄漏点导致的内存泄漏可能并不多,但如果并发的用户一多,运行时间一长后,内存泄漏就会显得比较可怕起来”

很快,半天时间过去了

杨成把项目中一些看上去很普通的代码做了调整,然后提交给测试组。

测试结果:系统性能得到了明显的改善。

于是,开发组长召集项目组的人开始重新研究内存回收相关的问题。

“成哥”,开发组长不好意思地挠了挠头。

此时的他,对这个年轻人可以说是心悦诚服。

“你能给我们讲讲内存泄漏的相关知识吗?”

“当然可以的!”

杨成也不卖关子。

“为了搞清楚程序中是否存在内存泄漏,我就先谈谈什么是内存泄漏吧!”

第一百八八章 内存泄漏(下)

“程序在运行过程中会不断地分配内存空间,那些不再使用的内存空间应该被即时回收,从而保证高效利用”。

“如果存在无用的内存没有被回收,这就是内存泄漏”。

杨成先给出通俗的定义。

“拿c程序来说,对象占用的内存空间都必须由程序员显式回收”。

“一旦程序员忘记回收,就会产生内存泄漏”。

“所以嘛,一个不负责任的c程序员是很危险的!”

“哈哈!”

在场的java程序员都笑了,表示自己毫无鸭梨。

“而对于java程序来说”。

杨成话锋一转。

“显然没有c这么多的顾虑,因为有垃圾回收机制”。

“但也不是高枕无忧喔!”

“java虚拟机采用有向图来管理内存中的对象”。

“如果有一些对象,处于有向图可访问的范围内,但程序以后永远都不会再使用它们,那么它们所占用的内存空间也不会被回收”。

“这就是java内存泄漏的原因!”

第一百八九章 内存管理(上)

“成哥,你讲的很浅显易懂”。

项目组长扶了扶眼镜。

“大伙都听明白了”。

“还有就是,你能不能给出点内存管理的小技巧呢?”

“嗯”,杨成思索了片刻。

“其实对于不同的编程语言,优化的技巧不尽相同”。

“但有些策略是大部分情况下都适用的”。

“比如,方法的局部引用变量往往会随着方法的结束而变成垃圾,它的生存周期是很短的,大部分时候我们不用管”。

“但如果这些局部引用变量使用完以后,还需要执行耗时,耗费内存的操作或方法”。

“那么尽早释放无用对象的引用,就能提高程序的运行性能”。

“至于第二点小建议嘛”,杨成清了清嗓子。

“缓存经常使用的对象!”

“缓存本身就是一种以牺牲系统空间来换取运行时间的技术”。

“一般来说,空间没有时间值钱”。

“一个慢得跟蜗牛一样的系统是没有用户愿意掏钱滴!”

“啪啪啪啪”

听到这里,台下响起了一片掌声。

第一百九十章 内存管理(下)

“我刚才说的,都是通用的优化技巧”。

“既然大家的系统用的java作为后端,那我再谈谈针对java可做的内存优化”。

杨成扫视大家,眼睛炯炯有神。

“第一,尽量少使用静态变量”。

“一种很可能存在的糟糕情况就是:”

“某个对象被静态变量所引用,垃圾回收机制通常不会回收这个对象所占的内存”。

“换句话说,静态变量引用的对象,常驻内存”。

“所以大量地使用静态变量,是对内存资源的浪费!”

“至于第二点嘛”。

“考虑使用软引用”。

说到这里,杨成不由得两眼放光。

“朋友们,软引用是个好东西!”

“当内存足够时,它相当于普通引用”。

“而内存紧张时,它就成了救火队员,牺牲自己,释放所引用的对象,从而腾出内存空间来”。

“这才是受任于败军之际,奉命于危难之间的壮士哇!”

“哈哈!”

在座的程序员们都流露出会心的微笑来。

“成哥,讲的nice!”

项目组长拿出一个精美的记事本,开始一心一意地记录这些曾经让他十分苦恼的内存泄漏的解决方法。

第一百九一章 篮球之梦(上)

“大家还有什么问题吗?”

杨成喝了口水,清清嗓子。

“咋们还是先消化下吧!”

项目组长摆摆手。

“贪多了嚼不烂咧!”

杨成于是开始呼唤系统。

“系统妹子,哥哥调试了这么久,好累啊!”

“有没有放松点的项目啊?”

“要不要现场看看洛杉矶湖人队的比赛?”

系统建议道。

“有科比布莱恩特喔!”

听到这里,杨成顿时来了兴致。

他曾经饱览nba的历史,那些传说中的大能。

“篮球之神”迈克尔乔丹

“魔术师”约翰逊

“大鲨鱼”奥尼尔

那一个个沉寂在岁月中的字眼。

中学时期,他也幻想拥有这些超人般的天赋。

但很显然,他不是那样的英雄,甚至只能远远地看着同学们打球,为他们呐喊助威。

但是

即使无法实现的梦想,那也终究是个梦啊!

我能做的力所能及之事,就是现场为你们加油!

第一百九二章 篮球之梦(中)

位于洛杉矶的斯台普斯球馆,今夜群星璀璨。

拥有主场优势的湖人队迎战犹他爵士。

上半场战局十分胶着,下半场爵士发力,大部分时间内,都取得了两位数的领先优势。

“我们必须赢得这场比赛!”

“即使对手是科比!”

爵士队当家球星戈登-海沃德如此对自己说。

当比赛逐渐步入尾声,最后的时刻即将到来,爵士队似乎看到了胜利的曙光。

科比的眼中一如既往地沉着,他的进攻依然具有侵略性。

他就如同一团团熊熊燃烧的火焰,照亮队员前进的道路。

有科比在,我们不会输!

爵士队的球员们渐渐发现,越来越难以防范科比的进攻了。

“不行,这样会被逆转的”。

海沃德立马组织了顽强的防守,迫使科比更为艰难地出手。

在第四节还剩3分钟的时候,爵士队依然领先10分。

比分逐渐接近,但鹿死谁手,犹未可知。

现场的球迷开始变得疯狂。

他们不能允许科比和他的湖人队在主场尝到失败的苦果。

“我们不能输!”

这是现场大部分人的心声。

第一百九三章 篮球之梦(下)

看台的一个角落里,安安静静地坐着一个年轻人。

他目光深邃,看了眼比分牌,然后把目光聚焦在科比身上。

他能够感觉到,科比的气场在悄然发生改变。

如果说,之前的科比是一位驰骋沙场的大将。

那么现在,他就是睥睨天下的君王!

当科比逐渐进入状态以后,爵士队就知道他们已经防不住他了。

他的身影,犹如虎入羊圈,在爵士们的防线里撕开一道道口子。

“当他进入状态以后,你基本上无能为力”。

海沃德不得不承认这个悲哀的事实。

但作为一名优秀的球员,他很快做出了最英明的决定。

拖!

比分差距依然在缩小

5分

2分!

现在爵士只领先2分了!

最后的决战到来,现场的观众屏住了呼吸。

拼了!

爵士在5米,6米外两记长投,把比分差距扩大到8分。

1米外,2米,3米,科比连连出手,发发命中!

只差1分了!

“嘀”

这时比赛结束的哨声无情地响起,就如同一记重锤击打在人们心中。

湖人竟然输了?

第一百九四章 时光回溯(上)

体育馆的灯光在那一刻通通熄灭,黑暗笼罩了整个会场。

杨成听到这漆黑一片中,有人在低声抽泣。

这是心碎的声音。

他能感受到球迷们的心声,但又能改变什么呢?

就在他准备离席的时候,一个声音悄然出现。

“如果给你一次机会,你会怎么做?”

“我一定会帮科比和他的湖人队力挽狂澜!”

杨成毫不迟疑地说道。

“很好”,那声音带着淡淡的赞许。

“我会将时光回溯到最后五次进球之前”。

“而你,将拥有一项特殊的能力——可以改变三分线的位置”。

“现在,运用你的魔力和头脑,改变他们失败的命运吧!”

杨成眼眶中浮现出两项数据:

湖人队:[1,2,3]

爵士队:[6,5]

很明显,里面的数字表明是多少米外投篮命中的。

湖人队最终只输了1分,而5球之前,他们是差2分。

怎么移动三分线来帮助湖人逆转呢?

第一百九五章 时光回溯(下)

很显然,必须将三分线移到最有利于湖人队的位置。

如果将三分线移动到1米处,比分会有怎样的变化呢?

那样,湖人就是3个三分,爵士2个三分。

湖人的总分将反超1分!

嗯,就是这样。

如果不用考虑通用情况,大部分人略加思忖就可以指出。

而如果给定两组数据,求怎样移动三分线最有利于其中某一队。

那么就得考虑0米到max1(两组数据中最大值加1)之间的数据,看怎么选取。

“把三分线移动到1米的位置!”

杨成宣布了最终的答案。

体育馆内的抽泣声戛然而止,世界在那一刻陷入了宁静。

下一刻,馆内的灯光全开,雷鸣般的欢呼声响彻全场。

杨成看到那比分牌上的数据,内心也是充满了欣喜。

他把目光放回赛场内,正在庆贺的湖人队员们身上。

科比似乎觉察到了什么,回过头盯着杨成坐的方向。

他咧嘴一笑,向观众席竖起大拇指。

“you_are_the_best!”

第一百九六章 离席

看着科比的身影逐渐消逝,杨成感觉自己再无遗憾。

麦克阿瑟将军在国会的告别演说上有句名言:

老兵不死,只是渐渐凋零。

科比这一代巨星也会长期存在于球迷们心中吧!

想到这里,杨成离开座位,踏上新的旅程。

“系统妹子,有什么好的任务推荐吗?”

“人工智能系统正在维护中,请您稍后尝试”。

“”

“系统妹子居然罢工了”,杨成顿时很诧异。

“好吧,那这样”。

“随机抽取关卡!”

虚空中一个大骰子,咕噜噜地转了几个圈,掷出点数。

这时,杨成眼前出现了一段开场动画。

“在这未知世界的某个角落,一场无人知晓的战争正在爆发”

“你可以选择暂时逃避,但无法永远无视”

“拿起你的枪,鼓起勇气,为了荣耀而战吧!”

请选择:

“直接参战”or“战场评测团”

杨成本来想参战,但一想到那段跳伞的阴影,顿时胆怯了几分。

“那就战场评测团吧!

第一百九七章 字母之战

冰雪皑皑的山脉顶端,这里积雪终年不化,却有一座中世纪欧洲风格的古堡屹立于此。

古堡内却是四季如春,壁炉内源源不断地有暖气供应。

宽敞的客厅内,精致的沙发上端坐着四条大汉。

其中为首一人,头顶皇冠,手执镶钻宝剑,在他后背上印着一个小写字母w。

“w大哥,你要尽快拿主意啊!”

其他三人把目光聚焦在皇者身上。

“p,b,s三位贤弟”,w沉吟片刻,一捋胡须。

“26个字母同气连枝,我岂能做那不义之事!”

“可是,人家不把你当兄弟啊!”,p一拍大腿,脸上很是忿忿。

“m那小子到处煽风点火,说w你不配当大哥”,b痛心疾首。

“真有此事?”,w顿时变了脸色。

“岂止!”,s小心翼翼地说道。

“我听说,m联合了q,d,z,打算推翻你呢!”

w闻之顿时七窍生烟,只见他把那镶钻宝剑高高扬起。

“唰唰!”

“嘭!”

眼前的桌子被削去一角,木屑散落一地。

“干他丫的!”

第一百九八章 冷兵器之战(上)

寒风呼啸,大雪深数尺,天空中更是飘扬着朵朵雪花。

在这富有诗意的场景中,一场战争吹响了号角。

冰天雪地里,两个敌对的字母集团展开骂战。

“m,我之前把你当兄弟,没想到居然背叛我!”

以w为首的一堆字母,拿着刀枪棍棒,虎视眈眈。

“w,你老了,不行了”。

m振振有词,后面也围绕着一堆打手。

“昏庸无道之人,彼可取而代之!”

“兄弟们随我来,斩下它的狗头!”

m大手一招,率先发起冲击。

“杀呀!!!”

w顿时怒发冲冠,也是一堆人冲上前。

“嘭嘭!!”

字母们纠缠在一起厮杀,一时间天昏地暗。

山上的人激战正酣,那皎洁的天空却发生了变故。

一道神识从虚空中降下,扫视整个战场。

一个不带任何感情的声音响起:

“战场评测启动”

“开始胜率分析”

第一百九九章 冷兵器之战(中)

苍穹骤然变色,一张巨大的人脸浮现,向下俯瞰众生。

只见他戴着黑边框眼镜,满脸笑意。

这不是杨成本人么?

天空中发生了这么大的变化,却丝毫没有影响到字母们的战斗。

它们打得正嗨呢!

“根据战斗力进行建模”

杨成发布指令。

“系统分析战斗力中,请稍候”

对于判断胜率这个问题,当然是哪一方战斗力高,胜率就更高呗。

“红方w战斗力为4,p战斗力为3,b战斗力为2,s战斗力为1”

“蓝方m战斗力为4,q战斗力为3,d战斗力为2,z战斗力为1”

系统忠实地进行播报。

“居然连5的战斗力都不到”

杨成耸耸肩,这也太辣鸡了吧。

“统计总战斗力,并发布最终的胜率报告”。

杨成再次发布指令。

“两方战斗力总和极为相近,预测:平局概率较大。”

系统给出最终的判断。

听到这结果,杨成将目光投向山顶,那里的战斗接近尾声了。

第二百章 冷兵器之战(下)

山之巅,横七竖八地躺着很多奄奄一息的字母。

大部分字母都丧失了战斗能力,只有两位勇士还在为了荣耀而战。

“m小儿,接老夫一剑!”

w手执镶钻宝剑,朝m狠很劈来。

“老匹夫,今日定当一决雌雄!”

m挥动狼牙棒,向前招架。

“吭”。

兵器相撞,一时间火星四溅。

“呔!”

两者各不相让,使出吃奶的劲,定要压制对方。

局面僵持了一分钟

然而,还是没有分出个结果。

w老脸憋得通红,m也是气喘吁吁。

看来两位都是强弩之末了

“噗通!”

“噗通!”

w和m终于耗光最后一丝力气,双双跪倒在地。

尽管看对方的眼神都不善,但他们却奈何不了。

兵器滚落一边,第一次字母之战宣告了终结。

就在这时,天空传来一个浩大的声音:

“尽管没有分出胜负,字母间的仇恨却延续到了后世”

“战争设定进阶到热兵器时代”

第二百零一章 热兵器之战

沟壑纵横的阵地,空气中弥漫着刺鼻的硝烟。

“哒哒哒!”

“哒哒哒!”

随着几声枪响,一位字母战士倒下了。

百米之外的指挥所内,司令官w戴着望远镜,看到了这一幕。

“该死的,再这么下去,弟兄们迟早得拼光!”

“炮营准备,给我使劲地轰,炸死它们!”

于是,一台台巨炮被布置到了阵地后方。

“发射!”

随着一声令下,炮口内绽放出烈焰。

“嘭!”

“嘭!”

连连开火之后,对方阵地顿时遭了秧。

“唉呀!”

一堆字母被炸飞了。

“我的腿不能动了!”

“我的鞋!”

一时间战场上哀鸿遍野,数不清的惨状。

“什么?”

身穿军装的m难以置信地看着战场。

“对面竟然有威力这么大的武器”。

“哼!”

m一拍桌子。

“给我准备空袭!”

“长官”,副官q面有难色。

“两方阵地挨得太近了,我们也会被波及到的”。

第二百零二章 空袭

估摸着过了十来分钟,天空中传来飞机的轰鸣声。

两架轰炸机一左一右,围绕战场盘旋,观测地面形势。

隶属于w阵营的防空部队立刻拉响了警报。

“快!高射炮准备!”

仓库中一门门大杀器被拖了出来。

训练有素的字母士兵,瞄准了轰炸机。

“哒哒哒!”

凶猛的火蛇喷涌而出,在目标身上留下了一个个弹孔。

机上的飞行员顿时被激怒了。

哥还没下饺子呢!

你们就先动筷子了?!

于是,他深吸一口气,摁了摁那个致命的按钮。

机身上一个个巨大的弹仓被打开。

只见一枚硕大的bomb滚出来,从云端坠落。

紧接着,是第二枚

第n枚

眼看这一场浩劫即将到来。

“时间静止!”

一个系统音传来,画面瞬间凝固,定格在了这一时刻。

“战场评测启动”

“请进行空袭伤亡结果分析”

第二百零三章 伤亡分析

“系统动态生成战地图”

“bomb落点正在预判”

过了几秒钟,杨成眼前出现了一个二维的条形图:

“*zd*qm*wp*bs*”

可以看到,这个图中有代表军事作战集团的字母。

至于里面的星号,想必就是bomb的落地位置。

“请您注意,一颗bomb的威力巨大,足以摧毁相邻的军事集团!”

系统很快给出了提示。

杨成眉头紧缩,分析其中的含义。

也就是说,位于星号两侧的字母,都是牺牲品。

那不就很明显了么?

在这场浩劫中,没有字母能够幸存下来!

这就是战争的残酷。

杀敌一万,自损一万

“两败俱伤!”

杨成给出最终的结论。

只听见他话音刚落,画面恢复正常。

一个个小蘑菇云在地面接连绽放。

气浪掀起尘土,犹如残酷的死亡之舞,不断收割生命。

这场灾难持续了半个多小时。

待一切风平浪静,整个战场早已化作一片废墟。

那系统声音如期而至:

“战争设定进阶到核武器时代!”

第二百零四章 核讹诈

“总统先生,有来自m元帅的电话”。

秘书p递过来一个手机。

w接过,摁下了接听键。

一个粗鲁的声音传来:

“你们必须接受停火协议”。

“否则”

“我们将优先使用闪电风暴”。

w脸上顿时涨得通红。

“闪电风暴是吧?”

“我们也有!”

“还可以附赠核弹套餐呢!”

“嘀嘀”

这时,对面挂断了电话。

看样子,谈判彻底失败了。

“小p啊”。

w面色阴沉,似乎下定了决心。

“传我的命令:密切监视敌人的导弹基地”。

“同时,我们海基,陆基,空基的作战力量,随时待命!”

“最后还有一点:”

“把我那个装了核按钮的保险箱给拿过来”

第二百零五章 闪电风暴

“元帅,闪电风暴准备中”

“倒计时4分23秒”

“总统先生,核弹部署完毕”

“已经瞄准敌方所有的重要城市”

皎洁的天空,一尘不染,淡淡的云漂浮着,就如同一朵朵棉花糖。

然而,这样的祥和并没有维持多久。

刹那间,风云变色。

那祥云转眼变成了乌云。

“嘭!”

一声巨响过后,云层中电闪雷鸣,就如同银蛇飞舞。

似乎有什么在积蓄能量,那闪电越来越粗,频率也越来越快。

与此同时,一道无线电波在空间跳跃。

“急电:总统先生,敌方率先使用气象武器”。

然而,为时已晚。

只见那闪电伴随着飓风,开始了肆虐。

一栋摩天大楼在狂风中,轰然倒塌。

一座巨大雕像,被闪电劈成了焦炭。

整个大地陷入一片混乱。

再看那天色,一片昏暗,伸手不见五指,唯有姹紫的闪电。

一切的一切,犹如诸神之黄昏。

不过,这显然不是最糟糕的情况。

大部分字母都撤入了核避难所内,毫发无损。

第二百零六章 核战争

“总统摁下了核按钮,开始执行报复计划”

一道道无线电波传递到世界各地。

大洋深处,这里波涛汹涌,气象万千。

一头钢铁巨兽悄然浮出海面,那黑色的瞳孔带来死亡的威胁。

这赫然是一艘战略导弹核潜艇!

它停顿了数秒。

紧接着,只看见火光一闪,一枚巨型火箭呼啸而出,直愣愣地朝大气层外飞去。

这火箭其实是一枚利用固体燃料做推进的洲际导弹。

尽管是作为潜射型,它的威力也不容小觑!

远离闪电风暴影响范围的一处山地。

原本绿意盎然的地面不知什么时候出现了一个个深井。

这显然不是用来打水的。

没过多久,从井里面便钻出了足以毁灭世界的陆基洲际导弹!

与此同时,上万米的高空,一架大型战略轰炸机犹如大鸟一般,振翅高飞。

不过,它那身体内负载的,却是冰冷的核弹。

和以上种种威胁相比,闪电风暴就如同一个大点的爆竹,不足为虑。

就在这毁灭前夕,一个冰冷的声音传来,暂时定格了画面。

“战争评测启动”

“请进行核战幸存人数分析”

第二百零七章 幸存者

“核弹的威力巨大,直接暴露在其打击范围内的字母,将无一幸免”

“即使是身处核避难所中,也最多能承受一次打击”

系统先介绍道。

紧接着,杨成眼前出现了一幅2d合成图像:

#abde[fgh]in#mk[tj]op

这是核打击的覆盖图。

可以看到,井号(#)代表的是核弹的落点。

用方括号表示核避难所,括起来的字母就是相对安全的。

那么,这次核战到底有没有幸存者呢?

杨成开始了思索与分析。

根据系统的提示,凡是直接暴露(避难所外的)字母通通gg

所以只需要考虑方括号内的字母。

第一个方括号,里面有fgh。

很不幸的是,它左右各有一枚核弹,所以必死无疑。

至于第二个避难所,里面的字母非常lucky

挨了一发,但总算是没大碍~

那么结果就很显然了。

“幸存者t和j”。

杨成宣布了最终答案。

然后,他看到了屏幕上一个巨大的蘑菇云。

那蘑菇云升腾的同时,一段背景解说开始了:

“毁灭即是新生”

“但在核战中,没有赢家”

第二百零八章 核冬天

这是一个暗无天日的灰色世界,厚厚的烟云遮盖着天空,终日不散,陆地再也见不到阳光,白天和夜晚难以区分。

在核战过去后的几个星期,大地迎来大规模的降温。

无论是海洋,河流,还是湖泊,小溪,通通结了一层厚厚的冰盖。

空气中,则弥漫着致命的放射性尘埃。

相对安全的核避难所内,食物,淡水日渐稀少。

幸存的字母们,为了生存,开始了对资源的争夺。

“这箱方便面是大家一个星期的口粮,谁也不能擅自处理!”

t和j死死地护住方便面。

“我看你们两个小子是活腻了吧!”

以w和m为首的一堆人步步紧逼。

“信不信我把你们两个丢到外面去晒太阳?”

m把个雪茄烟一丢,露出了獠牙。

“不给!”

t和j哭嚷着,就是不肯松手。

“弟兄们,给我上!”

w大手一招。

半个小时后

两个饥寒交迫的人被赶出了避难所。

第二百零九章 基因变异

将身体直接暴露在强辐射下,正常人是支撑不了多久的。

然而,还有一种极小的可能。

这种概率比彩票中大奖还低。

那就是,基因变异。

早已沦为一片废墟的城市街头,这里看不出有丝毫的生命迹象。

一只硕大的老鼠,从地底爬出来。

核弹的威力足以杀死大多数的生物,却对老鼠无可奈何。

这老鼠大摇大摆地在街上溜达着,不时地用鼻子嗅探食物。

在没有天敌的情况下,它根本不需担心。

就在这时,空气中一阵细微的扭曲,似乎有什么在干扰视线。

“吱吱!”

那老鼠似乎觉察到了什么,朝着一个方向怪叫。

紧接着,老鼠只感觉脑海中一阵刺痛。

“吱吱!”

它一下子四肢朝天,拼命挣扎着,表情很是痛苦。

只听见它叫声越来越凄厉,好像有一只无形之手在操控。

几分钟

“吱”

老鼠最后一声哀嚎,四肢渐渐松软。

眼看着竟是断绝了生机。

第二百一十章 精神控制

刚刚咽气的老鼠旁边闪过两道身影。

那身影身穿黑色的斗篷,就如同鬼魅一般。

而细看之下,那深藏在斗篷之中的面容显现出两团萤萤之光,犹如两颗星辰。

这一幕显得如此诡异。

“小t,接下来怎么走?”

其中一人问道。

“返回避难所,拿回属于咋们的东西”。

半个小时后

核避难所内,一阵阵香味在空气中弥漫。

只见一堆人拿着大碗,小碗还有筷子,围着一口大锅。

大锅内热气腾腾,煮着香气扑鼻的方便面。

就在字母们打算享用美食的时候,不远处却传来不和谐的声音。

“你们吃得很嗨嘛!”

以w和m为首的一堆人被打搅了兴致,顿时放下了碗筷,面有怒色。

“你们两个臭小子,大难不死,又来找爷的晦气?”

m走上前,抬起手臂,一个巴掌扇过去。

然而,下一秒

m一声闷哼,向后倒地,鲜血从口鼻中流出来。

w拿起一把ak,瞄准t和j。

然后,他只感觉脑海中挨了一记重锤,瘫倒在地。

“不对!这两个人有古怪!”

字母们顿时乱作一团。

第二百一一章 精神控制之战

“你们,都得死!”

t和j话音刚落,眼中的凶光大盛,更强烈的精神控制开始了。

他们甚至控制剩下的字母们自相残杀。

这一幕,惨烈无比。

倒下的w,突然间爬起来。

就在所有的人都没反应过来的时候。

他手上的ak开火了。

“哒哒哒!!!”

犀利的子弹划破了t和j的胸膛,终止了他们的操纵。

“让一切毁灭吧!”

倒在地上的m从口兜里摸出一个遥控器。

他毫不迟疑地摁下遥控器上的按钮,然后闭上了眼睛。

在核弹面前都能够支撑的核避难所内,大片大片的尘土,砖瓦掉下。

紧接着,避难所开始了塌陷。

在巨大的轰鸣声中,避难所化作了废墟。

所有的字母都被尘封。

看到这一幕的杨成沉默不语。

这难道不就是疯狂的人类不计后果开战可能导致的结局么?

再看屏幕上的世界,依旧暗无天日。

却再也没有了生命的气息。

这时,系统音响起:

“亲爱的玩家,恭喜您完成了各个阶段的战争评测!”

“我们除了给与积分,还将有一项特殊的奖励”。

第二百一二章 见习机会

“什么特殊的奖励呀?”

杨成顿时来了兴致。

“一次去世界级大公司见习的机会喔!”

系统也不卖关子。

“哪个大公司?”

杨成脑海中闪过一个个it界如雷贯耳的名字。

它们之中有的走过了半个多世纪之久,就如同一座屹立的丰碑。

有的虽是后起之秀,却比起老一辈企业更胜一筹。

“嘻嘻,去了你就知道啦!”

系统声音刚落,便开始了传送。

这家大公司在全球各地都有分部,它一向以为员工提供良好工作环境而著称。

但耳听为虚,眼见为实。

当你真正有机会进入到它的办公地点参观,才会留下深刻的印象。

杨成走在那充满现代气息的大楼内,一位经理边引导边讲解。

两侧墙壁上随处可见白色的书写板,上面有着员工们的小创意。

经理对此表示:“你坐在办公室时,灵感并不一定会来,或许就在你走动时,灵感就会如期而至呢。”

杨成甚至还注意到了一幅幅“印象派”画作。

他起先以为是名家的作品,然后才知道这都是员工们的信手涂鸦。

走上楼梯的时候,杨成发现旁边居然还有座滑梯。

“这不是儿童游乐场才有的东西嘛?”

“不不不”,经理摆摆手,眼含笑意。

“这滑梯连接上下层,除了娱乐功能外,还可供员工们在发生火灾时紧急撤离。”

“搜噶~”,杨成吐了吐舌头。

第二百一三章 搜索引擎

很快,杨成来到了一间办公室。

办公桌上摆满了各种稀奇古怪的小玩意儿。

有蜘蛛侠,有绿巨人,还有一只迷你型的hello-kitty

其中最显眼的当属两台大屏幕显示器,上面的代码密密麻麻,一下子激发了杨成的兴趣。

国际化大公司的代码会是怎样的呢?

“请坐”,经理示意杨成。

杨成于是一屁股坐在了松软舒适的办公椅上。

这人体工程学做的真不错!

杨成边感叹边注意屏幕上的代码。

“小杨啊”,经理首先发问道。

“你知道我们公司的主打产品是什么吗?”

“搜索引擎!”

杨成不假思索地回答道。

“嗯”,经理略为满意地点点头。

“当你在搜索引擎输入一个查找项,再摁下回车键,就能很快得到与之相关的列表”。

“那你知道其中的原理吗?”

杨成顿时咂咂舌,表示自己并不了解。

“好”,经理思考了片刻。

“我交给你一项见习任务,仔细听好咯!”

第二百一四章 字符串相似度

“假如我们的候选列表里有如下的内容:”

有你最擅长的“javascript”。

有一杯温醇的“java”。

有简洁美的“ruby”。

有世界上最好的语言“php”。

有胶水语言“python”。

还有js低调的小兄弟“coffeescript”。

“整个列表就像这样:”

[‘javascript‘,‘java‘,‘ruby‘,‘php‘,‘python‘,‘coffeescript‘]

“假如用户在输入框键入了heaven(天堂)”。

“请将列表按照和heaven的字符串相似度进行排序”。

“相似度越高,排名越靠前”。

听到这里,杨成思索了片刻,他提出疑问。

“这个相似度参照的依据是什么呢?”

经理耐心地解释道。

“依据就是从一个字符串转换为列表内某个字符串,所需要的最少操作次数”。

“这个操作可以是新增字符,修改字符,删除字符”。

“比如从字符串berr,转换为beer,只需要修改r为e,也就是一次操作”。

“而从berr,转换为barrel,需要修改e为a,并且新增e,新增l,也就是三次操作”。

“所以berr和beer的字符串相似度更高,beer的排名比barrel更高”。

“明白了吧!”

第二百一五章 最短编辑距离

听到经理的解释,杨成联想起了一个经典问题——求字符串的最短编辑距离。

这个所谓编辑,就是新增字符,修改字符,删除字符三种操作。

假如有a和b两个字符串,该怎么求它们之间的距离呢?

首先应该明确一点,这个距离是有限的。

就算a和b再长,他们的距离不会超过a,b的长度之和。

然后,就开始考虑如何把这个问题转换为规模较小的子问题吧!

如果a和b的第一个字符相同,那么第一个字符我们就不管了。

直接计算a第二个及以后字符组成的子串,和b第二个及以后字符组成的子串,它们之间的距离。

假设a为“man”,b为“made”。

它们第一个字符相同,那就去掉“m”,计算“an”和“ade”之间的距离。

而如果a和b的第一个字符不相同,那么我们就分别进行6个操作来尝试。

1删除a第一个字符,计算a剩下的与b的距离。

2删除b第一个字符,计算a和b剩下的距离。

3修改a第一个字符,使之与b第一个字符相同,再计算a和b的距离。

4修改b第一个字符,使之与a第一个字符相同,再计算a和b的距离。

5新增a的第一个字符到b前面,再计算a和b的距离。

6新增b的第一个字符到a前面,再计算a和b的距离。

这6个操作所得到的距离中,最短的加上1,就是最短编辑距离。

根据这样的思路,很快就可以完成一个递归程序。

第二百一六章 分治法的缺陷

杨成将自己的思路实现成一行行代码。

这一过程中,经理目不转睛地盯着屏幕,若有所思。

直到他完成最后一行,测试了几个简单的例子。

经理终于发话了。

“你觉得你的递归程序,有什么地方需要改进呢?”

杨成扫视自己刚刚写过的程序,有了些眉目。

“在递归的过程中,很多数据被重复计算了”。

分治法将一个大的问题划分为独立的子问题,然后递归地求解各个子问题,最后合并子问题的解,得到原问题的解。

而对于这个问题,使用分治法,会大量地求解公共子问题,

或者说,子问题重叠了。

“那么,请你估算下,最坏情况下,你这个算法的时间复杂度是多少?”

经理接着发问。

“这”

杨成挠了挠头,陷入了短暂的沉思。

“这个算法应该是指数级的吧!”

“具体我也不清楚”。

他倒是很诚实,经理脸上流露出一丝笑意。

“最后一个问题,你会怎么去优化它呢?”

第二百一七章 记忆化

听到经理的问题,杨成没有急于作答。

他回想起以前刚来到代码战争时做的第一个任务。

求解斐波那契数列的第n项。

当时他是如何对分治法做优化的呢?

“使用缓存,或者说是记忆化!”

杨成顿时脱口而出。

函数每次调用时,可以将先前的操作结果记录在某个对象里面,从而避免无谓的重复运算。这种优化被称作“记忆化”。

在这个问题,如果给递归算法使用了这种技术。

当在递归执行第一次,遇到一个子问题时,就计算它的解,并且记忆在对象中。

以后再遇到重复的子问题,无须再计算,直接读取对象中的记忆。

这样就能大大地减少运算量!

带着这样的思路,杨成开始优化已有的程序。

很快,经理便看到了一个全新版的算法。

他看到一行行测试用例通过。

“小伙子不错!”

经理拍拍他的肩膀。

“对已有的代码做改动,记忆化是可行的”。

“你还可以尝试一下动态规划的思路,它无须递归的代价,所以理论上效率会更高”。

第二百一八章 离天堂最近

好,既然有了一个高效的最短编辑距离算法,那就对列表中的内容,开始计算字符串相似度吧!

杨成将列表中的字符串与“heaven”一一匹配。

他摁下了提交键。

不过眨眼之间的事儿

输出面板上出现了一行行结果:

javascript:9

java:4

ruby:6

php:6

python:5

coffeescript:11

杨成一扫视结果面板,顿时有些垂头丧气的。

“居然不是我最喜欢的js”

经理看到他这呆萌样子,心中一乐。

“哈哈!小伙子。”

“我知道你可能不赞同java比其它编程语言离天堂更近~”

“但在这个例子中,确实如此哇!”

杨成耸耸肩,表示小小的抗议。

“好了,杨成童鞋”,经理收敛了笑容。

“第一阶段的见习任务就到这里了”。

“稍做休息,我们就进入第二阶段吧!”

“新的任务是在室外喔~”

“啊?这样哇”,杨成一下子来了兴致。

第二百一九章 爬山

“就算大声呼唤也传达不到,不知名的低语在风中环绕”

群山之中的某处底谷,响起手机铃声。

此时,天朗气清,惠风和畅,端的是个爬山的好日子。

杨成和经理背着个登山包,坐在草地上边听歌边休息。

“看不出,你小子还挺喜欢动漫歌曲的”。

经理拿着个玻璃水瓶,里面的茶叶沉浮,淡淡的茶香四溢。

“嗯”,杨成看着远方的山峦,眼中有一抹光亮。

“二次元可以让我暂时忘记一些烦恼”。

“啊?”

经理有些惊讶。

“你年纪轻轻的,有什么烦恼”。

杨成眼中的光亮暗淡了几分,轻轻地垂下头,拨弄脚下的青草。

“您觉得世界是真实还是虚幻的呢?”

经理迟疑了片刻。

“你这个问题,我年轻的时候也思考过”。

“真实还是虚幻,可能很多时候我们都分辨不清”。

“就像这代码战争一样,现实中的我们或许只是活在虚幻的游戏中呢”。

经理抿了一口茶,站起身子。

他朝杨成伸出一只手。

“起来吧,咋们走走,聊一聊”。

杨成被那温暖的大手拉起,两人在茫茫的草地中前行。

第二百二十章 蛤蟆

很快,眼前的草地中央出现了一个波光粼粼的湖泊,就如同一块镶嵌在绿色丝绸上的碧水晶。

耳畔传来一阵阵虫语和蛙鸣。

天空不时有飞鸟掠过,在湖中投下倒影。

“采菊东篱下,悠然见南山”。

杨成脑海中浮现出陶渊明的这首诗。

“真是不错的景色啊,可惜没带相机”。

经理有些感慨道。

“呱呱!”

“呱呱!”

这时一种声音吸引了两人的注意。

杨成往那方向看过去。

只见不远处的一块岩石上,一只脸盆大的蛤蟆栖息着,不慌不忙地晒太阳。

“”

“这蛤蟆好大喔”。

那蛤蟆似乎也不关注对着它指指点点的两个人,一动不动。

然后,杨成眼前一变。

蛤蟆的脚下突然出现了一个数组。

数组?

这也太诡异了吧!

然而,这确实是一个被金色光圈包裹的数组

[1,2,1,5]

蛤蟆所站的岩石位于最左边的1,也就是下标0的位置。

第二百二一章 真实还是虚幻

这数组一直延伸到湖畔,就如同一座阶梯。

就在杨成和经理眼睛盯着数组,想要琢磨个究竟的时候。

蛤蟆突然动了!

“呱!”

只见它往前跳了一格,来到2的位置。

“呱!”

蛤蟆又跳了两格,来到5的位置。

“呱呱!”

蛤蟆连跳五个格子。

“噗通!”

它激起一点点水花,消失在了湖泊中。

“这”

杨成思索了片刻,恍然大悟。

原来数组内的元素就表明蛤蟆接下来要跳多少个格子。

这就是游戏程序中,蛤蟆这个实体对象所预设的轨迹。

“小杨啊”,经理这时拍拍他的肩膀。

“我们的人生轨迹与这只蛤蟆是不同的”。

“人生中,变数太多”。

“就好比一个程序中,既有常量,也有变量”。

“而变量往往是主体,常量只是点缀”。

杨成望着蛤蟆消失的方向,若有所思。

“那您的意思是?”

经理眼中闪过一丝坚定。

“思考真实还是虚幻没有意义”。

“在人生这个程序中,最大的变量就在于我们的努力啊”。

第二百二二章 冷

“您说的对”。

杨成看着湖泊中自己投下的倒影。

那犹如镜子里面的另一个人,眼神也变得坚决起来。

“哈哈”,经理从地上拾起一个小石子,轻轻地向前一抛。

“年轻的时候谁没有迷茫过呢”。

“等确定了方向,还是得接着走下去啊”。

杨成抬起头,望了望远方。

那遥远的天际,有一座笼罩在云雾深处的山脉。

那样的高耸,恐怕连飞鸟也难以逾越吧!

“怎么”。

“想去那边看看?”

经理整了整行装。

“我可不想当攀登最高峰的勇士”

杨成耸耸肩。

“咋们还是绕过去吧”。

于是,两人踏上了新的旅途。

空气中的寒意越来越重,坡度也越来越大。

杨成禁不住打了个寒颤。



这是他此刻唯一的想法。

“我们还是停下来,商量下怎么走出这片山区吧”。

杨成发出倡议。

“好”。

经理停下了脚步,从背包中拿出一份地图来。

第二百二三章 加权有向图(上)

很快,一幅山区地势图出现在杨成眼前:

0,0,1,1

0,1,2,3

1,2,5,4

0,1,1,0

“咦,这上面这么多数字,代表什么意思?”

杨成端详了半天,没看出个究竟。

“数字代表局部区域的海拔高度,以千米作为计量单位”。

“我们目前正处于地图的最左上角,也就是坐标[0,0]的位置,当前海拔不足1千米,所以记作0”。

“此行的目的地是最右下角,坐标[3,3],那里的高度也是0”。

经理耐心地逐一解释道。

“如你之前讲的,不想去攀登高峰(海拔高的地方)”。

“那小伙子你就找出一条最能够节省体力的路径来嘛!”

杨成这下子才有了些眉目。

对于登山而言,如果两个区域高度差越大,肯定消耗体力就越大。

这个问题可以归纳为:

找到从出发点到达目的地消耗体力最小的路径。

那怎么根据这个问题建立模型呢?

杨成仔仔细细地观察这个地图,决定采用一个通用的模型。

加权有向图!

第二百二四章 加权有向图(下)

既然是加权有向图,那在这个场景下,有向性怎么体现呢?

可以观察到,图中的每一个点都有8个方向可以离开。

东,南,西,北,东北,东南,西南,西北。

等于说,每个点和它周边的8个点都可以构成一条边。

而边的权重等于两个点海拔差的绝对值。

这样,这幅地图就转化为了加权有向图。

然后,再求总权重最小,或者说总海拔差最小(最节省体力)的路径。

对于求加权有向图两个点之间的最短路径,有一种经典的算法:

dijkstra(迪杰斯特拉)算法。

它会构造一棵最短路径树,提供从出发点[0,0]到图中任意一点的最短路径。

那有了这么一棵树,要找出发点到目的地[3,3]的最短路径不就是很方便的事情了么?

杨成很快就搞定了这个算法。

不过,他发现了一个让人懊恼的问题:

javascript在以前的版本一直不支持优先级队列。

而优先级队列是这个算法能够加快效率的关键。

他只好使用数组来做替代。

从数组中查找最小的项,并且将其移除,可是一个开销不小的操作呢!

第二百二五章 优先级队列(上)

如果说,使用优先级队列,删除并返回最小的项,是一趟对数级(log)操作。

那用数组完成同样的功能,则是线性的。

这两者,在数据量较小的情况下,可能看不出差别。

而如果数据量稍微大点,比如n=1000。

使用数组就会有慢100倍左右的差距。

“哈哈,我该庆幸的是,数据量灰常灰常小”。

杨成看着自己计算出来的最短路径,心中充满了喜悦。

经理目不转睛地盯着杨成的编辑器面板。

“杨成同学,不可以浅尝辄止喔!”

“接下来,你的任务就是,自己动手实现一个优先级队列,并且应用到已有的算法中”。

听到这里,杨成脸上的笑容瞬间凝固了。

这一方面,他还真没实践过呢。

看到杨成那为难的表情,经理脸上浮现了一抹笑意。

“那你先谈谈,优先级队列有着怎样的性质?”

空气中的寒意没有丝毫缓减,登山的两个人却专注于眼前的问题,早已忘记了寒冷。

第二百二六章 优先级队列(中)

对于优先级队列里面的元素,它们遵循两个排序规则:

1具有更高优先级的元素先弹出。

2如果元素优先级相同,那么就跟队列的性质一样,先进先出。

怎么来实现它呢?

一种经典的解决方案是使用一个最小二叉堆。

二叉堆本质上是一棵完全二叉树,而最小堆,对于它每一个节点,都小于或等于其左子节点和右子节点。

这就是堆的完全性与有序性。

杨成很快就了解了这些基本的概念,不过他却面临一个技术方案选型的问题。

对于很多数据结构,都可以考虑链表或数组来实现。

这个最小堆,用哪一种方案更好呢?

经理很快给出了答案。

“你可以使用数组来实现”。

“更简洁,而且某些操作的效率会更高些”。

杨成思索了一段时间,便开始编写代码。

其实要提供的api就2个,删除最小元素和插入元素操作。

但是如果要写的高效,还是得费一番功夫的。

第二百二七章 优先级队列(下)

时间一分一秒地过去了

云雾缭绕的半山腰,一个年轻人蜷缩着身子,一边抵挡寒意,一边编写代码。

经理站在一旁,不停搓着双手,呵着寒气,眼中有着一份赞许。

杨成的代码很工整,没有一点点仓促的感觉。

他此时一颗心沉下来,完全融入到自己创造的程序世界中了。

没过多久,一个最小二叉堆便完工了。

紧接着,要将它包装成优先级队列。

对于javascript,可以使用继承或组合的方式,来进行包装,确保更加语义化。

至于最后一步,就是将最短路径算法中的数组操作,替换成优先级队列操作。

这样一趟下来,一个全新的加权有向图最短路径算法就诞生啦!

杨成点击提交按钮。

唰唰!

程序重新计算出结果,跟之前一模一样,然而,它的效率却有了质的飞跃。

“哈哈!”

经理拍了拍手。

“这二叉堆写的不错!”

“你不如再尝试下斐波那契堆”。

杨成一听这话,脸顿时成了苦瓜色。

第二百二八章 最后的任务

斐波那契堆是一种比二叉堆更复杂的数据结构。

它相对于后者,在插入元素及合并堆操作上效率更高。

但因为其编程复杂性,实际应用并不广泛。

在经典的《算法导论》中,作者认为,对斐波那契堆的研究主要是出于理论兴趣。

开发出一个既拥有高效率,又更简单的数据结构,才是研究者孜孜以求的目标。

“哈哈,逗你玩的啦!”

经理双手叉腰。

“这一阶段的任务就到此为止了”。

杨成站起身子,长吁一口气。

他眺望前方,那路途依然遥远,也许还有数不清的困难在等着他呢。

“最后一项任务”。

说到这里,经理的脸上变得庄重。

“你需要独自完成”。

“我先行一步了”。

他大手一挥,眼前便出现了一个五彩斑斓的光门。

经理大步踏入光门中,消失的无影无踪。

杨成站在湿漉漉的草地上,感受到寒意的褪去,四周那云雾缭绕的高山场景正发生缓慢地切换。

一阵暖意袭来

第二百二九章 天路

这里是318川藏线上的一处世界级风景区。

在风光摄影师眼中,它风和日丽,神圣的山峦绵延不绝,圣洁的湖泊清澈见底,是大自然不可多得的杰作。

然而,因为一些不文明的游客随手乱扔垃圾,如今在杨成面前却是另外一番景象:

无论是丛林中,草地上还是湖畔,肉眼可见的地方,到处都是塑料瓶,烟盒

杨成看着这一幕,脑海中回想起曾经看过的数据。

一个普通的饮料瓶,需要200到300年可以降解。

而金属易拉罐,则需要更长的降解时间。

这片区域,每年都有上千万游客到访。

长此以往,美丽的景色不复。

杨成弯下腰,拾起一个小小的金属罐。

尽管内心充满了震撼,他却无能为力。

他又能做出怎样的改变呢?

勿以善小而不为!

一个声音在心底响起。

他不是一个轻言放弃的人,很快坚定了想法,再次弯下腰。

第二百三十章 数组装载

没过多久,杨成手臂上便拥着7,8个大大小小的饮料瓶。

他举目四望,期望能找到一个垃圾袋。

让人失望的是,方圆百米,没有可以装垃圾的东西。

这下可麻烦了!

难道自己什么事儿也做不了吗?

就在杨成一筹莫展的时候,系统声音及时地响起。

“成成,你可以自己设计一个数据结构来装载啊!”

杨成一听,顿时脑洞大开。

“3ku”。

他一边感谢系统妹子,一边开始琢磨,用啥来存储垃圾才好呢。

有一种大多数编程语言都支持的复合结构。

数组!

如果一个业务需要多个类型相同的变量时,就可以考虑定义一个数组。

在这里类型可以看做只有一种,统称为“垃圾”。

想到这里,杨成大声呼唤。

“系统妹子,我需要一个对象数组!”

过了几秒钟,一阵轻微的空间波动传来。

“唰唰!”

眼前,一个金色光芒笼罩的物品正在成型。

第二百三一章 静态数组

杨成定睛一看,发现是一个长方形的柜子,里面有很多小格子。

每个格子刚好能够容纳一个饮料瓶。

原来这就是数组具象化后的东西?!

他又惊又喜,连忙将手中的垃圾塞进去。

这真是一个萝卜一个坑啊!

杨成接着弯腰,拾起更多的废弃品。

过了一会儿,周围5米的范围内,出现了一片完好的绿色。

杨成开始向更远处进军。

他的手忙个不停,更多的坑被填上了。

直到

再也没有坑了。

这该怎么办呢?

事实上,对于很多静态语言,它们的数组是静态的。

也就是说,当数组被初始化之后,它所占据的内存空间以及数组长度都是不可变的。

想到这里,杨成才发觉自己之前欠考虑了。

数组满了怎么办?

第二百三二章 动态数组

既然满了,那就扩容呗!

生成一个容量更大的数组,将已有的垃圾倒腾到里面就行了。

但是这样做不太方便,难道每次满了都得手动扩容一次?

一个更通用的做法是,包装一个动态数组。

像javascript,它的数组长度是可以动态改变的。

静态语言的数组不支持这样的操作,该怎么扩展呢?

杨成思考了一会儿,决定基于以下的策略:

每次新增元素(垃圾)之前,检测数组容量是否足够。

如果不够,就将新容量扩充为原来的15倍。

这种方式,被jdk(java开发工具包)所采用,具体实现上更复杂。

但在这个问题上,简单逻辑就够了。

那么就开始动手实现吧!

第二百三三章 浅复制

在对数组扩容的实现过程中,杨成用到了数组复制操作。

这其实是一种“浅复制”。

对于对象数组而言,如果仅仅复制对象的引用,那就是浅复制。

而如果要拷贝对象本身,就是更为复杂的深度复制。

在这个操作上,浅复制足够了。

没过多久,杨成就写好了一个动态数组。

这下再也不用担心没有足够的容量啦!

杨成继续之前的清理工作。

尽管身上流了很多汗,衣衫都被浸透了。

但他此刻只有一种信念:一定要还这片土地一片绿色!

在他看来,世界怎样才能变得更加美好呢?

不在于少数人做很多事情,而是每个人都做一点点奉献。

点点滴滴,汇聚成江河湖海,川流不息

第二百三四章 美丽公约

也不知道过了多久

杨成停下脚步,将最后的一个废弃烟盒放置好。

他擦了一把汗,眺望远方。

天路恢复了圣洁,一尘不染的草地散发出清香。

这才是神山、圣湖原本的模样啊。

此刻他的心中没有疲惫,只有一份欣慰。

低下头,想看看自己的双手是怎样的“惨状”。

他却注意到手腕上不知什么时候多了个缠绕的绿色丝带。

丝带上还有张小小的铭牌,书写着“美丽公约”四个字。

杨成瞬间就明白过来了。

让美丽的风景常存于世间,这是我们的约定喔!

我一定会遵守的!

他在心中默念道。

夕阳西下,人的身影被渐渐拉长。

杨成眼前的世界变得模糊起来。

场景即将发生切换

最后看了一眼,似乎要在脑海中定格这一画面。

“别了,天路”。

第二百三五章 见习结束

杨成被传送回了之前的办公室。

经理早就在那里等着他了。

“杨成同学”。

经理瞥了瞥杨成手腕上绿色丝带。

“你在我们这儿的见习就告一段落了”。

杨成眼中闪过一份不舍。

这真是一次难得的机会。

“我们给你的评价是:优等”。

经理扶了扶眼镜,接着说道。

“其实公司对于员工,除了看重技术,更看重的是他的内在品质”。

“你对待技术问题很执着,更有着一颗向善的心”。

“相信你一定会走的更远!”

经理郑重地伸出他的手。

“谢谢您的栽培”。

杨成激动的不知道说什么才好,他握住经理的手,感受到一种温暖。

“继续努力吧!”

经理看着眼前这个年轻人,仿佛看到了从前的自己。

“欢迎你毕业后来我们公司发展喔!”

第二百三六章 科勒文的邀请

离开公司,杨成恋恋不舍地回头眺望那充满现代感的大楼。

能在这样的公司工作,那才是件快乐的事呢!

可接下来去哪儿呢?

劳累了这么久,还是找个地方散散心吧。

就在这时,系统短信箱突然变成了通红的颜色。

杨成点开一看,映入眼帘的是“动物学家”科勒文发来的一条短信:

“杨,我听说动物园新引进了一批保护动物,有没有兴趣陪我去逛逛?”

杨成顿时回想起那次在动物园的经历。

好多动物都逃出了牢笼,自相残杀呢!

他撇撇嘴,感觉这次去肯定没啥好事。

不过,他还是很快回复了条短信:

“等我,动物园门口见哈!”

第二百三七章 参观动物园

动物园门口。

“科兄,好久不见哪!”

见面的两个人来了个大大的拥抱。

“德州牛仔”科勒文笑容满面。

“杨,跟我来,让你看点与众不同的东西”。

科勒文边走边介绍道。

“在你们美丽的华夏古国,西南山地的原始森林”。

“那4%的土地上,却生活着50%以上的动植物”。

“你看那头亚洲象”。

科勒文指着一头庞然大物,它正在不急不慢地用粗大的象鼻汲水,洗濯自身。

“成年亚洲象每天最低的食量是300斤”。

“在它的故乡,大量的土被开发种植橡胶树,香蕉和茶叶”。

“找不到足够的食物,这些大家伙只能闯进人类的领地”。

“最后难逃厄运”

似乎是听到了两人的对话,那大象突然扬起鼻子,朝两人喷出水柱。

感受到天空下起淅淅沥沥的“小雨”,杨成心里不是滋味。

难道连这最后的“诺亚方舟”也要毁于一旦么?

第二百三八章 越狱的猴子

“你再看那只绿孔雀”,科勒文指着另一个方向。

“它的身上五彩斑斓,是丛林间的精灵”。

“如今却被迫退缩在几片狭小的地域”。

杨成点点头,深以为然。

每隔3个小时,便有1个物种灭绝

而每消失一个物种,食物链的断裂,便会带来更多物种灭绝的多米诺骨牌效应

保护生物的多样性,已经是迫在眉睫。

就在杨成陷入沉思的时候,不远处传来一声尖啸。

“吱吱!”

然后,他看到一只猴子大摇大摆地从眼前穿行而过。

杨成顿时很纳闷,它是怎么从牢笼里跑出来的?!

“该死的!”

“别让它跑了!”

又听见几声暴喝,一群饲养员急急忙忙地追赶过来,手里拿着棍棒。

“吱吱!”

那猴子又是一声怪叫,逃的更快了。

“这是一只金丝猴”,科勒文解释道。

杨成脑海中却联想起了一种可口的零食。

第二百三九章 失踪的编号

饲养员们和那猴子你追我赶,喊声震天。

直到十分钟后

饲养员一个个鼻青脸肿地回返。

显然,他们并没有擒获那只猴子,让它成功“越狱”了。

这时,其中一位大叔走到杨成面前。

“小伙子,能不能拜托你一件事?”

杨成意识到又触发了任务。

“请讲”。

饲养员大叔挠了挠头,显得很为难。

“咋们动物园有100只猴子”。

“它们分别编号1到100”。

“如你所见,刚才跑了一只”。

“你能不能帮我找出,失踪的是编号为多少的猴子?”

大叔话音刚落,杨成眼前便出现了一个列表。

[13,11,10,3,2,1,4,5,6,9,7,8]

这个列表乍看之下,没有任何顺序。

可以肯定的是,里面有99个元素。

该怎么找出那个失踪的编号呢?

第二百四十章 简单的方法

这是一个简单问题。

然而,采用不同的方法却会导致不同的效果。

一种最直接的方法就是:

从1遍历到100,然后依次判断当前数字是否存在于列表里面。

如果不存在,那就是缺失的编号,直接返回。

这种方式十分通俗易懂,但是却效率低下。

具体实现,你得用双重嵌套循环。

在最坏的情况下,它是一个时间复杂度为n平方的算法。

当然,这个问题上还是够用了。

那更好的方法该怎么做呢?

第二百四一章 排序的方法

因为列表本身是无序的。

杨成很快萌生出一种想法:

如果把它变成有序的,会不会更好处理呢?

所以第一步,对列表由小到大进行排序。

那个缺失的编号,要么在有序列表的最前面,要么在中间某个位置,要么在最后面。

所以,接下来,从1遍历到100,和列表元素做比对。

1,2,3100

1,3,4100

看到没,第一个不相等的数字,就是缺失的编号。

在这个例子里面是2。

这个方法,比之前的方法效率更高。

因为排序的缘故,它是n乘以logn的时间复杂度。

那有没有复杂度更低的方法呢?

第二百四二章 位图的方法

答案是肯定的。

有一种方法,需要借助位图(bitmap)来实现。

位图是一种简单但是非常有用的数据结构。

你可以用一个数组来表示它,数组元素为0或者1,0代表不存在,1代表存在。

首先,遍历列表,将里面的元素加入位图中,这是一趟线性操作。

接着,从1遍历到100,依次判断当前数字是否存在于位图中。

如果不存在,那就是缺失的编号,直接返回。

这种方式需要同等大小的额外空间,但时间复杂度是很接近线性的。

其实这里也可以使用哈希表,而不使用位图。

但是,哈希表有额外的性能损耗,还是采用更简单的数据结构为好。

想到这里,杨成已经有了三种方法。

但是他有一个疑问:

有没有不需要借助额外内存空间,时间复杂度也能为线性的方法呢?

第二百四三章 最好的方法

杨成陷入了冥思苦想。

假设这只猴子并没有越狱,也就是说正好有编号1到100,总共100只猴子。

那它们的编号总和是多少?

运用等差数列公式,可以得出如下结果:

(1100)x100/2=5050

这猴子越狱后,现在的编号总和是多少?

遍历整个列表,求和,这是一趟线性操作。

然后,拿5050减去现在的编号总和,就是越狱的猴子编号。

这个方法比前面三种方法,效率都要高。

“哈哈!”

杨成想出了这个最佳答案,喜悦之情溢于言表。

第二百四四章 回归的猴子

杨成还沉浸在求知的喜悦中。

“吱吱!”

他突然感觉后腿一紧,似乎被什么动物掐住了。

于是转过身子一看。



不就是越狱的那只猴子么?

只见它又肥又胖,一身的毛发散发出光泽,眼睛极为有神。

那猴子抱住杨成的大腿,就是不肯松手哩!

杨成顿时很吃惊,一时间动弹不得。

“嘻嘻!”

科勒文打趣地说道。

“这只金丝猴是把你当作它的同类了呢”。

“亲爱的程序猿”。

杨成一听,觉得有几分道理。

就在局面僵持不下的时候,一道身影慢慢地逼近。

紧接着,那身影向猴子扑过来。

“这次可不能让你给跑咯!”

饲养员大叔那犹如小山般的身躯瞬间扑了个空。

“吱吱!”

猴子松开大腿,又开始了逃窜。

动物园追击战再次拉开帷幕

第二百四五章 约翰教授的邀请

动物园里,杨成和科勒文边走边聊。

时间过得很快,天空呈现一抹昏黄。

“杨,要不要考虑晚上去我的农场过夜?”

科勒文发出邀请。

“科兄,如果你能说服农场那群奶牛,让它们半夜里别鬼喊鬼叫”

杨成耸了耸肩。

“好吧”。

科勒文两手一摊,表示放弃。

就在这时,一条短信出现在杨成视野中。

他点开才发现,是约翰教授发来的。

内容如下:

小伙子,有个最新研究课题,愿不愿意来当我的助手?

杨成毫不迟疑地点击了“接受”按钮。

系统便开始了传送

第二百四六章 阿克曼函数(上)

熟悉的院落。

年迈的约翰教授身着睡衣,手里拿着个骨瓷茶杯。

杯中咖啡微微荡漾,散发出浓郁的香味。

“教授,您的研究课题是什么?”

杨成好奇地问道。

约翰抿了一口咖啡,不急不慢地说道。

“一款新型的编译器”。

“大体工作已经完成了,进入测试阶段”。

“小杨啊,作为助手,我给你安排了一项小任务”。

“编写一个ackermann函数,并验证其正确性”。

杨成顿时瞪大了双眼,他可从没听说过这种函数啊!

“阿克曼函数的作用可大着呢”。

教授慢悠悠地说道。

“它用来做编译器的基准,协助判断编译器对递归计算的优化,因为其递归实现的递归深度非常非常高”。

“它的定义很简单,仔细听好咯”。

第二百四七章 阿克曼函数(中)

“定义阿克曼函数a(m,n)”。

“其中参数m和n均为非负整数”。

当m为0,有:

a(m,n)=n1

当m大于0且n等于0,有:

a(m,n)=a(m-1,1)

当m和n均大于0,有:

a(m,n)=a(m-1,a(m,n-1))

乍看之下,这个实现应该算简单的。

听了约翰教授的讲解,杨成花了几分钟就搞定了。

“小伙子,自己测试一下”。

约翰一捋花白胡子,眼中透露出一种神秘感。

杨成挠了挠头,打算先做边界测试。

在这里,m为0是边界。

他依次传入n=0,1,2,3

很快,他就得到了以下的结果:

a(0,0)=1

a(0,1)=2

a(0,2)=3

也就是说,a(0,n)=n1。

第二百四八章 阿克曼函数(下)

边界例子通过了测试。

杨成接下来做通用测试。

a(4,2)

就决定是你了!

点击提交,执行代码。

系统编辑器陷入了漫长的等待

“很抱歉,执行结果是长度为19729位的整数”。

“系统无法全部展示”。

what?

看到这个警告,杨成顿时目瞪口呆。

m=4,n=2

这才多大的输入参数哇,怎么会得到如此巨大的输出结果呢!

杨成将疑惑的眼光投向约翰教授。

后者淡定地一口气将咖啡喝完,对这情况显然早有预料。

第二百四九章 函数增长

约翰教授放下手中的骨瓷茶杯,抹了抹嘴。

“对于小的m值,像1,2,3”。

“阿克曼函数随着n值的变化,增长得非常慢”。

“最多也就是指数级增长”。

“然而”

教授话锋一转,指着编辑器面板上的输入参数说道。

“当m的值大于或等于4的时候”。

“它增长得非常迅猛”。

“如你所见,a(4,2)已经大的离谱了”。

“甚至于”

“a(4,3)更是超出了你想象的极限啊!”

听到这里,杨成不禁咂了咂舌头。

真是个可怕的函数啊!

第二百五十章 阿克曼反函数

“尽管阿克曼函数增长得如此快”。

约翰教授耐心地讲解道。

“它的反函数却增长缓慢”。

“在计算机科学中,有一种算法时间复杂度,被称为阿克曼反函数时间”。

“像并查集,这种数据结构有几种操作,非常接近常量时间”。

“它的边界就是阿克曼反函数时间”。

杨成点点头,就如同一位认真听讲的好学生。

“谢谢您,非常棒的解说”。

约翰擦了擦鼻子。

“今天就到此为止吧!”

“你编写的函数我就拿去测试编译器了”。

杨成朝他挥手告别。

“再会了,教授”。

第二百五一章 辛辛那提大学

回到任务中心,杨成大声呼唤道:

“系统妹子,下一个关卡,我希望能和一位计算机科学家交流”。

“收到!”

系统很快做出回应。

“请系好你的安全带”

位于俄亥俄州的辛辛那提大学,这所有着上百年历史的学院,此时正沐浴在黑夜中。

一辆小型的吉普车,行驶在校内的小道上,偶尔惊起一片蚊虫。

车内的后视镜里,映出杨成的脸庞。

他驾驶着吉普车,感受到一阵颠簸。

现在是什么年代?

作为一名不合格的穿越者,他可没有心理准备。

于是,他调出系统面板一看:

“1959年夏”

第二百五二章 实验室的孤灯

此时距离第二次世界大战的硝烟,才过去十几年。

对于计算机技术而言,还处在第一代电子管数字机与第二代晶体管数字机交接的时代。

这时的科学家会研究什么东西呢?

带着这样的疑问,杨成继续前行。

天空一片漆黑,偶尔有几颗星星明灭闪烁。

很快,吉普车停在了一栋建筑面前。

这座实验室四周静寂无声。

杨成走下车,定睛一看。

他看到那被黑幕所笼罩的大楼,有一盏孤灯,格外引人注目。

那灯火阑珊之处,一个人影浮现。

第二百五三章 希尔

“咚咚”

沉闷的敲门声在实验室内回荡。

过了一会儿,大门被缓缓地拉开。

映入眼帘的是一位戴着眼镜的中年人。

微弱的路灯下,可以看出他的身材很硬朗,就像一位军人。

杨成迟疑了片刻,伸出一只手。

“你好,我是阿历克斯”。

中年人脸上流露出微笑。

“我是唐纳德希尔”。

两只大手有力地握在了一起。

“我特意前来,是为了能向您请教”。

杨成直接道明来意。

“请进”。

希尔将杨成领进门,关上了实验室大门。

第二百五四章 早年经历

“二战期间,我参加了陆军工兵团”。

希尔边走边介绍自己的早年经历。

“在菲律宾,那时我的工作是修复破损的仪器设备”。

“在麦克阿瑟将军的带领下,我们最终赢得了胜利”。

“那是一位真正的英雄”。

“他教会了我,军人,迎接战争就应该像迎接每天升起的太阳一样。”

杨成点点头,表示认同。

“那您在辛辛那提大学,从事的是什么方面的研究呢?”

希尔扶了扶眼镜。

“一种排序方法的改进”。

“这是我的博士研究课题”。

第二百五五章 插入排序

希尔?

排序方法?

杨成眼中闪过一丝异样的神色。

他联想起教科书上经常会提起的一种经典排序算法。

这时的他才恍然大悟。

眼前的原来是这位大牛哇!

希尔领着杨成走进一个研究室。

这桌上堆满了厚厚的技术类文档和手稿。

除了可见这位学者的勤奋刻苦,杨成更是脑补出了一幅对联,挂在墙壁上。

“书山有路勤为径,学海无涯苦作舟”。

哈哈,这样不就更完美了么?

杨成还在这里脑洞大开,希尔指着其中一份文档说道。

“这就是我研究的内容”。

只见那封面印着几个漆黑的英文:

《insertsort》(插入排序)

第二百五六章 直接插入排序(上)

“在插入类排序中,最简单的是直接插入排序”。

希尔的表情变得凝重起来。

“这种排序的思路,需要依次将待排序的数据元素按照值的大小,插入前面的有序列表”。

“具体上来说,对于一个有n个元素的数据序列,排序需要进行n-1趟插入操作”。

“第1趟插入,将第2个元素,插入前面的有序子序列中,此时它前面只有一个元素,所以很快就能完成”。

“第2趟插入,将第3个元素,插入前面的有序子序列中,此时它前面只有两个元素,也能很快完成”。

“”

“第n-1趟插入,将第n个元素,插入前面的有序子序列中”。

“至此,列表整体为有序状态”。

第二百五七章 直接插入排序(下)

“这种直接插入排序的时间效率并不高”。

希尔翻开文档某一页。

“在最坏的情况下,所有元素的比较次数总和为:”

“012n-1”。

“这是个等差数列”。

“它去掉常量与系数,等于n的平方”。

“即使是在其他情况下,也要考虑移动元素的次数”。

也就是说,时间复杂度为n的平方咯!

杨成很快就明白了。

“直接插入排序的空间效率很好,它只需要一个临时存储单元”。

希尔分别给出了时间与空间的效率评估。

第二百五八章 二分插入排序(上)

“当你使用直接插入排序,第n-1趟将第n个元素插入前面的有序序列中时”。

“它总是从n-1个元素开始,逐个比较每个元素,直到找到合适的插入位置”。

“这显然没有利用好前面第1到n-1个元素已经有序的这个特点”。

希尔一语道破直接插入排序的不足之处。

接着,他话锋一转。

“二分插入排序则简单改进了这一点!”

“它借助了我们的老朋友——二分查找”。

第二百五九章 二分插入排序(下)

“所谓二分插入,其实就是通过不断地二分查找,来快速确定第n个元素的插入位置”。

“而一旦确认了元素的插入位置,剩下的事情就好办了”。

“程序将该位置以后的元素整体后移一位,然后将第n个元素放入该位置”。

希尔三言两语便说出了二分插入排序的做法。

“其实,它的排序效果和直接插入排序基本相同”。

“二分插入排序会更快一些”。

“因为它可以更快地确定第n个元素的插入位置”。

“或者说”。

希尔目光灼灼地看着手中的文档。

“它减少了元素的比较次数”。

第二百六十章 希尔排序(上)

“如果说,直接插入排序和二分插入排序都是n平方的算法”。

“它们难以突破次元的壁障~”

希尔难得的幽默了一把。

“我对直接插入排序的改进想必可以做到这一点”。

文档又被翻开数页,定格在一个关键词上。

“增量”

犹如考试前老师划重点一般,这个词儿被描上了一个红圈。

“这种改进后的排序,会加大插入排序中元素之间的间隔,并且在这些有间隔的元素中进行插入排序”。

“这种元素间的间隔,称之为增量”。

第二百六一章 希尔排序(中)

“假设有一个长度为9的待排序序列”。

“我们假定增量为4”。

“那第1趟遍历,将对索引为0、4、8的元素排序”。

“第1趟完成后,算法向右移动一步,对索引为1、5的元素做排序”。

“这个排序过程将持续进行,直到所有的元素都已经完成了以4为增量的排序”。

“或者说,所有间隔为4的元素之间都已经排列有序”。

“这时,你会观察到一个有趣的现象”。

希尔顿时两眼放光。

“所有元素离它在最终有序序列中的位置会相差不到两个单元!”

第二百六二章 希尔排序(下)

“当完成以4为增量的排序后,接下来应该减少增量,直到完成以1为增量的排序”。

“而以1为增量的排序,不就是直接插入排序么?”

“此时的情况又有所不同!”

希尔扶了扶眼镜,显得兴致勃勃。

“此时增量为1,可以算作直接插入排序”。

“但是列表里的数据项已经非常接近它们排序后最终的位置”。

“甚至不超过两个单元”。

“这对于直接插入排序,可以说是非常少的工作量”。

“不管是元素做比较还是移位的次数都大大减少了”。

“所以增量为1的排序可以很快地完成,从而使列表整体为有序”。

第二百六三章 排序的奥秘

“通过前面几次按增量排序,使得列表基本有序”。

“从而减少最后一趟直接插入排序(增量为1)的工作量”。

“这就是这种改进式排序的奥秘所在”。

希尔有着一份淡淡的自豪。

“他会比未改进的直接插入排序快很多”。

杨成津津有味地听着,感到又巩固了知识。

“然而”

希尔脸上流露出一丝遗憾。

“我的研究有个问题一直悬而未决”。

“那就是”

“怎样确定这个增量的值呢?”

第二百六四章 增量公式

最终确定希尔排序算法的关键就在于确定增量的值。

事实上,在希尔排序诞生后,很多科学家提出了增量公式。

其中包括一代算法大师knuth。

他提出的增量序列,会从1开始,通过如下公式产生:

h=3xh1

从1开始计算这个序列,可以得到1,4,13,40

实际运用中,程序还需要反向计算序列,来达到缩小增量的目的。

当然,这都是后话了。

“您不必觉得遗憾”。

杨成看着眼前这位可亲可爱的科学家。

第二百六五章 科学家的一生

“您为计算机科学事业付出了那么多的心血”。

“后来的学者们也是站在了您的肩膀上”。

现实中的希尔,在获得博士学位后,去了通用电气公司,在那里继续从事研究。

他退休后在北卡罗来纳州,安详地度过了晚年。

“谢谢您的指导”。

杨成握了握希尔的手,感受到一种鼓舞人心的力量。

“那我就先告辞了”。

杨成有些不舍,这种宝贵的时间总是过得太快。

希尔端详着眼前的年轻人,他开口说道:

“努力吧,努力就会有希望”。

第二百六六章 不灭的孤灯

杨成从实验室出来。

此时的夜色越发深沉,四周少了一份虫鸣,多了一份静谧祥和。

他坐上吉普车,正准备发动车。

这时,不经意间一瞥,他又看到了那盏孤灯。

那重回灯下的人影,那么专注,那么深沉,让这夜晚平添了一份诗意。

吉普车缓缓地开动,行驶在辛辛那提校园,漫天月光下。

杨成眺望车窗外的虚拟世界。

对于科学家而言,孤独寂寞是常态吧。

十年如一日,青丝成白发,又有什么后悔的呢?

第二百六七章 圣诞节

回到任务中心,杨成选择在城市大街上散步。

此时,天空飘着细细的雪花,若有若无。

在游戏里,已经是12月份了。

杨成伸出手,感受雪花融入皮肤的冰凉清爽。

他的思绪回到了从前。

“尊敬的玩家”。

耳畔响起一阵熟悉的系统音。

“圣诞将至,我们为您精心准备了一份节日礼物”。

“祝您游戏愉快!”

杨成听完,顿时左顾右盼。

哪里有礼物的半个影子呢?

“叮叮叮”

上空传来清脆的响铃声,一下子吸引了他的注意。

第二百六八章 圣诞老人

杨成抬头仰望天空。

他看到一个黑点越来越大。

what?

刹那间,那黑点变成了一个由两匹驯鹿拉着的雪橇。

上面端坐着一位圣诞老人。

“唰唰!”

雪橇停在了杨成面前,掀起一些尘土。

只见那圣诞老人头戴红色帽子,有着大大的白色胡子,一身红色棉衣,脚穿红色靴子,表情甚是憨态可掬。

“小伙子,圣诞节快乐!”

杨成有些惊讶,半天说不出话来。

这时,其中一头驯鹿蹭了蹭他,伸出舌头舔了舔杨成的手臂,显得很是亲昵。

第二百六九章 快上车

“嚯嚯嚯”

圣诞老人一捋花白胡子,露出慈祥的笑容来。

“小伙子,想不想要圣诞礼物啊?”

杨成挠了挠头。

“想”,他半天挤出这一个字儿。

“嚯嚯嚯”

圣诞老人饶有兴趣地上下打量着杨成。

“如果你愿意帮我解决问题,就送你一份”。

杨成很爽快地答应了。

“上来吧!”

圣诞老人指着身旁的空位。

杨成迟疑了片刻。

又是要上高空嘛,还是这种毫无防护的雪橇?!

“没时间啦,快上车!!!”

圣诞老人有些不满了。

杨成只好无奈地一屁股坐在空位上。

第二百七十章 翱翔天空(上)

待那杨成坐稳了,圣诞老人打了个响指。

“老伙计,go!”

两匹驯鹿欢快地一声啼叫,拉动了雪橇。

接着,杨成看到了违反物理常识的一幕:

雪橇居然朝着天空飞去了。

欧!我的上帝啊!

感受着耳畔呼呼的风声,杨成心跳一阵加速,他情不自禁地闭上了眼睛。

“放松点”。

圣诞老人安抚他。

“睁开你的双眼,周边的景色其实很美”。

杨成起初是拒绝的,直到他的心渐渐平静下来。

他感受着环境,发现一切并没有那么糟糕。

风雪轻柔地抚摸着他的脸庞,温暖得就像母亲的怀抱。

第二百七一章 翱翔天空(下)

杨成缓缓地睁开眼睛。

他看到那苍茫大地,银装素裹。

一眼望去,城市的街景尽收眼底。

坐着雪橇在天空自由翱翔,这种感觉真的很难用言语来形容!

“嚯嚯嚯”

坐在身旁的圣诞老人捋了捋胡须。

“克服了内心的障碍,你就能看到更美丽的风景啊”。

两头驯鹿不知疲倦地拉着雪橇,时间一点一滴的过去了

最后,雪橇停在了一栋高大建筑前。

“哟,到家了”。

圣诞老人走下雪橇。

第二百七二章 装配工厂

“请进”。

圣诞老人做出个邀请的手势。

杨成一脚跨进大门,瞬间被眼前的一幕惊呆了。

只见那各种各样的礼物堆积成山。

不远处,一条条流水线对礼物做装配,永不停歇地运转。

“您您家里是开了间装配工厂嘛?”

杨成不禁发出感慨。

“嚯嚯嚯”

“老头子我节日期间得配送那么多份礼物”。

“仅靠人力是忙活不过来的”。

圣诞老人也是颇为自豪。

“小伙子,有几个技术问题待你解决”。

“完事后,这里的礼物你可以任选一件!”

第二百七三章 访问计数

听到圣诞老人这么一说,杨成顿时有些跃跃欲试了。

“第一个问题,小伙子”。

圣诞老人提问了。

“我不知道你听说过我的个人网站没”。

“(虚构的喔)”

“这个站主页上有一个计数器,用来统计访问人数”。

“临近圣诞了,访客数量剧增”。

“我却观察到了一个奇怪的现象”。

圣诞老人若有所思。

“当访问量大的时候,计数器体现的和访问日志上的不一致呢!”

第二百七四章 查看代码

杨成思索了片刻。

“能看看您项目的代码嘛?”

常言道:

talk_is_cheap

show_me_your_code

“有的,有的!”

圣诞老人大手一招,眼前便出现了一个大型显示屏。

“这源代码还是外包公司移交给我的呢!”

杨成点开项目一看。

原来是用java做的服务器端。

他翻开首页模块,找到计数器的处理逻辑,仔仔细细一看。

哪里出问题了呢?

其实在通常情况下,也不是什么大问题。

这个访问计数实现并不是线程安全的。

第二百七五章 线程安全(上)

在不考虑多线程环境的情况下,很多代码实现都是完全正确的。

而一旦将它们放在多线程环境下,这个实现就变得非常的脆弱!

这种实现被称为线程不安全的。

在这个计数器java类中,定义了一个名为count的实例属性。

并且定义了一个setcount方法,用于对count属性做自增运算。

还定义了一个getcount方法,用来返回count属性的值。

这个程序大部分时候都是正确的。

然而,在访问量大的时候,高并发的情况下,它也就成了线程不安全类!

第二百七六章 线程安全(中)

对于这个程序来说,计数器类的count实例变量是“竞争资源”。

多条线程可能并发地访问它。

如果要做改进的话,应该将访问该“竞争资源”的方法通通变成同步方法。

也就是说,这个类中,set和get方法都要求同步。

在java中这是非常容易实现的。

有一个关键字:

synchronized

用这个关键字修饰方法,就能得到同步方法。

这样一来,计数器类就变成了一个线程安全类。

程序就不会有任何问题了。

第二百七七章 线程安全(下)

在java类库中,有很多线程安全类。

像vector,它是列表的线程安全实现版本。

像stringbuffer,它代表了字符序列可变的字符串。

它们都是些比较古老的类。

“没啥子大问题!”

杨成告诉圣诞老人。

“我很快就能修复好了!”

圣诞老人笑眯眯地看着他。

杨成给两个方法加上关键字,重新编译项目,发布运行。

这前前后后也就花了半个小时。

“好了”。

圣诞老人一捋长须。

“进入下一个任务吧”。

第二百七八章 圣诞驯鹿

“众所周知,我有8匹驯鹿”。

“老伙计们陪我常年送礼物,可真是任劳任怨哪”。

圣诞老人颇有感慨。

“通常,每多30份礼物,就需要多配置1匹驯鹿”。

“而拉雪橇的最低配置是2匹驯鹿”。

“雪橇和我也很重嘛”。

“也就是说,我一次能够携带的最多礼物数量是:”

(8-2)x30=180

“小伙子,我需要你根据这个编写业务逻辑”。

“给定任意数量的礼物n,求需要的最少驯鹿数量”。

第二百七九章 业务逻辑

杨成一听,觉得这业务逻辑很简单哇。

首先判断异常情况嘛。

如果礼物数量n小于0,或者大于最大装载数量180。

那就是无效输入参数。

如果参数数量在0到180之间,那就是合法参数。

以n=40为例:

雪橇最少需要2匹驯鹿,而每30份礼物就额外需要1匹。

所以驯鹿数量可以这样计算:

2ceil(40/30)=4

其中,ceil是指代浮点数向上取整函数。

在很多种编程语言中都有该函数的实现。

第二百八十章 天花板函数(上)

因为业务逻辑简单,杨成很快就写好了代码。

也就6,7行的样子。

他点击提交,执行代码。

“唰唰!”

“警告:l函数已被禁用!”

“请自行编写”。

杨成顿时瞪直了眼睛。

居然还有这样的问题?

在javascript中,ceil方法是绑定在math对象上的。

“嚯嚯嚯”

圣诞老人拍拍杨成的肩膀。

“小伙子,这个问题看上去并没有那么容易啊!”

杨成这才意识到,难点并不在业务上面。

第二百八一章 天花板函数(中)

怎么自己编写一个“天花板函数”呢?

杨成陷入苦苦的思索中。

其实在这个业务场景中,ceil函数的要求是被弱化了。

也就是说,只需要处理非负数。

而标准库中的实现,可还要求处理负数的呢!

杨成脑海中闪过无数技术社区上大牛们的心得体会。

他最终确定按两种情况来编写。

如果传入的参数是整数,作为一种情况。

整数的“天花板”(向上取整)不就是它本身么?

所以,原路返回!

第二百八二章 天花板函数(下)

如果输入参数是正浮点数,该怎么处理呢?

在javascript中,有一种非常简便的方法:

~x

对未知的正浮点数x,先做“按位取反”。

以x=55为例:

按位取反会去掉它的小数部分,得到-6。

这过程牵扯到位运算规则,以及二进制补码的知识。

然后,将-6的符号去掉,得到6。

这就是55的“天花板”。

对其它的正浮点数也可以这样做。

杨成根据这样的思路,很快就完成了一个ceil函数。

这不是“标配版”,是“阉割版”喔!

第二百八三章 圣诞礼物(上)

杨成将写好的函数替换到代码中,重新提交。

“唰唰!”

“恭喜您通过了所有的测试用例!”

杨成长吁一口气,感觉神清气爽。

“嚯嚯嚯”

圣诞老人也是流露出善意的笑容来。

“亲爱的程序员,你已经完成了所有的挑战”。

“那边的礼物,可以任选”。

杨成一听顿时来了精神。

他走到那礼物堆成的小山面前,好奇地观望。

这里真是琳琅满目啊!

挑选哪一个才好呢?

第二百八四章 圣诞礼物(下)

对程序员有吸引力的东西有很多哇。

像机械键鼠套装,一盒最好的巧克力或咖啡

然而,这都不是杨成的最爱。

他在礼物堆里面翻了翻。

突然,他脸上流露出惊喜之色来。

“就是这个啦!”

杨成将其一把拖出。

原来,是一个戴着眼镜的“程序猿”抱枕。

这猴子俏皮可爱,又不失儒雅,真是让人爱不释手啊!

“嚯嚯嚯”

圣诞老人又捋了捋胡须。

“你小子还真有眼光”。

第二百八五章 道格拉斯

杨成抱着“程序猿”抱枕,从圣诞老人的装配工厂走出来。

“系统妹子,感谢你们的圣诞礼物”。

杨成捏了捏“程序猿”毛绒绒,软绵绵的脸。

“接下来有什么任务推荐嘛?”

“有的”,系统很快就回复了。

“成成,你不是最喜欢使用javascript吗?”

“我给你推荐一位在开发社区中受人尊重的javascript专家”。

“道格拉斯先生”。

“你可以听听他的演讲”。

“想必会有所启发喔!”

第二百八六章 大会演讲(上)

“女士们,先生们,这里是javascript全球开发者大会”。

“下面有请嘉宾道格拉斯,为我们发表演讲”。

一位身材高大的老者走上了讲台。

他留着拉风的络腮胡子,人很安静,看上去有那么一点技术人员的木讷。

但当他站在演讲台上时,却是侃侃而谈,掷地有声。

“当我还是一个初出茅庐的程序员时,我想掌握自己所用语言的每一个特性”。

“我写程序时会尝试使用所有的特性”。

“我认为这是炫耀的好方法,而我也的确出了不少风头”

听到这里,台下响起一片善意的笑声。

第二百八七章 大会演讲(中)

“最终,我认定这些特性中有一部分特性带来的麻烦远远超出它们的价值”。

“对于大多数编程语言,都有精华和糟粕之分”。

“我发现如果取其精华而弃其糟粕的话,我可以成为一名更优秀的程序员”。

“毕竟,用坏材料又怎么能做出好东西呢?”

台下陷入了一片寂静。

事实上,即使是语言的设计者,他们面对语言中的缺陷部分,通常也是无能为力。

如果随意地改动,那样会损坏依赖于那些特性的程序。

第二百八八章 大会演讲(下)

“javascript中糟粕的比重超出了预料”。

道格拉斯眼中有着流光溢彩。

“它一诞生,就在短到令人吃惊的时间里被全世界所接受”。

“甚至没有在实验室里被试用和打磨”。

“当它还非常粗糙时,就被直接集成到浏览器中”。

“作为一门编程语言,javascript的流行几乎不受它质量的影响”。

听众们陷入沉思。

在那个浏览器群雄割据的“洪荒年代”,js没有一套统一的标准。

质量自然是难以保证。

第二百八九章 玩具语言

“在javascript中,美丽的、优雅的、富有表现力的语言特性就像一堆珍珠和鱼目混杂在一起”。

“而它最本质的部分被深深地隐藏着”。

“以至于多年前对它的主流观点是:”

“这就是一门丑陋不堪的玩具语言!”

道格拉斯的话,深刻而又引人深思。

“在我看来,javascript就像一块璞玉”。

“只有经过不断地精雕细琢,剥落那些不好的特性”。

“这门语言的真实本质才会显现出来!”

第二百九十章 优美的特性

演讲进行得很顺利。

道格拉斯用他的真知灼见,让听众们得到启发。

在一片掌声中,道格拉斯走下了讲台,退到幕后。

他随手拿了瓶矿泉水,找了个闲置的椅子,端坐在上面,自顾自地饮用起来。

这样的演讲他经历过很多次了。

随着年纪的增大,他越发感到力不从心。

但还是坚持在做,不为别的,只为了心中的“精华子集”吧。

就在这时,一个黄皮肤的年轻人,脸上带着和煦的微笑,走到他身前。

“道格拉斯先生”。

“您认为javascript有哪些优美的特性呢?”

第二百九一章 弱类型

道格拉斯打量着眼前这个年轻人,发现他一脸求知的渴望。

他放下矿泉水瓶。

“那我就谈谈吧”。

“javascript是一门弱类型的语言,所以它的编译器不能检测出类型错误”。

“这可能让从其他语言转向javascript的开发人员感到困惑”。

“弱类型是自由的”。

“我无须建立复杂的类层次”。

“也不用做强制转型”。

“这就是一种非常优秀的想法”。

js的变量可以用来保存任何类型的数据。

你甚至可以在初始化一个字符串类型的变量后,将其重新赋值为数字型。

这是有效的,但不推荐喔!

第二百九二章 函数

“javascript设计得最出色的部分就是函数的实现”。

道格拉斯接着说道。

“大部分函数都是基于词法作用域的顶级对象”。

“它几乎接近完美”。

“但是,想必你也能预料到,javascript的函数也存在瑕疵”。

函数包含一组语句,它们是js的基础模块单元,用于代码复用、信息封装和组合调用。

函数用于控制对象的行为。

一般来说,所谓编程,就是将一组需求分解成一组函数及数据结构的技能。

第二百九三章 对象字面量

“而javascript中最富表现力的地方,当属对象字面量表示法”。

“这种表示法是json的灵感来源”。

json是一种流行的轻量级数据交换格式。

道格拉斯是它的创立者。

对象字面量有多方便呢?

比如要表示一个数组:

[]

或是一个对象:

{}

亦或是一个嵌套对象:

[{}]

这比new一个对象或数组是不是要简洁的多呢。

第二百九四章 毒瘤

“谢谢您的指点”。

杨成觉得很幸运,能得到这样一位业内大牛的传道授业。

道格拉斯脸上浮现笑意。

这个年轻人很谦虚好学啊。

他决定多讲一些东西。

“然而,javascript有一些难以避免的问题特性”。

“我称之为毒瘤”。

“你必须知道这些问题,并准备好应对的措施”。

“正如威廉莎士比亚戏剧中的名言:”

“那会在一言一行中证明其可怕!”

第二百九五章 全局变量

“在javascript所有的糟糕特性之中,最为糟糕的一个就是它对全局变量的依赖”。

“全局变量就是在所有作用域中都可见的变量”。

“许多编程语言都有全局变量”。

“例如:java中public_static修饰的成员属性就是全局变量”。

“全局变量在小型程序中可能会带来方便,但随着程序变得越来越大,它们很快变得难以管理”。

“因为一个全局变量可以被程序的任何部分在任意时间修改”。

“如果引发了冲突,可能导致程序无法运行,而且通常难以调试”。

“所以,最佳实践是:”

“避免污染全局”。

第二百九六章 作用域

杨成深以为然地点了点头。

这样的说法他在论坛上听很多大牛谈到过。

道格拉斯则继续他的指导。

“javascript的语法来源于c语言”。

“在所有其他类c风格的语言里,一个代码块(括在一对花括号中的一组语句)会创建一个作用域,也就是块级作用域”。

“代码块中声明的变量在其外部是不可见的”。

“javascript则与众不同”。

“它的代码块中声明的变量在外部也可以被访问到”。

“这让有其他语言编程经验的程序员们大感意外”。

注:js在ecmascript6开始提供块作用域,而早期版本是木有的。

第二百九七章 自动插入分号

“javascript有一个自动修复机制,它试图通过自动插入分号来修正有缺损的程序”。

“但是,千万不要指望它,这玩意儿比天气预报还不靠谱”

“有时它会不合时宜地插入分号,导致程序被错误地解析,却没有任何警告提醒”。

杨成一听,耸了耸肩。

还有这样的机制?

不过,js语句结束的分号确实是可有可无的。

很多人喜欢不加分号。

这不是最佳实践喔!

加上分号可以避免很多错误,像不完整的输入,js代码压缩出错。

另外,某些情况下可以增进代码的性能,因为这样解析器就不用再花时间推敲该在哪儿插入分号啦。

第二百九八章 类型判定

“我问你,如果要判断一个变量的类型,你会怎么做?”

道格拉斯提出这个问题。

杨成略加思忖。

“用typeof运算符”。

道格拉斯显得饶有兴趣。

“很多人会使用typeof关键字,看处理后的返回类型。”

“这种方式,只能得到变量的大概类型,而无法获取它的详细信息。”

“像识别一个数组,就会返回:”

object

“而且还有一些天坑呢~”

“如果你用typeof识别null,还是会返回:”

object

“这简直太糟糕了!”

杨成表示赞同。

这不但是天坑,还是历史遗留天坑呢!

第二百九九章 解析成整数

“在javascript全局对象上,绑定了一个parseint函数”。

“它用于把字符串转换为整数”。

“这也是个不大不小的坑~”

道格拉斯舒展了一下筋骨。

“这函数在遇到非数字时会停止解析,所以把以下两个字符串传进去会产生相同的结果:”

16

16tons

“如果该函数会提醒我们出现了额外文本就好了”。

“但它不会那么做~”

事实上,像java也提供了这样的方法。

不过,它就处理得很严谨了。

如果字符串包含不可解析的内容,那么就会抛出如下异常:

numberformatexception

js这种容错的机制对于开发者而言,是幸运还是不幸呢?

第三百章 加法运算符

“在javascript中,加法运算符还有一层含义”。

“那就是字符串连接符”。

“它究竟会如何执行取决于其参数的类型”。

“如果有一个运算数是字符串,那么就是连接符”。

“如果两个运算数都是数字,它返回两者之和”。

“这个复杂的行为是bug的常见来源”。

道格拉斯说到这里,杨成觉得深有体会。

他可是曾经被坑过n次咯!

在经历过惨痛的教训后,他得出了一条宝贵的经验:

如果你打算做加法运算,请确保两个运算数都是整数。

第三百零一章 浮点数(上)

“既然说到了整数,那我就再谈谈浮点数吧!”

道格拉斯对待技术问题,毫不含糊。

“二进制的浮点数不能正确地处理十进制的小数”。

“所以嘛~”

0102==03

“很遗憾,它会返回false”。

“这是javascript中最经常被报告的bug”。

“why?”

“因为javascript遵循二进制浮点数算术标准(ieee754)”。

“这个标准对很多应用都是适合的”。

“但它违背了大多数你在中学所学过的关于数字的知识”。

第三百零二章 浮点数(下)

“那那我该怎么做呢?”

杨成自然是遇到过这样的坑。

“哈哈”。

道格拉斯爽朗地一笑。

“幸运的是,浮点数中的整数运算是精确的,所以小数表现出来的错误可以通过指定精度来避免”。

“这样来计算吧!”

01*10=1

02*10=2

12=3

3/10=03

“这样就能得到精确的结果”。

“举个现实的例子”。

“美元可以通过乘以100而全部转换成美分,然后就可以准确地将美分相加”。

“它们的和可以再除以100转换回美元”。

第三百零三章 非数(上)

“搜噶”。

杨成恍然大悟。

“原来还可以这样处理啊!”

道格拉斯则继续开始他的科普。

“年轻人,关于数字的坑还远远不止这些呢”。

“下面我要说到的是:”

nan(not_a_number)

“它是ieee754中定义的一个特殊的数量值”。

“用来表示,这不是一个数字”。

“该值可能会在试图把非数字形式的字符串转换为数字时产生”。

“令人惊讶的地方在于”。

“如何对nan进行检测”。

第三百零四章 非数(下)

“首先,你大概会想到,利用typeof”。

“然而,typeof不能辨别数字和nan”。

“它们都会返回:”

number

“而且nan也不等同于它自己”。

“所以嘛~”

nan===nan

“这里会返回false”。

“那该怎么检测nan值呢?”

“好在javascript提供了一个函数:”

isnan

“它可以辨别数字与nan”。

“嗯嗯”,杨成对这个特性有所了解。

道格拉斯咳嗽了一声,清了清嗓子。

“既然谈到了nan”。

“那就再聊聊跟它相似的几个值吧”。

第三百零五章 假值

“javascript拥有一组数量奇大无比的假值”。

“它们包括:”

数字型的0

数字型的nan

空字符串

布尔类型的false

null

undefined

“这些值全部都等同于假,但它们是不可互换的”。

杨成对此也是有所了解。

但他心中一直有一个疑惑,希望能在今天得到解答。

“道格拉斯先生”。

“您能谈谈数组吗?”

“我总感觉javascript的数组与众不同诶!”

第三百零六章 数组(上)

“你的猜测没有错”。

道格拉斯给予肯定。

“理论上来说,数组是一段线性分配的内存”。

“它通过整数计算偏移并访问其中的元素”。

“数组是一种简单但性能出色的数据结构”。

“然而”

“不幸的是,javascript没有像此类数组一样的数据结构”。

杨成顿时瞪大了眼睛。

这样的说法,他闻所未闻。

“这样说吧”。

道格拉斯正色道。

“javascript中的数组就是披着羊皮的狼”。

第三百零七章 数组(下)

“javascript没有真正的数组”。

道格拉斯一语道破其本质。

“作为替代,javascript提供了一种拥有一些类数组特性的对象”。

“也就是:”

array_like_object

“它会把数组的下标转变成字符串,用其作为属性”。

“这样做的好处是:”

“你不必给数组设置初始化大小”。

“而且它们永远不会产生java那样的越界错误:”

arrayindexoutofboundsexception

“但是”

说到这里,道格拉斯眼含笑意。

“它们的性能相比真正的数组可能相当糟糕”。

第三百零八章 糟粕

“您的解答让我茅塞顿开!”

杨成由衷地赞叹道。

他感到有些汗颜,原来自诩对javascript颇为了解的自己,知识面却是浅薄和不完整的。

道格拉斯眼中有着一份淡淡的欣赏。

不经意间,他又开始了指导。

“相对于毒瘤,有一些有问题的特性,不是那么严重”。

“我称之为糟粕”。

“我们很容易就能避免它们”。

“聊聊这些简单的做法吧,你可以成为一个更好的程序员”。

第三百零九章 相等运算符

“javascript有两组相等运算符:”

===

!==

“以及它们邪恶的孪生兄弟:”

==

!=

“前一组运算符会按照你期望的方式工作”。

“如果两个运算数类型一致且拥有相同的值,那么(===)会返回true,(!==)返回false”。

“而后一组运算符则不然”。

“如果两个运算数是不同的类型,它们会试图去强制转换值的类型”。

“像这样:”

null==undefined

“这里会返回true”。

“我的建议是永远不要使用那对邪恶的孪生兄弟”。

“它们会酿成大祸”。

第三百一十章 魔鬼函数(上)

“下面我要谈到的这个函数,和魔鬼似乎有点关系”。

“eval(evil)”

道格拉斯一捋络腮胡子,显得兴致勃勃。

“这个函数接收一个字符串,并将其解析,动态执行”。

“它是一个被滥用得最多的javascript特性”。

“那些对javascript语言一知半解的人们最常用到它”。

“它就像一个魔鬼,既拥有强大的能力,而你和它打交道,又得付出相应的代价”。

第三百一一章 魔鬼函数(下)

“首先呢”。

“使用eval形式的代码更加难以阅读”。

“提高了开发成本”。

“其次,这种形式使得性能显著降低,因为它需要运行编译器”。

“可以说是大动干戈~”

“最后呢”。

“eval函数还减弱了你的应用程序的安全性,因为它给被求值的文本授予了太多的权力”。

“所以,我的建议是:”

“永远不要和魔鬼打交道!”

道格拉斯揭开了这个函数邪恶的一面。

第三百一二章 位运算符

“我要谈到的最后一点内容”。

道格拉斯拾起矿泉水瓶。

杨成则是仔细倾听,唯恐漏过一个字儿。

“javascript拥有与java相同的一套位运算符”。

“像按位与、按位或、按位异或、按位非、带符号右移位、无符号右移位、左移位等等”。

“在大多数语言中,这些位运算符接近于硬件处理,所以非常快”。

“但javascript的一些执行环境,比如浏览器端,接触不到硬件,所以非常慢”。

“用或不用位操作,取决于具体场景”。

第三百一三章 落幕

“javascript全球开发者大会至此落下帷幕”。

“感谢大会主办方,感谢到场的嘉宾,感谢现场的观众们”

杨成看着道格拉斯逐渐消失的身影。

他心中非常充实。

耳畔又回响起刚才的劝勉:

“我觉得你应该拥有这样的学习态度,那就是:”

“对于任何新的知识,都应该”。

“取其精华,去其糟粕”。

“在你们国家古代,有一位圣贤孟子”。

“他说过:”

“尽信书,则不如无书”。

“不也是这样的道理吗?”

第三百一四章 收获

回到任务中心。

“成成,这次有什么收获嘛?”

系统声音传来。

“道格拉斯先生他那广博的学识,丰富的经验,真是让我折服”。

杨成细细地回味刚才的谈话。

“和他交流的过程就是自我检讨和学习的过程啊”。

“如果有一天,自己能成为那样的专家就好咯!”

系统嘿嘿一笑。

“坚持学习吧,会有那么一天的”。

“哦,对了”。

“计算中心又开放了,要不要去看看?”

第三百一五章 着火的机房

杨成刚传送到计算中心。

空气中弥漫着烧焦的味道,有点刺鼻。

莫非这里的人在搞烧烤?

杨成左顾右盼。

一群工作人员急匆匆地从眼前跑过,手里还提着灭火器。

“机房负荷过大,起火了!!!”

就在他无所适从的时候,一个领导模样的人走过来。

“是小杨吧?”。

杨成规规矩矩地点点头。

“我要去机房视察一下”。

“给你安排个小任务”。

“我回来要看做得怎么样”。

第三百一六章 又是斐波那契

“你仔细听好咯”。

领导开始下达任务。

“我要你实现一个函数”。

“求出斐波那契数列第n项的最后一位数字是多少?”

又是斐波那契数列?

杨成眉头一皱,隐隐约约的感觉事情并不简单。

这里可是负责大型科学运算的计算中心。

一些常用的手段很可能会崩盘。

“小伙子,别让我失望啊”。

领导拍拍他的肩膀,往机房方向走过去。

杨成则陷入这个问题的思索中。

第三百一七章 常规方法

众所周知,斐波那契数列如下:

0,1,1,2,3,5,8,13,21,34

那么,每一项的最后一位组成的序列就是:

0,1,1,2,3,5,8,3,1,4

所以,杨成最早能够想到的方法就是利用通项公式。

在这里,你只需要对每一项的最后一位做加法运算。

甚至不需要借助大数运算库,因为都是个位。

杨成调出编辑器面板,很快就搞定了这个函数。

他心里还是有些忐忑不安的。

这个方法效率是线性的。

也就意味着,n如果上亿就很吃力了。

第三百一八章 数量级增大

没过多久,领导就折返了。

看样子机房的火情得到了控制。

他看了看正在冥思苦想的杨成。

“小杨啊,任务完成得怎么样了?”

杨成将编辑器面板调给领导看。

“我用的通项公式”。

他手心都攥出了汗,心里更是十五个吊桶打水,七上八下~

领导会满意嘛?

“哈哈”,领导脸上流露出和颜悦色。

“你的思路是正确的”。

“实现也没问题”。

“可是”

说到这里,领导话锋一转。

“如果n调大到10的20次方,你又如何改进自己的方法呢?”

第三百一九章 对数级方法

这样的数据量,对于一般的计算机而言,实在是太大了!

线性的方法肯定不行。

杨成很快就想到,利用斐波那契矩阵求解。

这样做的效率是实实在在的对数级。

肯定能满足需求。

但实现起来略微麻烦。

那有没有既简单又效率很高的方法呢?

他将求助的眼光投向领导。

“小杨啊,给你一点提示吧!”

领导回馈给他一个鼓励的眼神。

“你思考一下”。

“对于斐波那契数列每一项的最后一位,有没有一个固定的模式呢?”

听到这里,杨成眼前一亮。

第三百二十章 固定模式(上)

杨成将前100项的最后一位列出来。

然后,他目不转睛地盯着这些数,想瞧出个所以然来。

10分钟很快过去了

杨成只感觉头晕目眩,汗珠冒了出来。

这究竟是个啥固定模式哟!

他擦了一把汗,一副颓唐的表情。

“你们这些年轻人哟,就是沉不住气!”

领导一副恨铁不成钢的表情。

“那我就直接说了吧”。

“你先列出第0项到第59项”。

“再列出第60项到第119项”。

“两者比对一下”。

第三百二一章 固定模式(中)

杨成老老实实地按照领导说的来做。

第0到第59项对吧

第60到第119项对吧

他仔仔细细地罗列出来,然后一比对。

咦?

竟然一模一样!

居然是两个相同的序列。

这意味着什么?

从第0项开始,每60个序列元素构成一个循环周期。

也就是说,规律像这样:

0,1,1,2,3,5,8,3,1,4(60项)0,1,1,2

这不就很好实现了吗?

妥妥的常量级方法啊!

第三百二二章 固定模式(下)

首先,将第0项到第59项缓存到全局数组里面。

接着,将要求的项数n对60作取余运算,得到余数r。

最后,就只需要从全局数组取第r项就行啦。

杨成很快就搞定了这个方法。

“您这个方法真是既简洁又高效哇!”

他由衷地赞叹道。

“小杨啊”。

领导打趣地说道。

“你这次的考核不算通过哟”。

“我再考考你”。

“这次要说到的,是一种特殊的数”。

第三百二三章 特殊的数

“81这个数有一项特殊的性质”。

领导娓娓道来。

“它的每一位数字之和:”

81=9

“而9的平方呢,又等于81它自身”。

“再来看看512这个数字”。

“它的各位数字之和:”

512=8

“而8的立方呢,又等于512它自身”。

“对于这一类特殊的数”。

“它们的每一位数字之和的n次方与自身相等”。

听到这里,杨成就感觉,这一类数肯定十分稀少。

估计是越到后面的项,跨度就越大。

第三百二四章 长整型

“你的任务就是找出,在java的长整型范围内,有多少个这样的,特殊的数”。

领导发布了新指示。

“长整型?”

杨成不禁倒吸一口凉气。

这也太大了吧!

java的长整型能够表示的上限是:

2的63次方减去1

这意味着一件让人绝望的事情:

千万不要使用穷举法!

想都不要想!

领导眼中闪烁着狡黠的光芒。

“小伙子,考验你智慧的时候到了”。

第三百二五章 灵光一现

杨成陷入了冥思苦想中。

按照正常的套路,这个问题是解不出的。

得换一种思路。

哪一个地方是突破点呢?

杨成仔细地回味领导的话。

该数字的每一位之和

事实上,对于长整型来说,它最长只有19位。

也就是说,长整型数字每一位之和,理论上只有如下种可能:

19乘以9

171种可能!

实际情况应该更少!

这或许就是解决问题的关键。

杨成开启了逆向思维。

第三百二六章 逆向思维

杨成心想:

反正只有171种可能。

我如果把从1到171这些数,测试它们的平方、立方、n次方。

以8为例:

8的平方是64,64的各数位之和是10,不等于8,所以64不满足条件。

8的立方是512,512的各数位之和是8,相等,512是满足条件的数。

8的n次方是

这样就能很快找出长整型范围内的这类数。

相比于穷举法,性能提升就太明显了。

“看样子你已经发现了窍门”。

领导看那年轻人舒展了眉头。

第三百二七章 举荐

有了正确的思路,实现代码是水到渠成的事。

杨成编译代码,再运行。

“唰唰!”

这类特殊的长整型数,一行行列举出来。

总共才几十项,验证了杨成之前的猜测。

领导轻轻地抚摸着下巴,满意地点点头。

这个年轻人观察力与思维都不错。

是棵好苗子啊!

“小杨啊”。

“这个任务完成的不错”。

领导思忖了片刻。

“我有位朋友吉姆,他是宇航中心的火箭专家”。

“举荐你到他哪里学习学习吧”。

第三百二八章 失败的发射

远离城市的宇航中心。

一座高大的火箭矗立在地面,蓄势待发。

“一级准备”

“二级准备”

“各部门准备就绪”。

广播声向四面八方传递。

“开始倒计时”

“10,9,8”

“3”

“2”

“1”

然而,预想的“发射”声并没出现。

估摸着过了五秒钟。

“boom!”

一个巨大的爆炸声通过广播,响彻了整个宇航中心。

在场的工作人员四处逃窜。

场面混乱不堪。

那矗立着的大火箭却是毫发无损

第三百二九章 火箭专家

又过了半个小时,宇航中心才恢复了正常运转。

“广播通知:请火箭专家吉姆速来指挥中心”。

一行三人行色匆匆地赶往指定地点。

其中包括:

一副苦瓜脸的火箭专家吉姆。

面色阴郁的助手杰夫。

来打酱油的学徒杨成。

杨成边走边思量。

这到底发生了啥事呢?

刚才的爆炸声他也被吓到了。

隐隐约约地,他嗅到了一股阴谋的气息。

这绝不是意外!

第三百三十章 指挥中心

话说一行人刚踏进指挥中心大门。

一个威严的声音传来。

“火箭专家吉姆,我需要你尽快查明原因”。

“这到底是一场恶作剧”。

“还是说,有人精心策划的结果”。

吉姆脸色越发疾苦,整个身子不由自主地颤抖起来。

“那那我就先从倒计时程序开始查吧”。

“我希望能够查看所有源代码”。

杨成一听,反而充满了期待。

那威严的声音再次响起。

“授予你所有的查看权限!”

第三百三一章 倒计时程序

大家眼前很快浮现了一个大型屏幕。

上面写满了密密麻麻的代码。

杨成定睛一看。

哟呵!

这个倒计时程序居然是用js写的。

这就有意思了。

这函数封装的是怎样的逻辑呢?

首先映入眼帘的是一个这样的数组:

[10,92,1]

从数字10到1。

可以看出,这个数组就是倒计时播报的内容。

让杨成百思不得其解的地方是:

为什么,这些数字播报完毕后,会出现爆炸声?

第三百三二章 有古怪

杨成接着查看数组的处理逻辑。

他看到一个迭代语句对数组做迭代。

每迭代出一项,就会对该元素(数字)进行播报。

也就是alert操作。

杨成反复检查迭代语句,没有发现任何异常的地方。

他顿时就十分困惑。

到底是哪里不对劲呢?

既然迭代语句没有问题,那就只有一种可能:

数组本身出现了问题。

杨成的脑海中一道闪电划过。

这数组,有古怪!

第三百三三章 原型链(上)

在js中,所有的数组对象,都继承自一个对象:

totype

而这个对象,又继承自另一个对象:

totype

这就是所谓的“原型链”。

js独特的“原型式继承”方式。

那它和当前的这个问题有什么关系呢?

如果用迭代语句迭代数组对象。

它首先会迭代数组本身。

然后呢,它会沿着“原型链”向上爬。

如果父对象中有可迭代属性,那么就会被迭代出来。

所以,杨成猜测:

很有可能某个父对象被人篡改了!

第三百三四章 原型链(中)

想到这里,杨成走到吉姆身前,在他耳边嘀咕了几句。

吉姆一听,脸上闪过一丝惊讶。

他恭恭敬敬地说道。

“尊敬的指挥官,我请求打印数组对象的原型链”。

“可!”

指挥官的声音在室内回荡。

吉姆打开控制台面板,输入指令:

“唰唰!”

数组对象的整条原型链被展开成树状菜单。

吉姆快速扫描其中的属性。

他很快发现了一些不同寻常的信息。

第三百三五章 原型链(下)

“发现可迭代属性!”

吉姆难以置信地指着控制台上某处。

mit

这个属性赫然出现在众人的视野中。

吉姆点出它的属性值。

正是之前让人们惊慌失措的:

“boom!”

真相浮出水面。

“非常好”。

指挥官的声音中带着一份淡淡的欣喜。

“火箭专家吉姆,你是怎么想到这一点的?”

吉姆指着不远处的一位年轻人。

“这位学徒,杨成,是他指点了我”。

第三百三六章 幕后真凶

“真是个不错的年轻人”。

指挥官的声音归于平淡。

“这次的事故,我们发现了原因”。

“但是”

“究竟是谁偷偷修改了代码,却是不得而知”。

“我希望大家提高警惕”。

杨成手托着下巴,陷入思考。

他隐隐约约感觉,这个幕后真凶一定会再次行动。

火箭专家吉姆在控制台使用如下指令:

delete

清除掉了原型链上的dammit属性。

就在这一瞬,一道阴冷的目光从不远处扫视过来。

第三百三七章 宇航中心之夜

夜幕降临,整个宇航中心被星星点点的灯光所点缀,就如同一件艺术品。

那安然矗立在远处黑幕下的巨大火箭醒目而耀眼。

一座高大、明亮的蓝色玻璃楼前,杨成正在漫步。

他的思绪纷飞,早已越过大气层,飞向了月球。

他仿佛看到了阿波罗飞船,成功登月,实现人类理想。

距离继续放大

那早已飞出太阳系的旅行者号探测器。

这是一个来自遥远蓝色星球的小小礼物。

在这个浩瀚无垠的宇宙中,表达我们对未知世界的美好祝愿。

“我要走到世界的尽头”

“寻找传说已久的雪人”

第三百三八章 故乡的云

脑海中回响起熟悉而悠远的歌声,杨成思绪万千。

如果说有什么最能激发人们探索的念头。

那便是星辰与大海吧!

然而,现实的世界,光凭肉眼已经很难看到美丽的星空了。

钢筋水泥的城市里面,只能看到灰蒙蒙的一片。

也许以后,就只能在游戏里观赏了。

杨成低垂着头,走到建筑的阴影深处。

他的眼中有着一些迷惘。

记忆中,故乡的云犹如洁白的棉花糖一般,捏成各种形状,漂浮在蓝蓝的天空。

现在的自己,甚至不想抬头看。

因为它们早已失去了原本的色彩。

第三百三九章 暗夜黑影(上)

就在杨成怅然若失的时候。

在他身后传来一个阴沉的声音。

“你这臭小子,破坏了俺的计划”。

“居然还有这样的闲情逸趣!”

杨成一惊,正想转过身子。

一抹闪亮而锋利的匕首刹那间浮现在他脖子上。

感受到那锋芒及划破皮肤的真实触感,杨成瞬间石化了。

他万万没有想到,在这样祥和宁静的夜晚,自己居然会被绑架。

“你你是谁?”

杨成浑身颤抖着,勉强保持镇定。

第三百四十章 暗夜黑影(中)

“我是谁,你待会就知道了”。

那匕首的主人似乎很有耐心。

大概僵持了五秒钟。

杨成感觉一阵头晕目眩。

一个黑色的头套罩住了他的脑袋。

“唔唔”

他顿时感觉呼吸不畅,挣扎了几下。

“不许动!”

那凶手发出警告,同时那匕首抵得更紧了。

杨成乖乖地举起双手,表示自己不会反抗。

“跟我走!”

凶手一声低喝,劫持着杨成在黑夜中一步步前行。

第三百四一章 暗夜黑影(下)

耳畔响起轻风卷起残叶的声音。

眼前一片漆黑,杨成的心渐渐平静下来。

直觉告诉他,这个凶手一定是宇航中心的内部人员。

他对这个路线太熟悉了,没有丝毫的犹豫。

感受到自己脖子旁的匕首,杨成开始思忖。

现在还不是逃脱的最佳时机!

很快,他听到了门被推开的“嘎吱”声。

进门,然后“嘭”的一声关门。

接着,又是大门被反锁的声音。

这个凶手考虑的很周祥啊。

这下子该露出他的庐山真面目了吧!

第三百四二章 原来是你

杨成的头套被人解下。

他慢慢恢复了视力。

首先映入眼帘的是一把指着他的ak47。

杨成悚然一惊,然后看清了凶手的面目。

他不禁倒吸一口凉气。

“原来是你!”

眼前的这位,就是火箭专家吉姆的助手,杰夫。

这杰夫面色一如既往的阴郁。

他扬了扬手中的ak,示意杨成保持安静。

杨成乖乖地闭上嘴巴。

他可不想被扫成筛子。

看这情况,杰夫是要我帮他做什么事儿?

第三百四三章 被破坏的计划

“其实,我是受雇于某个组织”。

“目的是前来宇航中心潜伏,执行计划”。

杰夫端着ak,陷入思绪中。

“如果没有你,这么快就找出问题所在,我们还会有下一步计划”。

“现在指挥中心那些老头子已经怀疑到了我身上”。

“我必须立刻向组织汇报情况,及早脱身”。

杰夫眼中闪过一丝焦躁。

“具体的信息内容太长,需要进行编码压缩”。

“小子,想要活命的话,就帮我做事!”

“我需要你写一个压缩及还原的工具”。

第三百四四章 哈夫曼编码

编码?压缩?还原?

杨成心里表示,自己从未做过这类的工具。

但眼睛瞟到ak那黑洞洞的枪口,他不得不开始了思索。

的确,在他的所学中,有一种可以解决报文编码问题:

哈夫曼编码

这种编码可以很有效地压缩数据,节省大量的空间。

杨成回顾相关的知识。

这个哈夫曼编码是基于一种常用的数据结构:

二叉树

然而,这种二叉树拥有一些不同寻常的性质。

称之为,最优二叉树。

第三百四五章 最优二叉树

带权路径最小的二叉树被称为哈夫曼树或最优二叉树。

这都是些基本概念,杨成简单地回忆了一下。

关键在于,如何创建哈夫曼树。

与一般的先构建根节点,后叶子节点的建树策略不同。

哈夫曼树是先叶子后根的。

它会每次选取节点集合中权重最小的两个节点,作为左右子节点。

这其实就是一个很简单且有趣的子问题:

给定一个集合,如何找出里面权重最小的两个节点?

第三百四六章 快速排序

一种最直截了当的方法是:

对集合中所有的节点进行排序,然后找出权重最小的两个节点。

杨成决定采用快速排序。

它有很多优点:

实现简单、速度非常快、空间复杂度很低。

这些优秀的特性让它成为应用最广泛的排序算法。

在它身上,体现了一种“分而治之”的策略。

而实现的关键就在于“切分”。

作为一名有几年编程经验的爱好者,杨成对此自然是很熟悉。

就在他正准备打开编辑器的时候,他突然产生一个疑惑。

既然只是找出最小的两个节点,我何必整体做排序呢?

第三百四七章 冒泡

杨成的脑海中,浮现出了一个池塘。

池塘底部,一个又一个的气泡咕噜噜地冒出来。

对啦,可以使用冒泡排序!

不过,这里只需要冒两次泡。

第一趟,把权重最小的气泡(节点),冒出水面。

第二趟,把权重第二小的气泡,冒出来。

然后,提取出这两项就可以了。

这样做,相较于快速排序,不但实现起来更简单。

当数据量越来越大,效率优势也会越来越明显。

嗯,皮卡丘,就决定是你了!

第三百四八章 大功告成

没过多久,杨成便写好了一个构造哈夫曼树的方法。

接着,他在此基础上扩展了编码与解码方法。

然后,就是测试了。

控制台上一行行指令被发布:

基础测试用例准备中

“abcdabcaba”

转换为对应二进制码中

测试长度为19,为该字符串的最短二进制编码

开始解码测试

测试通过!

随机测试用例准备中

恭喜您通过了所有的测试!

控制台上一行行绿色的对勾悄然浮现。

第三百四九章 卸磨杀驴

“你这下应该放过我了吧!”

杨成两手一摊,松了一口气。

杰夫看了看那几个写好的方法,脸上流露出喜色。

但转瞬间又化为了一片阴霾。

此子断然不可留!

这么一想着,他又将ak枪口对准了杨成。

“你!你这是要卸磨杀驴吗!”

杨成脸色大变,冷汗直冒。

“没错!”

杰夫缓缓地将食指扣在了扳机上。

他表情冷峻,不带任何一丝情感。

“你就是那头倒霉的驴!”

第三百五十章 爆破组

杨成绝望地闭上了眼睛。

他怎么也没想到,杰夫竟然是如此穷凶极恶之人。

就在那ak枪口即将喷射出死亡烈焰。

屋外却传来一些不同寻常的声音。

“爆破组准备!”

“起爆!”

“嘭!!!”

一声巨响。

大门被气浪掀开,整个屋子弥漫着浓重的白烟。

就在这突发事件过去的1秒钟

杰夫手一滞,眼神茫然,暂时失去了目标。

杨成睁开眼睛,大脑开始了05秒的思索。

绝佳机会!必须一招制敌!

第三百五一章 上勾拳

想到这里,杨成也不知道哪里生出来的勇气。

他上身微微下沉,右手握拳,开始蓄势。

估摸着又过了1秒钟

杨成右臂青筋暴起,显然已达到极限。

“呵!”

他一声怒吼,一记势大力沉的上勾拳朝杰夫的下巴挥出。

“啪!”

杰夫在猝不及防之下,挨了个结结实实。

一时间唾沫横飞,杰夫身体直往后仰。

他怎么也没想到,眼前这个看似手无缚鸡之力的年轻人竟能爆发出如此恐怖的力道。

第三百五二章 不许动

就在杰夫倒地的第一时间。

烟雾弥漫的房间里冲进来整整一个加强排的警卫。

他们荷枪实弹,将他团团围住。

“不许动!”

只见那杰夫的脸上一阵抽搐,口吐白沫,竟是不能言语。

他的ak摔落一旁。

杨成心有余悸地拍了拍胸口。

打完这拼尽全力的一拳,他全身犹如散了架一般。

作为一名温驯的准程序员,自己有多少年没打过架了?

“我的上帝啊”。

随后赶到的是一副苦瓜脸的火箭专家吉姆。

“伙计,谢天谢地,还好你没事”。

第三百五三章 事件结尾

第二天清晨。

“广播通知:基地工作人员杰夫,擅自勾结外部组织破坏基地的火箭发射计划,证据确凿,现停职接受进一步调查”

高大、明亮的蓝色玻璃楼前,两人正在漫步。

“害你受苦了”。

火箭专家吉姆满怀歉意地说道。

“其实我们早就怀疑到了杰夫头上”。

“这次的计划不过是引蛇出洞”。

杨成脸上一副“早就知道”的表情。

不过,自己成了诱饵,这经历感觉太糟糕了。

“要不要留下来观摩火箭的发射?”

吉姆提议道。

第三百五四章 约翰教授的来信

杨成正打算开口接受。

就在这时,他的短信箱突然变成了通红的颜色。

里面躺着一封署名约翰教授的来信。

杨成点开一看,全文如下:

小伙子,听说你遭遇了一些不愉快的事儿?

来我的宅院,老头子给你讲些有意思的东西。

接受or拒绝

杨成考虑了片刻。

“吉姆先生”。

“谢谢您的好意”。

“我有事儿,就不留了”。

他摁下接受按钮,整个身体很快融入场景的变换中。

第三百五五章 浇花(上)

再次见到约翰教授,他正在自己的小院里,手里拿着个洒水壶,悉心地给花花草草浇灌。

“教授”。

杨成热情洋溢地打了个招呼。

“你来了”。

约翰脸上浮现出和蔼的微笑来。

“老头子我年轻的时候,最大的理想就是在退休后,能拥有一间这样的院子,每天伺弄这些”。

“如今心愿已偿,倒也是自得其乐”。

说着,他放下了洒水壶。

“年轻人,你看那盆向日葵”。

此时阳光明媚,那花儿就犹如一团熊熊燃烧的火焰,华丽地绽放。

第三百五六章 浇花(下)

“所谓一花而见春,一叶而知秋”。

约翰颇有感慨。

“只有懂得见微知著的人才能真正打开科学世界的大门。”

杨成点点头,内心却是有些惶恐。

自己离这样的境界还差得远哪。

“哈哈,小伙子”。

约翰瞧见他这沮丧的模样,禁不住一乐。

“这都是我这些年的心得体会”。

“你随便听一听就好了”。

杨成这才恢复了神采。

“好了,接下来老头子我就讲一些有趣的东西吧”。

第三百五七章 快乐的数(上)

院子里一棵大树的阴影下,一老一少正在攀谈。

“在数学极客和计算机怪咖的眼中”

“他们喜欢赋予数字以人类的情感和个性”

约翰教授饶有兴趣地讲述着。

“于是乎”

“便有了一种特殊数的定义”。

“happy_number”

“也就是,快乐的数”。

听到这里,杨成顿时兴致大增。

这样的概念,简直是闻所未闻哪。

他竖起耳朵,屏住呼吸,想要听个究竟。

第三百五八章 快乐的数(中)

“数字7就是一个快乐的数”。

约翰教授一捋胡须。

“计算它每一位数字的平方和得到49”

“计算49每一位数字的平方和得到97”

“计算97每一位数字的平方和得到130”

“计算130每一位数字的平方和得到10”

“计算10每一位数字的平方和得到1”

“一旦这个序列达到了1”

“它将永远保持1的状态”。

“因为”

“1的平方还是1啊”。

“所以,能通过这样的过程达到1的数字就是快乐的”

听到这里,杨成顿时觉得很稀奇。

“那教授,既然有快乐的数,那有没有伤心的数呢?”

第三百五九章 快乐的数(下)

“呃这个就不清楚了”。

约翰教授耸耸肩。

“不过,如果同样的数在序列中出现了多次”

“那就意味着,这个起始数是不快乐的”。

“像数字4,就是一个不快乐的数”。

4,16,37,58,89,145,42,20,4

“4重复出现了”。

“这说明有一个环,而序列永远不会到达1”。

杨成点点头,表示听懂了。

“接下来”

约翰清了清嗓子。

“我要谈到另一种特殊的数”。

第三百六十章 丑数(上)

“有一种数被称作丑数”

“ugly_number”。

“也不知道是哪一位天才创造出来的概念”

约翰教授也是一阵吐槽。

“丑数的定义非常简单”。

“它只能够拥有以下的质因数:”

“2,3,5”。

“所以嘛,前10项丑数如下:”

2,3,4,5,6,8,9,10,12,15

“如你所见,没有数字7,没有11,也没有14”。

“因为它们包含范围以外的质因数”。

“关于丑数有一个有趣的问题”。

第三百六一章 丑数(中)

“那就是,如何高效地找出第n项丑数来?”

“小伙子,你想一想吧”。

约翰教授不再言语,静静地伫立在一旁。

杨成则是手摸着下巴,开始了思考。

按照正常的方法,需要遍历正整数,一一判断是否是丑数,直到找到第n项为止。

而判断丑数,本身就是个耗时操作。

需要分解质因数,然后判断是否在2,3,5之列。

如果不在,那就不是丑数。

这种方法只能限于小数求解,远远谈不上是高效的。

第三百六二章 丑数(下)

杨成对这种常规方法进行实测。

他发现当n大于500项的时候,耗费的时间就得以秒来计算了。

在程序的世界,秒级绝对谈不上是高效的。

即使是普通家用电脑,也应该控制在毫秒级。

但他却无计可施

已有的知识限制了他的想象力。

杨成只好将求助的眼光投向约翰教授。

“哈哈,小伙子”。

教授也不卖关子。

“你可以考虑使用动态规划法”。

“它可以将效率提升到线性”。

“而只需要付出n同等大小的额外存储空间”。

第三百六三章 超级丑数

杨成一听,抓耳挠腮。

动态规划法?

完全get不到点哪!

“年轻人,不要急,留着慢慢琢磨”。

约翰教授一副和颜悦色地说道。

“其实,在丑数中,也有一种异类”。

“称之为,超级丑数”

“super_ugly_number”

杨成顿时瞪直了眼睛。

这里连丑数都没搞定呢!

这么快就上超级版本了?

他只好摆摆手。

“教授,今天讲了这么多了,容我先消化消化”

约翰教授微微点头。

他半眯着眼睛,怡然自得地沐浴在阳光的照耀下。

第三百六四章的旅程

一阵轻风吹来,阳光下的向日葵被拂动,更显活力。

约翰教授拖着年迈的身躯,一步步走向自己的住所。

杨成却还沉浸在自己的思索中。

没想到,连数字都有喜怒哀乐呀。

甚至还有美丑之分呢!

真是个有趣的故事。

“系统妹子”

杨成轻声呼唤道。

“下一个关卡,给我来一次经典的算法之旅吧!”

他的请求很快得到了回应。

变幻的场景中,一阵阵热浪袭来

第三百六五章 海南(上)

位于祖国最南端的广袤土地。

这里地处热带,稻可三熟,菜满四季,素有“天然大温室”的美称。

此时,烈日当空,往日的稻田里都会是一片繁忙的景象。

一位老者站在田垄上,沉默不语。

在他眼前,数年来的心血毁于一旦。

试验田被人踩得稀烂,秧苗被拔光

那几十个装载了幼苗的坛坛罐罐则是被彻底地砸烂

老人脸上的皱纹更深了,滴滴汗水从脸颊滑落,洒落在这片黄土上。

第三百六六章 海南(中)

身旁一位年轻人走上前,想要劝慰。

老人摆了摆手,缓缓地说道。

“我们没有时间来叹息”。

“国家正在经历动乱”。

“还有上亿人吃饭的问题都没有解决”。

话说完他从田垄走下,在残败的田间一阵寻觅。

没过多久,弯腰驼背的老者便找到了想要的东西。

那是几株保存完好的水稻秧苗。

老人脸上多了一份欣喜之色,爱怜地捧起。

这是他最宝贵的财富。

第三百六七章 海南(下)

“小杨”。

老人轻声呼唤道。

年轻人立马走过来,聆听他的教导。

“给你安排个任务”。

“我这里有两株不同品种的水稻秧苗”。

“你帮我比较它们的基因,确定其相似度”。

杨成从老人手中接过。

他的眼前立刻浮现出两个dna串。

老人做完这些,又陷入了沉默。

他的眼中有着一份坚定与执着。

弯下腰,他又开始了“拾穗”。

更多的汗水洒下,和在田间的泥土上。

第三百六八章 基因相似度(上)

一旁的杨成看着眼前两个dna串,陷入了沉思。

在生物应用中,经常需要比较两个不同生物的dna。

而一个dna串由碱基分子组成。

碱基有腺嘌呤、鸟嘌呤、胞嘧啶和胸腺嘧啶4种类型。

这都是中学生物所了解过的知识。

那它和编程有什么关系呢?

如果我们用英文单词首字母表示4种碱基,那就是:

a,c,g,t

这样,就可以把一个dna串表示为包含4种大写字母的字符串。

第三百六九章 基因相似度(中)

比较基因相似度的这个任务,换句话说,就是比较字符串相似度。

对此,杨成已有了一定的认识。

判断字符串相似度其实有很多标准。

最简单的,例如,如果一个dna串是另一个dna串的子串,或者是子序列。

那么就可以说它们是相似的。

杨成随便瞟了瞟两个串。

很显然,并不满足以上的关系。

情况比想象的要复杂。

杨成开始回顾以前做过的关卡,他处理过这样的问题。

第三百七十章 基因相似度(下)

在以前的关卡中,是这样定义相似性的:

如果将一个串转换为另一个串所需要的操作很少,那么它们就是相似的。

也就是所谓的最短编辑距离。

想到这里,杨成挠了挠头。

这种方式不太好实现。

因为这种编辑操作方式有很多种。

以前的关卡只涉及到了新增、删除、修改字符操作。

然而,还有好几种编辑操作没有考虑到。

于是,他开始寻求第三种定义相似度的方法。

第三百七一章 最长公共子序列(上)

在杨成的所学中,的确有一种也能用来判断字符串相似度。

那就是,最长公共子序列问题。

假设两个dna串分别是a和b。

如果有第三个串c,它既是a的子序列,也是b的子序列,那就可以称其为a和b的公共子序列。

而c如果是所有满足条件的串中最长的,那就是a和b的最长公共子序列。

可以这样说,找到的c越长,就可以认为两个dna串的相似度越高。

第三百七二章 最长公共子序列(中)

好,既然回顾了相关知识,杨成便准备实现其方法了。

该使用哪一种方法最恰当呢?

杨成首先想到的是暴力搜索方法。

如果用这种方法来求解,那就需要穷举a串的所有子序列,对每个子序列检查它是否也是b的子序列,同时记录找到的最长子序列。

这种方式绝对可行,实现起来也不复杂。

但是暴力方法的时间复杂度却是指数级的。

如果a和b稍微长一点,那就不适用了。

第三百七三章 最长公共子序列(下)

如果观察暴力方法搜索的过程,就会发现一个有趣的现象。

很多子问题被重复求解了。

也就是说,暴力搜索方法具有重叠子问题性质。

这就是它之所以很慢的根源所在。

而实际上,最长公共子序列只有如下数量的不同子问题:

a串的长度乘以b串的长度

(gth*gth)

根据这样的性质,杨成自然而然地想到了一种方法:

动态规划法

利用这种方法可以高效地求解最长公共子序列问题。

第三百七四章 动态规划法(上)

通常所说的动态规划有两种实现方法。

第一种是自顶向下法。

也就是杨成以前求解最短编辑距离时用到的记忆化或者说是备忘录。

使用这种方法会按照递归形式编写求解过程。

然后在过程中使用数组或哈希表保存每个子问题的解。

它会在递归函数的开头检查是否已经缓存了结果。

如果已缓存,直接返回,无需计算,从而节省了时间开销。

否则,就先计算子问题,再缓存。

第三百七五章 动态规划法(下)

而另一种方法自然就是自底向上法了。

那么,这两种方法究竟孰优孰劣呢?

首先,它们是等价的。

两种方法得到的算法具有相同的渐近运行时间。

而仅有的细微差异在于,自顶向下法由于频繁的递归函数调用开销,效率往往会略低一些。

为了求解最长公共子序列问题,动态规划的两种方法都是适用的。

它们都利用了重叠子问题性质,时间复杂度均为:

o(a*b)

也就是a和b两个串长度的乘积。

第三百七六章 苦与甜

没过多久,杨成便用动态规划求解出了两个串的最长公共子序列。

他抬起头,仰望这苍茫的天空。

一时间,风云变幻,气象万千。

老人的身影出现在了远处,他弯着腰,就如同一位最朴实无华的农民。

起早贪黑,披星戴月。

他没空去细想是与非,一切都只是过眼云烟。

在生活中,苦与甜是相对的,如果没有苦,甜也就没有滋味。

如果心中有梦想,即使当下是苦的,因为有期盼,我们也能甘之如饴吧。

第三百七七章 斗罗大陆(上)

回到任务中心,杨成叹息了一声。

“老人的际遇让我心生敬佩”。

“没有前人栽树,用汗水浇灌,哪会有我们如今的幸福生活”。

“他是我们国家的英雄,即使渐渐老去,淡出舞台”。

这时,系统妹子的声音冒了出来。

“嗯,英雄的故事不会被遗忘”。

“成成,下一个关卡,我向你推荐另一个虚拟时空的传奇”。

杨成一听,顿时来了兴致。

“那就是,斗罗大陆,一个属于魂师的世界”。

第三百七八章 斗罗大陆(中)

早在杨成还年少的时候,他就读过这本经典的第一部。

到现在,已经陆陆续续出版了好几部。

“我要穿越的是哪一个时代呢?”

杨成很兴奋又有些好奇。

“第三部龙王传说之后”。

“也就是唐舞麟和古月娜被永冻冰封”。

“人类和魂兽签订互不侵犯协议的和平时期”。

系统耐心地解释道。

听到这里,杨成有一点小小的失落。

他本来还希望着能拳打武魂殿,脚踢日月帝国,单挑深渊圣君的呢!

第三百七九章 斗罗大陆(下)

“成成,这次的任务可有难度呢!”

“你的魂力等级被限制在了20级”。

“也就是魂师”。

杨成顿时觉得有些无趣。

那么低的级别能够干嘛呢?

“你必须通过史莱克学院的考核”。

杨成一下子来了精神。

想想自己,年纪也不小了,二十出头的人。

如果能和少年天才们竞技,考入史莱克外院,那也是了不起的挑战啊。

然而,系统妹子话并没有说完

“成为一名光荣的内院弟子”。

第三百八十章 史莱克纪念馆(上)

位于永恒天空城的史莱克纪念馆。

过往的游客络绎不绝。

一位年轻漂亮的导游妹子拿着个扩音喇叭,给慕名而来的客人们讲解。

“大家请看这边第一尊雕像”。

那是一道修长的身影,蓝色长发如瀑般在身后飘散。

他的眼中有着海之神韵。

明明只是一座雕像,却能让人感到心安。

“这位就是初代史莱克七怪之一,唐门创立者,以一己之力逆转乾坤,破坏武魂殿阴谋的一代海神,唐三!”

第三百八一章 史莱克纪念馆(中)

讲解到这里,导游妹子脸上洋溢着自豪的微笑。

这是每一个史莱克人的骄傲。

接着,她伸出一只纤纤素手,指向另一个方向。

“这第二座雕像,便是建设传灵塔,对抗如日中天的日月帝国,给上古斗罗大陆传承做出巨大贡献的灵冰斗罗,霍雨浩”。

然后,她美眸瞥了瞥第三座雕像,眼中有着一份欣赏,甚至还有着惋惜。

“最后一位,在史莱克学院遭逢大难之时”

“配合海神击溃深渊位面”

“以身相殉,解决魂兽威胁”

“龙皇斗罗唐舞麟”。

第三百八二章 史莱克纪念馆(下)

等到导游妹子讲解完毕,游人们渐渐散去。

她收起扩音喇叭,打算结束一天的工作。

“美女,我想请问一下”。

就在这时,一个戴着黑边框眼镜的年轻人走过来。

“史莱克学院的招生处怎么走?”

导游妹子打量着眼前这小伙,眼中有着好奇与不解。

“您是孩子的家长嘛?”

听到这里,杨成顿时涨红了脸。

哥看起来年纪有那么大嘛?

“不不”。

他支支吾吾着,摆了摆手。

“我想报考史莱克学院呢!”

第三百八三章 史莱克招生处(上)

夕阳西下,整个斗罗大陆被笼罩在一片昏黄中。

史莱克学院的招生处,两名年轻男子端坐在椅子上,显得百无聊赖。

其中一人,虎背熊腰,有万夫莫敌之勇。

他叫原恩毅,乃是史莱克学院外院老师,76级力量型强攻系战魂师。

也是泰坦巨猿家族在学院的后起之秀。

另一人则身材瘦长,他的来历可不简单。

李锋,78级敏攻系战魂师,擅长空间之力。

他的师父是当世的巅峰大能,极限斗罗谢邂。

第三百八四章 史莱克招生处(中)

原恩毅后仰着,把个椅子压得嘎吱响。

“李兄,这届的生源感觉都不咋滴”。

“咋们可得严格把关”。

“可不能让什么阿猫阿狗混进来了”。

李锋点点头,深以为然。

就在两位外院老师无聊的时候,不远处走过来一人。

他踏着夕阳的余晖而来,恰似那闲云野鹤,又如同拉下黑夜帷幕的精灵。

那黑边框眼镜中更是闪现出锋芒。

这与众不同的气场立刻吸引了“评委”们的关注。

第三百八五章 史莱克招生处(下)

只见那青年上前几步,一拱手。

“我特地前来报考史莱克学院”。

“希望得到老师们的指点!”

原恩毅脸上却是有些怪异。

他如何看不出,眼前这人的实际修为。

充其量两环魂师。

放眼全大陆,这资质可以算是平庸无奇了。

要知道,有很多十来岁的少年天才都被淘汰了哩!

于是,他摆了摆手,正色道。

“指点就不必了”。

“你可知道,我史莱克学院数万年来的规矩?”

第三百八六章 史莱克只招怪物

“史莱克只招怪物,不收普通人!”

青年的回答铿锵有力。

“但是”

这时他话锋一转。

“我付出的努力也很多,我也有属于自己的特长”。

“还是希望老师们能给个展现自我的机会”

这青年眼神中有着一份真诚,话语中流露出渴望。

原恩毅犹豫了几秒。

他深知普通魂师修炼的不易,但若是开此先例

“那就先给我们看看你的武魂吧!”

李锋却是做出了决定。

第三百八七章 废武魂

“谢谢老师”。

那青年又是一拱手。

“那我就先召唤武魂了”。

青年闭目,开始凝聚魂力。

就在那一瞬间,方圆几米的时空,发生了轻微的紊乱。

一层层涟漪荡漾开来,一个物品正在成型。

那是一本造型古朴的书籍。

随着书页缓缓地被翻动,时空元素纷纷被吸引,蜂拥而至。

如果你仔细地观察这本书,就会发现上面有端庄的四个大字:

数据结构

“这是?”

一旁的原恩毅瞪大了眼睛。

“废武魂?”

第三百八八章 没有废武魂

李锋却是流露出若有所思的表情。

刚才,他真真切切地感受到了时空的波动,这召唤武魂甚至还引发了元素的潮汐。

尽管那种感觉非常的微弱。

至于是不是废武魂,这根本不重要!

在史莱克人眼中,只有废材的魂师,没有废武魂!

能够修炼到20级,这足以说明,青年付出了很多的努力。

他终于下定了决心。

李锋从椅子上站起来,朗声说道。

“好,我们看到了你的武魂,接下来,考验你的基本功”。

第三百八九章 基本功

作为一名擅长时空之力的好手,李锋太明白基础的重要性了。

万丈高楼平地起,就是这个道理。

他思忖了片刻,提出了自己的考核要求。

“听好了,我需要你开辟出一个存储空间”。

“然后,向我们演示两个项目”。

“其一,将大量的物品挪移进存储空间”。

“第二点,将空间里面的东西一个不漏地挪移出来”。

话说完,李锋坐回到了椅子上。

这项考试看起来很简单,却能够体现出方方面面。

第三百九十章 数组(上)

杨成听完李锋的描述,便开始了具体的分析。

如果只是要快速地存取物品,用一个数组就可以了。

他却想到了一种情况。

假设我要存入一本编号为5314的某本书。

用数组的话,我就要先开辟一个大小为5315的数组。

(这里假设数组下标从0开始)

然后,将编号作为下标,把书存入数组。

这样做的缺点是非常明显的。

我只存入了一本书,而分配给数组的大部分内存空间都将浪费掉!

第三百九一章 数组(下)

甚至,还有一种更糟糕的情况。

如果接下来,又要存入一本编号为10000的书。

已有的数组无法满足需求,必须扩容到10001的大小。

然后,再把新书存入。

但是,这样浪费的空间就更多了!

那么,有没有一种能够高效利用存储空间的技术呢?

杨成很快就想到了。

那就是,散列表或者说是哈希表。

在这种情况下,利用散列表需要的存储空间要比直接用数组少得多。

第三百九二章 简单散列函数(上)

一个散列表的关键,在于使用一个高效的散列函数。

杨成皱着眉头,凝神苦思。

该怎么设计一个简单却有效的散列函数呢?

比如书的编号还是:

“5314”

乍看之下,将编号字符串中每个字符的ascii码值相加似乎是个不错的想法。

这样结果就会是:

53514952

=205

这个得到的值,就是要存入的数组下标。

可以发现,需要开辟的数组大小就少得多了。

从5315减少到206。

但问题也随之而来。

第三百九三章 简单散列函数(中)

还是那个问题,如果接下来,又要存入一本编号为10000的书。

根据这个简单散列函数,计算出它的存储位置是:

4948484848

=241

241大于数组大小206。

越界了,又需要扩容!

杨成陷入了沉思。

这种额外的开销可以尽量地避免嘛?

事实上,可以做一点小小的改进。

那就是,每次对ascii码值求和以后的结果,再对数组的长度取余。

这样,241对206取余。

得到35。

然后,把书存入数组下标35就行了。

第三百九四章 简单散列函数(下)

经过了这样一番改造,这个简单散列函数应该是成型了吧?

然而,新的问题又浮出水面。

根据先前的例子,先后存入了两本书。

一本编号5314。

另一本编号10000。

如果,又要存入一本编号为4315的书,会发生什么事情呢?

通过简单散列函数计算出它的位置。

也是205。

和之前的书映射到了同一个位置!

这下就麻烦了。

该采取什么样的策略来应对呢?

直接覆盖?

太简单粗暴了吧!

第三百九五章 碰撞

在计算机科学中,这种将多个元素映射到同一位置的现象,被称为碰撞。

(collision)

即使是使用一个高效的散列函数,依然存在碰撞的可能。

更何况这样的简单散列?

遇到这样的问题,杨成可是不慌不忙。

处理的方案有很多哩!

像线性探测法、二次探测法、双散列法

那么,在实际开发中,被运用得最多的是哪种方法呢?

杨成开始回顾java源码的相关内容。

第三百九六章 开链法(上)

java集合api提供了好几种散列实现。

其中的hashmap类使用较为广泛。

它是怎样处理碰撞问题的呢?

首先,它的底层数组元素是一个链表的形式。

在发生碰撞的时候,它会区分为两种情况。

一种情况会采取覆盖行为。

另一种则是把新插入的元素作为链表的头部,由数组直接引用。

判断的标准是java特有的语言特性:

equals方法

但这种处理碰撞的思路,却是通用的。

它被称为开链法。

(chaining_method)

第三百九七章 开链法(中)

开链法其实是一种比较简单的冲突解决方法。

所以它的应用很广。

那么,性能怎么样呢?

用开链法在最坏的情况下,性能很糟糕!

假设有n个元素全部都碰撞了,映射到了同一个位置。

那么就会产生出一个长度为n的链表

从而导致,如果要查找某个元素,时间为线性的!

如此一来,那就和直接用链表没差别了

还用什么散列表呢?

但是话说回来,这个锅还不能由开链法来背。

第三百九八章 开链法(下)

要怪也只能怪采用的散列函数太糟糕。

一个好的散列函数应该能够将元素,均匀地分布到数组上面。

而不是频繁地碰撞!

想到这里,杨成看了看自己设计的简单散列函数。

他默默地把它擦除掉了

还是用编程语言自带的散列表吧!

这样性能才会有保证嘛。

于是,杨成new了一个hashmap,用来应付接下来的挑战。

就在杨成陷入思考的这会儿,李锋的声音传来。

“准备好了没?”

第三百九九章 准备物品

“准备好了!”

杨成自信满满地说道。

他话音刚落,眼前一个储物空间悄然成型。

洁白耀眼的光芒从空间内部散发出来。

时空元素星星点点地围绕着,盘旋飞舞。

李锋看到此情此景,心里暗自点头。

在他那敏锐的感知中,这个空间构造得十分稳定。

应该是经过了千锤百炼。

“那就由我来准备物品吧!”

李锋脸上淡然一笑,只见他大手一挥。

半空中一阵强烈的空间波动

一个裂缝凭空出现,扯开一道大口子。

随后,海量的物品倾泻而下,犹如群星坠落。

第四百章 存取物品(上)

眼前的物品很快就堆成了一座小山

它们散发出亮闪闪的金属光泽。

李锋脸上的笑容浓郁了几分。

身为学院内的高级锻造师,他今天把自己所有的锻造材料都拿出来了。

杨成扫视眼前的物品,发现它们上面都刻有一个编号印记。

史莱克对于锻造材料的管控是很严格的!

很多稀有金属都是登记在册。

李锋相信自己的眼光。

他朗声说道:

“挑战者,请你将编号为11785的玄铁纳入储物空间”。

玄铁,又被称为铁母,每一个铁矿脉中最先产生的矿石。

第四百零一章 存取物品(中)

杨成手轻轻地一挥动。

那储物空间内便生出一股牵引力。

眼前一块通体黝黑的玄铁被拉扯着,挪移数步。

“嗖!”

它一下子就没入了空间。

杨成还没来得及歇口气,李锋又发话了。

“请将编号为8791的火铜存入”。

天然火铜常于沸腾的岩浆中沉浮,故其炽炎之气旺盛。

很快,一块暗红色的金属被成功纳入。

“请将编号为6346的精金存入”。

金常伴汞而生,历经百年而融合,是为精金!

“请将编号为4397的白金存入”。

白金有中正浩然平和之气,其上隐约有神光飘溢。

第四百零二章 存取物品(下)

“嗖!”

“嗖!”

又是两个成功存入的讯号。

没过多久,眼前的锻造材料便少了很多。

李锋伫立在原地,眼中闪过一丝疑惑。

在刚才的数十次空间感知中,他发现一个情况。

那就是,这物品的存入过程没有丝毫的降速!

用他的话说,就是一个词儿:

高效

这挑战者是怎么做到这一点的呢?

他显然不知道,一个高效的散列表可以确保,插入操作在最坏情况下的运行时间为:

o(1)

第四百零三章 基础扎实

“好”。

李锋示意杨成。

“请将编号为2108的星辰沙取出”。

从遥远的群星降世的星辰沙,拥有无与伦比的重塑之力。

“请将编号为974的太阳石取出”。

太阳之力融合而成的灵石,蕴含了化形与生长之力。

很快,眼前的各种矿石又堆成了一座小山。

李锋眼中的疑惑更深了。

这空间的存取操作居然都是一样的高效!

对于他这样的高手而言,做到这点自然是轻而易举。

但对于一个只有20级魂力的魂师来说,这基础真的很扎实!

第四百零四章 稍作休整

杨成大口地喘着粗气,汗水从脸颊两侧滴滴滑落。

刚才的上百次空间存取操作,消耗了他大量的魂力与精神力。

不过,他有些暗自庆幸。

要是使用简单散列函数,估计就扑街了。

嘿嘿,哥还真是英明!

就在这时,李锋的声音传来。

“挑战者,你的基本功考核通过”。

“接下来,是实战考核”。

“请你稍作休整”。

杨成闻言,就如同个泄了气儿的皮球般,一下子瘫倒在地。

第四百零五章 实战考核(上)

十分钟后

杨成勉强支起身子,听候指示。

李锋从席位上走过来。

只见他手轻轻地挥动了一下。

“呼呼”

凌冽的罡风袭来,神光若隐若现。

眼前竟是出现了个一人高的传送门。

那五彩斑斓的另一端,究竟是怎样的世界呢?

“请进!”

李锋示意他。

杨成内心却是有些忐忑。

不会链接到深渊位面吧?

不要吓哥啊!

他向前几步,整个身体没入到那光芒中。

就如同一枚鹅卵石在湖中央荡起轻微的涟漪。

然后就连个泡都没了影

第四百零六章 实战考核(中)

炽热的气息无孔不入。

狂暴的火元素在这里变得极为浓郁,它们肆虐着,焚尽苍穹。

出现在杨成眼前的,是一条长达百米的烈焰之路。

这火非凡间火,乃是地心之火。

“嚯”

杨成不禁倒吸一口凉气。

然后,他注意到了另外一个细节。

道路两侧的石壁上,通通都遍布着寒光闪烁的尖刀利刃。

稍有不慎,便会遗憾终生

这可真是上刀山下火海啊!

还让不让人活哪?

第四百零七章 实战考核(下)

李锋的声音从背后传来。

“挑战者,你的任务就是在最短的时间通过这条道路”。

杨成一听这话,顿时遍体生寒。

哥待会只怕是一个照面就饮恨当场了!

“可以放心,如果出现生命危险,我会及时传送你出去的”。

李锋鼓励他。

杨成深吸一口气,努力地平复内心的波动。

他默默地打开编辑器面板。

看来,只能使出这招了!

一种基础的数据结构在他脑海中开始了构想。

那就是栈。

(stack)

第四百零八章 栈

杨成首先回顾了一下栈的一些基本概念。

栈其实是由普通线性表改造而成的。

对于线性表而言,它可以进行任意存取操作。

而栈则不然。

它只能在固定的一端进行插入和删除操作。

也就是压栈与出栈操作。

栈相对于普通线性表的功能较弱一些。

但在一些特殊的场合下,使用栈会更加有利。

比方说,计算后缀表达式或者说是逆波兰表达式。

reverse_polish_notation

栈就是一种理想的数据结构。

再比如说,图的深度优先遍历,就会用到栈来管理遍历。

第四百零九章 链栈和顺序栈

好,既然回顾了相关的概念,那么就进行下一步吧!

杨成面临一个方案选择问题。

对于栈这种数据结构,有两种实现方式。

那就是链栈和顺序栈。

链栈,顾名思义,链式存储结构实现的栈。

顺序栈自然就是顺序存储结构的栈咯。

这两者,究竟哪一个效率更高,更能够胜任开发的需求呢?

杨成挠了挠头,陷入“远古记忆”中。

他决定,先对它们的时间效率进行分析。

第四百一十章 时间效率分析(上)

对于链栈和顺序栈,从时间效率的角度来讲,很难一较高下。

事实上,它们的压栈与出栈操作,都可以确保为常量级的时间复杂度。

值得一提的是,顺序栈可能遇到的一种情况。

那就是,顺序栈满了,就必须扩容。

否则,就无法再添加元素。

如果要扩容,会不会有额外的性能开销?

杨成想知道,这个扩容操作的时间复杂度是多少?

它会不会对压栈方法造成影响?

带着这些疑问,杨成又开始了进一步的思考。

第四百一一章 时间效率分析(下)

顺序栈的底层数组,如果要扩容,该怎么做呢?

通常是创建一个更大的新数组,并把原数组的内容复制到新数组中。

这个操作含有一个循环。

我们可能会认为其复杂度是:

o(n)

但是,相对于压栈方法调用的次数来说。

扩容方法的使用频率真的很少诶!

因此,可以在所有的压栈方法中分摊一下扩容的开销。

这么一算起来,扩容所造成的影响就很小很小了。

第四百一二章 空间效率分析(上)

从时间效率的角度来看,使用链栈似乎还要略胜一筹。

因为它没有扩容的额外开销。

那么,如果从空间效率来分析,又会有怎样的结论呢?

链表实现的栈,对于里面的每一个节点,都会存储额外的指针,用来引用其它节点。

这样就需要更多空间。

为每个节点使用的空间更多嘛!

是不是这样就可以认定,顺序栈在空间方面的优势呢?

杨成眉头一皱,发现事情并不简单。

第四百一三章 空间效率分析(下)

诚然,链栈为每个节点使用的空间更多。

但顺序栈也有软肋。

在初始化与扩容的时候,顺序栈的底层数组会分配比它所需更多的空间。

而只有在需要的时候,链栈才会分配存储空间!

所以,在空间的合理利用上,顺序栈似乎还不如链栈。

想到这里,杨成决定为自己的方案选型画上一个句号。

两者都是可以的嘛!

接下来,他决定进行下一步。

那就是,对潜在的异常情况进行考虑。

第四百一四章 上溢(上)

如果把一个满了的栈,继续进行压栈操作,会发生什么情况?

很有可能出现“上溢”。

(overflow)

对于链栈,很难出现上溢的情况。

因为它只有硬件空间大小的理论限制,很难“杯满则溢”。

但对于顺序栈,似乎就是家常便饭了。

你如果初始化容量设置小了一点,很容易就满了。

所以,杨成面临栈设计的一个关键问题:

当把新元素加入到一个满了的栈中时,应该干些啥子呢?

第四百一五章 上溢(中)

其实杨成在这里有很多种选择。

对于java这样支持异常机制的语言,可以抛出一个异常嘛!

如果这种编程语言不支持异常呢?

那就返回一个状态标识符呗!

比方说布尔类型的true和false。

用它们来表示添加元素操作成功与否。

这两种方案,对于栈的使用者有要求。

他必须清醒地认识到,栈是有可能满的。

如果有需要,就得手动扩展栈的容量。

wtf?!

杨成表示无法忍受。

第四百一六章 上溢(下)

这些解决方法的好处是,给予用户更多的控制权。

但并不能让用户爽!

对于栈的容量这样的底层实现细节,为啥要让用户来操心呢?

因此,对于杨成更有吸引力的是第三种选择。

那就是,每次压栈的时候,自动检测并且扩展栈的容量。

这样,栈就不会出现上溢的情况咯!

事实上,java的好几种集合实现类,比如说:

arraylist

它就是采用的自动扩容策略。

在它的源代码,添加元素方法中,你就能发现:

ensurecapacity

这样方法调用的影子。

第四百一七章 下溢

“上溢”这种异常情况总算是考虑好了。

杨成又想到了另一种常见的异常情况。

如果一个栈已经是空的了,我再试图对它执行出栈操作,会发生怎样的现象?

这通常会导致“下溢”。

(underflow)

对于链栈和顺序栈,都有可能出现“下溢”。

因此,杨成决定实现一个通用的自定义异常类:

emptystackexception

当执行出栈方法时,如果栈为空,就抛出一个这样的异常。

好了,方案选型和异常情况都考虑好咯。

万事俱备只欠东风!

第四百一八章 编程语言中的栈

在“东风快递”来之前,杨成打算先参考一下,编程语言类库中的栈。

他首先想起的是,java中的stack类。

然而,这东东并不是很靠谱。

它是vector类的子类。

而vector类似于动态数组。

这也就意味着,它继承了大量会与栈设定相互冲突的方法。

一些看起来奇奇怪怪的东西。

这会让人有所误解。

伙计,你确定这真的是一个栈?

实际上,java已经不再推荐使用stack类了。

它和父类vector都是古董级的。

第四百一九章 编写栈

没有参考对象,杨成就只好捋起袖子自己干了。

好在栈的实现并不复杂。

他很快就捣鼓出了一个半成品。

然后拿过去一测试。

嘿!一下子就通过了!

哥这一波操作真是猛如虎!

杨成在心里暗暗佩服起自己来了。

不过,他还是有些忐忑。

希望实际用起来不会太糟糕。

要不然,就成了烤乳猪

杨成在这里心潮澎湃之际,李锋的声音传来。

“挑战者,ready?”

“可以开始了”。

第四百二十章 创建栈

杨成听到这声音,面色一凝。

紧接着,只见他双手在虚拟键盘上噼里啪啦地一番操作。

“啪!”

一键回车宣告终结。

就在那一瞬,这方大地传来一阵轻微的震颤。

“玩家创建栈,开始分配初始化存储空间”

一个宏大的系统音响起。

天地间的时空元素如同过江之鲫,在半空中凝聚成型。

没过多久,一重异象浮现。

那是一门战场利器——迫击炮。

看到此情此景,杨成脸上却是流露出一抹悲色。

第四百二一章 悲壮

杨成嘴唇一蠕动,心中如同翻江倒海。

他想起了春秋时期,一些有名的侠客。

聂政刺韩槐,专诸刺王僚,要离刺庆忌

孔曰成仁,孟曰取义!

如今,要拿我这程序猿祭祀天地

哈哈哈!

杨成慨然一笑,感觉自己这一刻浑身充满了莫名的勇气。

只见他大手一挥。

“系统,听我指令,执行压栈操作!”

他眼中闪过一丝冷静的光芒。

成败在此一举啊!

第四百二二章 压栈

杨成话音刚落,那凝聚成形的迫击炮便发生了变化。

只见它那硕大的炮口罡风席卷,竟是产生了一股强大的吸力!

那力量拉扯着杨成,然后让他身体腾空。

杨成在空中轻飘飘地摇晃着,好似那翩翩起舞的蒲公英。

他的内心却是有一阵强烈的眩晕感袭来。

好想呕吐啊!

好在这样的情况并没有持续多久

“噗通!”

杨成一下子被塞进了炮口,一屁股坐到了底儿。

“唉呀,好痛啊!”

第四百二三章 出栈(上)

杨成在炮管里蜷缩成一团。

他思忖了片刻,终于下定决心。

“系统,听我指令,执行出栈操作!”

然后,他感觉屁股附近传来一股温热。

wtf?

来自底部的温度还在持续地上升。

以至于

他感觉自己就像热锅上的一块牛排。

估摸着又过了五秒钟

“嗷!”

杨成一声鬼哭狼嚎,飞也似地弹起来。

实在是太烫了!

再这样下去,自己就得被烤熟了。

“系统,为什么还不发射?!”

杨成恼火地问道。

第四百二四章 出栈(中)

“系统正在进行预热,请稍候”

“人间大炮,一级准备”

“人间大炮,二级准备”

“人间大炮,三级准备”

“发射!”

杨成只感觉脚下传来一股强劲无比的推力。

他整个身体犹如离弦之箭,窜出了炮管!

耳畔是呼呼的风声,杨成双眼模糊,甚至看不清眼前的一切。

下方的刀山火海在那一瞬就成为了过去式

然后,杨成直愣愣地朝地面下坠,就要完成抛物线的最终阶段。

第四百二五章 出栈(下)

按照常理,杨成这样极速地坠落,不死也得大残。

然而,眼前的地面很快发生了让人咋舌的一幕。

一张巨大的气垫床凭空出现!

杨成精准无误地一头扎到了一个软绵绵的怀抱。

噗!

一声闷响过后。

杨成没有了声息

原来,他被震得昏死了过去。

好在一条小命还是保住了,也算不幸中的万幸。

昏迷中的杨成所不知道的是,他刚才这个出栈操作刷新了史莱克学院的考核记录。

他是当之无愧的飞人!

第四百二六章 录取(上)

伤痕累累的杨成被从空间内挪移了出来。

李锋和原恩毅脸上满是诧异。

“没想到这家伙居然这么拼命”

原恩毅大大咧咧地说道。

“居然能想到利用空气炮来加速移动”。

“这特么也算是个怪物了!”

李锋看着眼前这青年,心里面也是暗自佩服。

刚才的气垫床是他及时出手的结果。

要不然,杨成就得成了大肉饼

从这位挑战者身上,他看到了侠客般的勇气。

“李兄,咋们要不要向学院汇报一下?”

“他这种情况真是个特例啊!”

第四百二七章 录取(下)

就在李锋和原恩毅犹豫不决的时候。

天空传来一个浩大的声音,犹如舌绽春雷。

那声音无悲无喜,沧桑而有力。

“经由海神阁决议,挑战者打破我史莱克考核记录,智勇双全,特批准入外院学习”。

一道神念扫过昏迷中的杨成。

与此同时,一团绿色的生命能量从不远处漂浮过来。

它很快进入伤者的身躯,开始滋润与修复。

杨成身上大大小小的伤痕逐渐地消失不见了。

他那苍白的脸上也多了一抹血色。

第四百二八章 想进内院(上)

又过了一会儿

杨成迷迷糊糊地睁开眼睛,一屁股坐起来。

“发生啥事了?”

他只记得自己充当人肉炮弹的经历。

首先映入眼帘的是两位笑眯眯的史莱克外院老师。

“挑战者,恭喜你”。

李锋上前一步,一双大手将杨成有力地拉起。

“你被破格录取了!”

“欢迎加入史莱克!”

然而,预想中的欣喜神色并没有从杨成脸上浮现。

他迟疑了几秒钟。

似乎有难言之隐?

“那个”

“其实”

“我想进的是内院”

第四百二九章 想进内院(中)

气氛在这一刻骤然凝固。

李锋转过身子,一言不发,他脸上却是掩饰不住的失望。

没想到自己看好的这人,居然如此狂妄。

他能被外院录取,已经是学院数万年来开的首例。

这么不知道珍惜机会么?

原恩毅则像一座即将爆发的火山,他捏紧了拳头。

杨成知道自己的话让两位外院老师伤心了。

但没办法啊!

此行的任务就是成为一名内院弟子。

感受到两位魂圣强者恐怖的威压,杨成只好硬着头皮说道。

“没错,我想进内院”。

第四百三十章 想进内院(下)

杨成这话无异于火上浇油。

那原恩毅顿时暴怒,犹如火山喷发开来。

“我要教训你这不知天高地厚的小子!”

只见他右手略微蓄势,然后一记重拳挥出。

泰坦巨猿家族的绝学,泰坦神拳!

这一击势大力沉,更有扭曲空间之力。

即使是被余波扫到,杨成下半辈子也得在床铺上度过了。

感受到那霸道无比的拳风,杨成绝望地闭上了眼睛。

真的是要在这里结束了么?

他苦涩地一笑。

第四百三一章 何方神圣

眼看那拳风即将把杨成轰杀成渣。

杨成身前的空间却发生了一阵微不可察的扭曲。

这种空间扭曲竟是在导引着泰坦神拳的力量。

嗖!

那强横无比的拳风一下子被牵引到了异次元空间。

一丝一毫也没有落到杨成身上!

原恩毅看到此情此景,不由得大惊失色。

自己这实打实的一记重拳,就这么给人化解了?

要知道,原恩毅这拳法虽然只是小有所成,却也能威胁到魂斗罗级别的强者。

这出手的究竟是何方神圣?

第四百三二章 谢邂(上)

“原恩毅,不得鲁莽”。

虚空中走出一个瘦长的身影。

这是一位中年男子,他的出现没有引发任何的空间波动。

就如同普通人,在闲庭信步。

他的双眼却是浩瀚而深邃,仿佛里面包容着宇宙和万物。

他的每一个细微动作,自然,至简,与那空间法则暗合。

端的是古怪至极!

看到眼前这人,李锋第一时间躬身。

“师尊”。

原恩毅愣了半晌,也是反应过来。

“冕下”。

原来,这中年人就是李锋的师傅,海神阁阁老,谢邂。

第四百三三章 谢邂(中)

这谢邂成名于数十年前,联邦大军与深渊位面一战。

那时候,他还是超级斗罗,如今却已经晋升极限。

尤其是近几年,他境界越发稳定,实力更是深不可测,与那传说中的神级恐怕也只有一线之隔。

“挑战者”。

谢邂打量着眼前这位后生晚辈。

“我可以考虑让你进内院”。

他此言一出,原恩毅和李锋都是睁大了眼睛,满脸的诧异。

这等层次的巅峰强者,自然是一言九鼎。

“不过,你得先通过我的考验”。

第四百三四章 谢邂(下)

杨成眉头紧锁,形势不容乐观哪。

一位极限斗罗的考核,想必是难之又难。

就听见那谢邂不温不火地发话了。

“我不使用任何的魂技”。

“如果你能困住我一秒钟”。

“就让你进内院”。

“否则”

“就请回吧”。

听到师傅这番话,李锋表情却是有些怪异。

自己在全力施展的情况下,能困住谢邂一秒钟么?

答案是否定的。

即使是封号斗罗,乃至于超级斗罗,又有几人能做到?

这是在劝那挑战者,让他知难而退!

第四百三五章 抉择(上)

众人把目光聚焦到了杨成身上,看他如何抉择。

杨成头微微低垂着,陷入思索中。

他的思绪回到了几年前,刚进大学的那场迎新典礼。

一位头发花白的老教授作为主讲嘉宾,谈及自己的体会。

“在你们学习的旅程上,一定没有平坦的道路”

“你们会遇到很多难题”

“有些人会选择绕过,去选择那些短期、平稳、见效快的项目”

“我的看法是,一定要勇于尝试”

“这样,你就会有不一样的收获”

老教授的话在杨成脑海中萦绕。

第四百三六章 抉择(下)

谢邂看那眼前的年轻人逐渐舒展了眉头。

“看来,你已经做出了决定?”

杨成抬起头,眼中有着一份坚定与勇气。

“冕下,请允许我多花一些时间来准备”。

听到这话,李锋和原恩毅都是暗自点头。

能得到一位极限斗罗的指点,这就是一笔宝贵的财富。

“可”。

谢邂淡淡地说了一句,随即闭目养神,进入那天人合一的境界中去了。

杨成努力地平复内心的波动,他深吸一口气,盘膝而坐。

第四百三七章 二叉查找树(上)

在我的所学中,有哪种技术能解决这种问题呢?

杨成沉下心来问自己。

要不要尝试一下二叉查找树?

(binary_search_tree)

这是一种带有附加属性的二叉树。

它有一项特殊的性质:

对于树中的每一个节点,它的左子节点小于父节点,而右子节点大于父节点。

在很多的面试题中,都可以看到二叉查找树的身影。

why?

因为它实现较为简单,是一种经典的数据结构。

甚至有大佬吐槽,在面试中考察bst是很low的行为。

第四百三八章 二叉查找树(中)

大佬们是怎样吐槽的,杨成并不清楚。

但他的确很快就写好了一个添加元素的方法。

杨成试着加了几十个元素进去。

然后,他产生了一个疑问。

我该怎么验证正确性呢?

或者说,我怎么知道这构建的是一棵二叉查找树呢?

难不成,还得肉眼去分辨?

一个一个节点来观察?

这方法也太愚笨了吧!

杨成左思右想,想找出一个稳妥的方法来。

二叉查找树还有一些怎样的性质呢?

第四百三九章 二叉查找树(下)

杨成很快就想到了一条性质:

对于二叉查找树,如果按照中序遍历,就可以得到由小到大的有序序列。

这条结论,它反过来也是成立的!

如果一棵二叉树,它按照中序遍历,可以得到由小到大的有序序列,那么它就是一棵二叉查找树。

对,就是这么来验证啦!

杨成想到这里,马上开始编写校验方法。

没过多久,测试就通过了。

接下来,他准备了大量的数据,打算批量地插入。

第四百四十章 批量插入

杨成准备了编号大小从0到100万的节点。

然后,他使用for循环,依次插入二叉查找树。

只见那编辑器面板荧光闪烁,浮现出一行行小字。

系统正在对数据量大小进行分析

需要的计算时间过长,是否继续?

看到这里,杨成顿时瞪直了眼睛。

才100万个节点啊!

这应该不是很大的数据量吧?

莫非我对二叉查找树有什么误解?

杨成手托着下巴,陷入了深深的迷惘。

第四百四一章 效率分析

之所以会发生这样的现象,关键在于,插入的节点列表是有序的!

杨成使用了一个循环,由小到大地插入。

这就导致,得到的二叉查找树是一个链表。

里面的每一个节点都只有右子节点。

新节点比之前的所有节点都要大嘛!

每一轮的插入操作,都需要把新节点插入到树的最右端。

这是个o(n)的时间复杂度。

然后呢,又有n个节点待插入。

所以,杨成这种批量插入的整体时间复杂度是:

o(n*n)

而n是100万的大小。

这就是为什么系统会判断,需要的计算时间过长。

确实是个天文数字啊!

第四百四二章 平衡二叉树(上)

等杨成想清了这前因后果,他一拍大腿。

“希特!”

我这棵二叉查找树为什么插入元素会如此低效?

因为树是不平衡的,甚至蜕化成了一个链表!

而事实上,它的效率会比链表还低,因为每个节点还附带了额外的开销。

所以要提高性能的话,维护树的平衡至关重要!

杨成开始在脑海中回溯以前教材上的内容。

什么是平衡二叉树?

它有一些怎样的性质呢?

第四百四三章 平衡二叉树(中)

通常所指的平衡,是高度平衡。

(height_balanced)

对于高度平衡的二叉树,它的每一个节点,左右子树的高度差的绝对值,不会超过1。

平衡二叉树的每一个节点,都好比是一个天平。

左右两边的砝码(高度),相差无几,维系着大致的平衡。

这种高度平衡,对于树的性能影响是巨大的!

如果一棵含有n个节点的二叉查找树是完全平衡的,那么它的查找效率最坏情况为:

o(logn)

第四百四四章 平衡二叉树(下)

平衡二叉树的实现方法有很多种。

比方说avl树。

但是杨成所希望的方案,是能够充分地利用已有的代码。

他之前已经写好了一个二叉查找树的插入元素方法。

那么有没有一种方案,能在已有的代码上面做修改呢?

答案是有的!

早在上个世纪70年代,为了改变二叉查找树存在的不足,计算机先哲们便提出了另一种改进后的二叉查找树。

那就是,红黑树。

第四百四五章 红黑树(上)

红黑树是一个更为高效的二叉查找树。

它通常被用来实现关联数组。

一个典型的例子,在java的集合类中,有一个类它的底层就是一棵红黑树的实现。

(treemap)

如果打开它的源码,观察它的put方法具体实现。

你就会发现一个有趣的现象:

这个put方法的插入处理非常类似于杨成之前写的添加元素方法!

不过,还是有一些差别的。

那么,红黑树有哪些独到之处呢?

第四百四六章 红黑树(中)

红黑树,顾名思义,拥有红色、黑色两种类型节点的树。

这就是它与众不同的地方其一。

然后呢,红黑树并不是真正意义上的平衡二叉树!

它并不符合“高度平衡”的定义。

那么,有人不禁要问了,红黑树怎么做到如此高效的呢?

不平衡的树,难道还能很高性能?

想得到答案,还是得翻翻源码。

在put方法那一段类似二叉查找树插入代码的后面,有一个方法调用:

fixafterinsertion

这个调用是关键。

第四百四七章 红黑树(下)

原来,在这个fix方法中,会对红黑树进行修复。

通过颜色调换与树的旋转,来保证它是“大致平衡”的。

也就是说,红黑树无法做到完全平衡,但它的高度也不会无限地增高。

即使是在最坏的情况下,红黑树也不会蜕变成一条链表~

这就解决了普通二叉查找树的痛处。

想到这里,杨成默默地擦除掉了已有的代码。

他new了一个treeset。

然后呢,他又往里面塞了一百万个节点。

第四百四八章 集合与映射(上)

你说这杨成为何创建的是treeset?

它和treemap又有什么关联呢?

如果你参阅这个集合的源代码,就会发现一个让人惊讶的事实:

treeset的底层使用的存储容器就是treemap!

然后呢,如果你查看它的方法实现。

大部分方法居然都是直接调用treemap的方法来实现的!

也就是说,它们的底层都是红黑二叉查找树!

这样的设计,在java中是独此一例吗?

还是说,有其它类似的例子呢?

第四百四九章 集合与映射(下)

杨成之前使用过的hashmap其实也是这样的!

hashset的绝大部分方法都是通过调用hashmap的方法来实现的。

因此,这两者在实现本质上是相同的。

都是散列表!

在java这样的高级语言中,提供了大量的基础类库,对数据结构与算法进行封装。

所以杨成才会直接new。

多么爽歪歪!

当然,弄懂底层的原理也是他孜孜以求的目标。

不过,要手打一棵红黑树出来,这显然超出了他的能力范围~

第四百五十章 红黑树空间

话说这杨成创建了大小为一百万的红黑树。

他的身前浮现出一个光门,姹紫的闪电环绕其中。

澎湃的气息不断地溢出,仿佛里面蛰伏着一头洪荒巨兽。

李锋和原恩毅目瞪口呆。

这真是一个二环魂师所能制造的空间么?

这挑战者,他是不是凶兽伪装成人的?

就在这时,谢邂睁开了眼睛。

他的眼中,有着一道光影,那明与暗彼此交替,流转不息。

“不错的设计”。

谢邂罕见地夸奖了一句。

第四百五一章 谢邂的实力(上)

“冕下,我准备好了”。

杨成站起身子,拍了拍裤腿上的尘土。

这谢邂依旧波澜不惊。

他一步一步走向光门,就好比回到自家的庭院一般。

那空间的气息与之相遇,竟然退避三分。

下一刻,谢邂的身影没入其中,没有激起半点涟漪。

李锋看着自己的师傅,心中一时间感慨万千。

当年与深渊位面一战,战火铸就了他钢铁般的意志。

这是处在和平年代的自己难以学会的。

第四百五二章 谢邂的实力(中)

漆黑一片的迷宫中,四周静寂无声。

一种尘封的气息弥漫着,似乎千万年来都未曾有人造访。

时间缓缓流逝

直到空间中浮现出第一抹光亮。

那是一道神识!

它广博浩瀚,眨眼间便向四面八方延伸开来。

谢邂站在一个迷宫房间中,若有所思。

就在刚才不到一毫秒的时间,他的神念扫过了几百个迷宫格子。

但这空间无穷无尽

谢邂于是闭上双眼,细细地体悟这方天地的空间法则。

第四百五三章 谢邂的实力(下)

不多时,谢邂就发现了一个规律:

每一个迷宫格子都有编号。

而根据他的神念推演,出口就在编号如下的房间:

“89757”

事不宜迟!

谢邂收敛了所有的神识,开始了地毯式搜索。

这极限斗罗的实力着实恐怖。

刹那间,谢邂就游历了上千个节点!

这还是在不使用任何魂技的情况下。

一秒钟过去了

一个狭小的房间里,谢邂站定,他面色微变,气息显得有些紊乱。

没想到,这迷宫竟然如此高深莫测!

第四百五四章 查找的奥秘

谢邂错就错在,他执行的是地毯式搜索。

这种毫无章法的举动对于这种数量级的问题,自然是难以奏效。

红黑树本质上还是二叉查找树。

所以从入口(根节点)开始查找,可以按照bst的性质来进行。

如果出口编号(这里是89757)小于当前房间编号,那就进入左子节点,继续进行查找。

因为bst任意节点,它的左子节点都比父节点要小,可能是目标节点。

否则,就进入右子节点呗。

按照这种查找过程,谢邂最多只需要几十次判断!

这是一种o(logn)操作。

第四百五五章 极限斗罗的愤怒

谢邂的面色阴沉得仿佛能下雨。

刚才又过去的十几息时间,他耗费了大量的神念,却依旧推算不出个所以然来。

这位极限斗罗渐渐丧失了耐心

“没想到这小子能创建出这等层次的空间”。

谢邂半眯着眼睛,自言自语道。

“有意思”。

“老夫有多少年没被这样困住过了?”

“要是传出去,颜面何存哪!”

他深吸一口气,似乎下定了决心。

须臾间,谢邂的手心绽放出一团萤萤之光。

这一刻,周围的空间竟是不安分地颤抖起来。

第四百五六章 光龙神匕

如果有人仔细观察那光亮,便会发现,核心竟然是一枚小小的匕首。

它长约三寸,乍看之下,似乎平凡无奇。

此物名叫光龙匕,乃是谢邂的武魂所化。

随着谢邂的境界踏入准神,它也有了一个更好听的名字。

光龙神匕!

“哈哈哈哈”

谢邂轻抚胡须,一时间豪气冲天。

“老伙计,有多少年没有使用过你了?”

马放南山,刀枪入库,英雄也会迟暮。

“我们走!”

谢邂把那光龙神匕往虚空中轻轻一划

第四百五七章 破碎虚空

“咔嚓”。

玻璃破碎的声音响起。

整个红黑树空间在这一刻一分为二。

位面甚至开始了崩塌

再过那一时三刻,它将迎来更深层次的黑暗。

时空乱流!

谢邂站在一堆断壁残垣之中,他有些感慨。

“后浪推前浪乃是亘古不变的道理”。

“世道必进,后胜于今哪”。

大地这时传来一阵强烈的震颤,留给谢邂的时间不多了。

他端详着这个困住自己的小世界。

“大道无穷无尽矣”。

“即便是成神了,了解的东西不也只是沧海一粟么?”

第四百五八章 等候的众人

话说这李锋和原恩毅在光门外足足等候了一分钟。

原恩毅摸了摸自己圆滚滚的大肚子。

“李兄,冕下他老人家”

李锋脸上也浮现出七八个问号。

按照常理,再高深的空间规则也应该困不住师尊的啊!

除非,布置这一切的是真正的神明。

想到这里,李锋偷偷地瞟了瞟始作俑者。

那杨成一脸人畜无害的表情,也不知道在想什么

这小子,有古怪!

李锋不禁倒吸一口凉气,越发觉得这人恐怖如斯。

第四百五九章 位面崩塌

就在李锋陷入胡思乱想的时候,光门那边却发生了异变。

那里面的空间板块竟是不安分地颤抖起来。

就如同一头受伤的巨兽!

这是?

李锋面色大变。

位面即将崩塌的标志!

眼见那光门正在以肉眼可辨的速度缩小

李锋心里面焦急万分。

师傅,您为何还不出来啊?

他知道,一旦这光门彻底地闭合,谢邂绝对是有死无生。

想到这里,他忍不住上前几步,就要进去救人。

原恩毅伸出一条粗壮有力的胳膊,大手死死拽住李锋的肩膀。

“李兄,不要干傻事啊!”

第四百六十章 诀别

“你放开我!”

李锋眼中有着晶莹的东西在打着转转。

这谢邂对他视同己出。

在他心里面,早已把谢邂当作父亲一般对待。

那光门很快缩小到不足一米

看到这一幕的李锋心都快碎了。

他感觉自己即将失去世间最宝贵的东西。

原恩毅也是满脸苦涩,他只能拖住战友,希望他能够保持冷静。

气氛在这一刻骤然凝固

而光门犹如狂风中明灭闪烁的烛光,随时可能化作一缕青烟。

谁又能想到,一场考核竟能演变成生与死的诀别呢。

第四百六一章 谢邂遁出

就在所有人都以为尘埃落定的时候。

“嗖嗖!”

从光门那狭小的缝隙中钻出来一枚小小的匕首。

光龙神匕!

随即,一道身影虚晃了一下,凝结成实体。

“锋儿,男儿有泪不轻弹!”

谢邂正色看着自己的爱徒,神色又缓和了几分。

“你还需要多磨练心性”。

李锋难以置信地睁大了眼睛。

他赶紧拭去眼角的泪珠,用力地点了点头。

谢邂又转过头,看着杨成,这个小了自己几十岁的年轻人。

这一刻,他眼中竟是流露出复杂的情绪来。

第四百六二章 加试一场

“挑战者,你的确很有天赋”。

这话从一位极限斗罗的口中说出,显然并不是那么容易。

“老夫一言既出,那就绝对会兑现承诺!”

李锋和原恩毅一听,却是有些无奈。

实际上呢,谢邂是被这个后生晚辈赤果果地打脸了~

说好的困住一秒钟,结果成了一分钟

“不过”

就听见这谢邂话锋一转。

“身为海神阁阁老,我有权利要求加试一场”。

“不知道小友你愿不愿意接受呢?”

第四百六三章 时空回溯(上)

“前辈请指教”。

杨成想都没想,就是一拱手。

“嗯”。

谢邂点点头。

“之前的考核,我们看到了你的基本功、实战能力以及对空间的运用”。

“都有很不错的表现”。

“经由我与海神阁阁主神念协商,决定新的考试内容为:”

“时空回溯”。

听到这里,李锋一时间瞠目咋舌。

有没有搞错?

考这样高深的内容!

这是连自己这个巅峰魂圣都接触不到的知识技能哪!

第四百六四章 时空回溯(中)

这说明,海神阁对这位挑战者的重视程度,超出了想象!

只见那谢邂,伸出食指,对准了身前的一块空地。

一道耀眼的白光过后

空地上出现了一堆大大小小的书籍,叠放得井然有序。

谢邂轻抚胡须,给众人解释道。

“这是我从学院户籍科调阅过来的”。

“上面有着永恒天空城所有人的个人信息”。

“当然了”

“这部分资料并不会涉及到敏感、机密的内容”。

“只会包含姓名、年龄、性别这样的”

第四百 六五章 时空回溯(下)

“挑战者”。

谢邂直视杨成的双眼。

“现在你有一个小时的时间,可以翻阅这些资料”。

“一个小时过后”

“我将给出很多个姓名的前缀部分,你需要立刻判断出,永恒天空城中有没有这样的人员”。

“比方说”。

“原恩”。

“毋庸置疑,这是我们史莱克泰坦巨猿家族的姓氏”。

听到这里,原恩毅会心地一笑,露出一口洁白的牙齿。

原来,考试就是从时空中回溯自己曾经看到的内容。



免责:该文章采集于网络,相关权利归相关人所有!!!本站不承担任何责任!!
更多文章: 1024社区 xp1024.com