木有粗面

Stay Hungry, Stay Foolish


  • 首页

  • 关于

  • 标签

  • 分类

  • 归档

我的大学时代(三):

发表于 2020-06-06
| 字数统计: 28 | 阅读时长 ≈ 1

我的经历确实非常丰富

逃离

初入科研

##

放弃科研

漏洞

教务系统

邮箱

我的大学时代(二):武大吃饭指南

发表于 2020-06-06
| 字数统计: 3.4k | 阅读时长 ≈ 11

写了上一篇之后看到留言突然想起来鸽了很久的吃饭指南,之前准备每一个地方写一篇的,但是真正开始写的时候发现写不了那么多,所以就一直鸽到现在。

当然,写还是要写的,要不然对不起这几年在群光广场创意城未来城汉街万达东湖新村梅园CBD花的钱对不对。

五、武大吃饭指南

在大学四年几乎把学校周围能去的餐馆都去了一遍,偶尔还会穿过长江去城市的另一边吃饭。虽然也经常去一些大的连锁比如海底捞、南京大牌档之类的,但是并没有写在这里。并不是因为这些不好吃,只是在随便一个大的商圈里面总能看到他们,而且作为工业化的结果吃起来都是一个味道,虽然好吃但是没什么特色。

武大周围除了大连锁之外还有许多小饭馆,每个都有自己独特的味道。其实也不一定有多好吃,但是离开了学校之后就再也吃不到了。现在回想起它们并不只是食物的味道,还有当时的感觉。

就和湖滨CBD拆了之后大家发文怀念一样,并不是怀念CBD老板们做的东西多好吃,怀念的是夏天的夜里上完课跑完步洗完澡之后穿上拖鞋出门买份炒饭和同学一边聊天一边吃的生活,也是大学的烟火气所在。

胖哥饺子馆

我心中武大美食当之无愧的的第一名。如果夜里开的话就是武大版的深夜食堂。最开始去饺子馆的时候都是走八一路,但是这样的话要么就得横穿马路要不就得一直逆行,每去一次感觉都有点危险所以一开始去得不多。但是有一天发现可以沿着珞珈山南边一直走,走到尽头一个小门出去就是东湖村,之后去的次数就多了起来。

一直以为叫胖哥饺子馆是因为老板比较胖,每次进去时候打招呼的老板也确实是比较丰满。但是去多了之后发现真正的老板好像是武大排球队的教练,据说之前很胖但是因为运动瘦了下来,饺子馆二楼还挂着排球队的合影还有胖哥跑马拉松的奖牌。

饺子馆其实是个主要卖饺子的东北菜馆,除了饺子还有酸菜炖粉条、豆腐拌松花蛋之类的。一般去的时候就点三两饺子还有一盘菜,夏天的时候加一碗绿豆汤、冬天就是南瓜粥,大概四五十两个人就能吃的很饱。再加上去旁边商店买的饮料还有偶尔下午的一点卤菜,大学的很多顿饭就是这么吃过来的。

工学部重庆小面

工学部重庆小面在城设院办旁边,文理学部和工学部交界处。这家店虽然屋里面有几个座位,但是每次去的时候我都愿意坐在外面,因为煮面的蒸汽会飘到里面好热。买面的时候要先那一个多少钱的小牌子,之后把这个小牌子给煮面的人告诉他吃什么然后等就行了,凭空增加了一个就业岗位。

面的量不是很大,吃完之后大概能吃个半饱,要是当一顿饭吃的话还得在旁边买个烧麦啥的。但是味道还不错,我觉得能有在重庆吃到的七八成了,比起那些连锁店也不逊色。最主要的是只要十块一碗可谓超值,每次来的时候吹着风吃着面看着旁边的人流还是很舒服的。

信部三食堂

三食堂就是二食堂的二楼。刚到武大的时候吃的基本都是一楼的饭,期间吃过了在米粉里伪装成肉的土豆、看着不辣吃起来巨辣的羊肉还有水乳交融的米饭之后感觉水平不太行,而且每次六点钟去的时候基本都没菜了,感觉武大的食堂水平不是很高。之后经高人指点发现二楼的菜比较好吃,于是就转战到了二楼。

我是属于那种吃到一个东西好吃之后就会一直吃的,最开始吃的是最左边的烧鹅饭,特点是米饭给的巨多肉没多少倒是骨头贼多,就导致每次都吃不完米饭。于是每次怒要两份肉解决了这个问题。

不过烧鹅饭虽然味道不错但是吃多了也会吃腻,于是在各种踩坑后转战瓦罐汤窗口,其中一个重要原因是这个窗口不排大队。这窗口卖各种汤,主要分类两类,鸡汤还有排骨汤。鸡汤还分鸡肉汤还有鸡杂汤,排骨则和冬瓜山药或者莲藕配合。这个窗口除了卖汤之外还卖各种饼,手抓饼红豆饼啥的,味道也都很不错。一般我来的时候就要一碗汤还有一块饼就能吃饱还不用排队,美滋滋。

工学部清真食堂牛肉干锅

工学部的食堂我真的没啥好印象,第一次去的时候惊讶地发现食堂还能和垃圾站建在一起,于是照了一张照片,名为《我眼中的武大》。

清真食堂在工学部二食堂的最上面,工学部二食堂我也吃过几次感觉没什么特别的,倒是清真食堂牛肉干锅堪称一绝。每次去工学部都会叫上一个人吃。虽然叫牛肉干锅但是牛肉没多少,倒是里面的配料比如茄子千张什么的很入味,就着能吃完一整碗米饭。这个地方还一个优点就是便宜,干锅三十一份再加上两碗米饭一共三十二,两个人就能吃饱,而且味道不输外面的饭馆。

一心居酒屋

一心居酒屋算是家比较新的店,在新开的群光二馆最顶层。学校周围的日料感觉我都吃过,比如群光楼下的回转寿司,楼上的仓桥家、汉街的海狸家还有小川啥的,感觉这个居酒屋是最合我口味的。

第一次来这家店吃了服务员推荐寿喜锅感觉一般般,但是之后来点了烤串还有米饭感觉很不错。因为预计吃饭指南的第一家就是这家店所以有图。

左边是京葱鸡肉串,就是葱爆牛肉把牛肉换成大块鸡肉的味道,葱因为烤得久了也不辣,鸡肉不硬烤得也很入味,可以葱和鸡肉一起吃,有种在吃北京烤鸡的感觉。还有烤鸡心鸡皮一类的也都挺好吃的。

去年夏天我自己留在学校偶尔会跑来这点一份照烧鸡排饭定食,吃起来很有满足感,没有照片就放一张牛舌饭的吧。

另外,这家店每次吃饭都会给一个小毛巾用来擦手,但是我这种人一般会跳过这个步骤转而带回家当抹布使,非常好用,这也是对这家店好感的来源之一。

梅菜扣肉饼

梅菜扣肉饼就在牌坊往前走一点,是一家夫妻店。虽然店名就叫梅菜扣肉饼但是各种饼都有卖,前任比较好这一口,而我对这卖的羊肉饼比较感兴趣。所有饼都是老板娘现场擀然后老板把揉好的面饼放到一个大桶里烤,要等一段时间才会考好,之后老板会拿个钩子钩出来掰成两半放到纸袋子里,拿到手上的时候会冒热气。

这个饼得现场吃,如果过的时间久了就会变的很硬不脆了。曾经吃过一次好像是来自湖滨的梅菜扣肉饼,味道简直难以下咽,和这个比起来简直一个天上一个地下。

有时候晚上下课饿了就会来这买个饼吃,不过据说没有撑过疫情倒闭了,sad。

么肆烤肉

么肆烤肉也在牌坊出门走一段就能到的吃饭一条街上,位置在二楼不是很明显。味道仅次于汉街的一家和牛烤肉,但是那家太贵了吃饱的话人均得400+,有的牛肉甚至论克卖,不适合我这种人。

这家店也比较新,是看到朋友圈里有人推荐才去吃的。因为知道的人少所以一般不用等位,老板偶尔也会亲自帮着烤肉。菜单是手写的,卖的品种不多,招牌是牛横膈膜。虽然我觉得肉一烤就吃不出什么区别,但是这家店的调味很不错,再加上有人帮助烤肉控制火候所以口感也很好,如果自己烤的话容易烤太硬就没那么好吃了。

美中不足的一点是这家也比较贵,四十多块一份肉大概只有八片,感觉要是吃饱人均得150左右。曾经问过老板为啥卖这么贵,他说他们也可以像其他店那样小几十一大盘,但是那种肉质量太差了他不想这么做。

鸭血粉丝汤

从梅菜扣肉饼再往前走一点就是鸭血粉丝汤,店面不大一共没几个位置,大家就坐在厨房后面的一圈小板凳上吃。店里一开始只卖鸭血粉丝汤,之后又开展了卖包子的业务。

每次来老板娘都会打招呼,然后问要sháo粉还是细粉,我一直以为是少粉,还心想为什么在这吃要么少要么细,之后才知道说的是苕粉,红薯粉的意思。

鸭血粉丝汤分不同价位,价格高里面的配料会多,最高价18块钱至尊粉丝汤则是里面加了鸭腿,但是并没有吃过。一般我都要配料加满的,再开上一瓶豆奶基本能吃饱。这里的粉丝汤味道很均衡,粉丝、汤还有配料不会有一样味道很突出,不像有一些店粉丝几乎没有味道,倒是盐分全部跑到了配料里,吃起来就很一言难尽。

工菜卤二哥

学校周围的卤二哥一共有两家,工菜一家牌坊一家。和其他的连锁不一样,虽然这两家都叫卤二哥但是味道差距极大,牌坊的我吃过一次,真的是巨难吃,还把我辣的够呛,以后再也不去了。

倒是工菜的这家发挥稳定,每次去味道都完全一样。一开始点鸭腿饭,但是因为骨头太多吃起来麻烦,之后就点一些不用吐骨头的吃,比如鸡肉肥肠五花之类的。因为不管配什么肉浇的卤汁都是一样的,所以吃起来区别不大。很多次都是从计院大楼出来不想吃食堂就去工菜点一份饭,看着师傅很快做好之后就坐在旁边窄窄的桌子上吃,夏天的话太热了就打包好带回家配着可乐吃。

汤师傅东北菜

这家店在茶港门出来往左走,或者西门出来往右走,招牌上的汤师傅写得很小。老板是对东北夫妇,说话有很浓的东北口音,卖的菜便宜、量大,据说开店不是为了钱,纯粹是用爱发电。

店面不大,一共只能坐下七八桌的样子。如果要来吃的话得早来,要不然就得等很久,等到手机没电可能就吃上了。这里的招牌菜是锅包肉,三十多很大一盘,端上来的时候金灿灿的看着很有食欲。但是可能东北的锅包肉和我理解的不太一样,是里脊肉裹了一层类似糯米糊糊的东西炸,炸完了之后在上面挤好多蕃茄酱。一开始感觉很好,但是吃多了之后会腻,所以感觉很少能全部吃完的样子。

因为每次都得碰巧没人的时候才会去吃,所以一共其实也没吃几次。记忆里还点过小鸡炖蘑菇还有定制的西红柿面,小鸡炖蘑菇其他地方主要是蘑菇,在这里蘑菇就是配料,盘子里面真的好多鸡肉,味道感觉也很正宗。西红柿面是有次突然想吃面但是菜单上没有让老板现做的,面条筋道番茄的味道也很浓,这里生意好不是没有原因的。

我的大学时代(一):初识

发表于 2020-06-02
| 字数统计: 2.7k | 阅读时长 ≈ 8

昨天看到学信网上自己的学籍信息已经变成了毕业,我的大学时代就这么悄无声息的结束了。虽然之前想过各种可能的结束方式,想在走之前好好看看这个自己生活了快四年的城市。但是世事难料,走的时候谁都没有想到会以这种方式结束。

虽然没有毕业典礼、没有对酒当歌、没有再见同学最后一面,但是还是货真价实地毕业了。既然毕业了就随便写一点东西记录一下大学生活吧。

一、选择

高考结束之后拿着不高的分数准备报志愿,当时的选项大概是在天大、北邮、武大、中山之间选。第一个排除掉的选项是中山,理由是太远了而且听不懂粤语,不过现在看来应该是个好选择;第二个排除的选项是北邮,理由是学校太小了有种高中的感觉;最后天大武大之间选,天大虽然离家近一点但是计算机不是很强,最后就选择了武大。

其实当知道分数之后脑子里出现的第一个想法就是去武汉大学,因为我对大学的校园生活还是有那么一点向往的,不想在一个鸟不拉屎的地方读一个增强版的高中。

选完了学校还得选专业,因为一直对计算机感兴趣,所以第一专业毫无疑问地是计算机,却对之后的选择犯了难。当时根据之前的录取分数线往后看,计算机之后是电子信息类还有软件工程,想着不浪费分数就按顺序写在了计算机后面。结果最后出结果的时候一看发现计算机没录上,录到了电子信息。虽然说EECS不分家但是学很多硬件课还是有一点难受的。但是结果出了也改变不了什么,只是发现了贵的不一定就好。

虽然高考的结果不是很满意,但是我相信人的生活是一个均值回归的过程。虽然可能在某个时刻偏离均值很多,但是最终还是会回归到均值的,而这个均值就是自己内心深处的渴望,关于自己究竟想成为一个什么样的人。现在看来无论我当时选择去北邮、天大、中山还是武大,最后的结果可能都是差不多的,决定自己生活轨迹的还是自己内心深处的想法,之后的经历也印证了这一点。

二、机会

因为不太想留在电信,所以一直在寻找转出去的机会,电信卓工班的选拔也没有参加,因为进去之后就不能转出去了。本来转专业是大一下学期的事情,而且归属于玄学范畴,每年都会有人因为莫名其妙的原因被拒绝,所以我心里也没有底。转机是军训的一天晚上公众号说武大网安开业了,现招15、16级学生组成第一届实验班。

我一看这是个不学电信好机会啊,于是就跑去找老师问了问网络空间安全到底是学什么。虽然也没太听明白但是觉得还挺不错的,于是跑了好几个地方终于搞到了转出专业的申请表提交了申请。面试的时候发现因为太新了所以没什么人想转进来,记得说是每一级招30个人,最后16级的来面试的只有26个,面试刷了一个剩下25个组成了16级网安班,15级的网安班人更少,只有19个人。

就这样,我又光荣地成为了武大网安院的第一届学生,也看到网安院从连个牌子都没有到霸占了国软大楼还在金银港盖新校区。当时觉得宣传说网络安全就是国家安全、制订网络安全法、武大又是第一批开办信息安全专业的学校,感觉有意思也很有前途的样子,但是之后发现其实各方面水平都比较一般:一届一百多个学生最后真的干这行的可能一只手都数得过来,大多数人最后还是会选择去做开发或者其他的工作,之后也会结合我的经历详细说为什么会导致现在的这种情况。

三、社团

对社团最早的印象是在电信的时候所有学生挤在一个不大的活动厅里听社团的宣讲会,具体讲了什么现在已经忘光了,但是还是对坐了几个小时军训小板凳之后屁股的感受记忆犹新。宣讲会听完了我就决定去体验一下社团是什么样的,最先参加的是电信院的新闻宣传部,其主要工作为运营学院的公众号,一共有十来个人分成几个组,好像是文字组、摄影组啥的,而我负责给写好的公众号排版。排版这个东西吧,很玄学,审核的人说好看就是好看,说不好就得改,最后可能还用回第一稿。每周开会的时候还会和其他学院的号比来比去,其实除了做运营的没人在乎这个。做了几次之后觉得很无聊,感觉自己单干都比这个强就没有继续留下来。

除了学院的这个以外当时还想搞搞设计,看到新生手册做的很好看于是又加入了学校新闻宣传部的设计工作室。还记得当时误入了校新宣其他部门的面试,具体场景是底下一批人西装革履目不转睛不苟言笑地坐着,然后一排被盯的目光呆滞手脚发颤语无伦次的人轮流做自我介绍回答问腿,最神奇的地方是是时间共用,就是说前面的人超时了之后你就不用介绍了,感觉比较无语,学生何苦为难学生。在面试完之后被告知走错屋子了,工作室的面试在旁边,进去之后发现就是那种很正常的聊天面试。在工作室一开始做设计,最开始设计了个封面之后就转到了网络组(共计三人),主要工作是搭了学生会网站但是只运行了一年也没有继续维护。当然这也是小团体的问题,技术传承不下去。

最后还加入了自强Studio。从报名开始,面试断断续续持续了一个月,中间经历了做奇怪的题、写奇怪的代码、还有写奇怪的网站和爬虫,最后终于进入了后台组。说来惭愧,自从加入了之后就没有做什么工作了,还白嫖了几次技术分享。不过自强算是武大非常好的社团了,虽然有一些项目后继无人(说的就是你淘课啦)但是大家还都是想做一些有意思的能让学校变好的东西,对技术有追求的同学能提供比较大的平台。

四、漏洞

拯救小布

刚入学的时候就发了学生卡,但是当时可以刷进图书馆但是并不能借书,研究之后发现得在图书馆网站上做一套题才能拿到借阅权限。登上图书馆网站之后发现是一个Flash软件,一共有多少道题限时答完。题目就类似于本科生一次能借多少本书,在图书馆里唱跳rap好不好一类的。本来答完就答完了,可以快快乐乐地结束了。但是发现最后还有一个排行榜,下面还说十一之前排行榜上的人有小礼物相送,这就激起了我的兴趣。

于是我开始尝试练就无脑答题法,发现并比不过排行榜上的大师们。之后又尝试了使用秘技:变速齿轮,但是也没有成功。最后打开控制台发现结束的时候就给服务器发了一个请求,参数就是用了多久答了多少题,于是我就提交了个0秒解决233题的记录上去,成功跻身排行榜第一。

过了几天想上去看看有没有人超过我,却发现我的号被拉黑了。只好用室友的号重新提交了正常的请求,这下没人发现了。最后室友领奖的时候老师还问怎么做的这么快。

迎新网

还是军训的时候,有一天全学院出动浩浩荡荡地去工学部一站式拍入学照片。之后的某一天发了一个公众号,说可以在这个公众号上查到自己的照片。我登上去试了试确实可以。本来正常流程到这里就结束了,但是我发现它最后返回的是一个网页,把链接复制到电脑上打开发现是个图片链接,图片名称是还是学号.jpg。

看到这里聪明的你就能想到应该怎么做了,没错,把学号一改就会显示出别人的照片。发现了这个之后又想起入学时候迎新网上能查到所有人的信息。因为没有办法导出,所以只能用土办法手工复制。就这样粘贴了几十页之后搞到了所有人信息的Excel,最需要的是姓名和学号的对应,这样就能实现输入姓名返回照片了。

注册这个公众号最开始的目的就是想干这个,但是最后因为技术原因作罢了。最后做了一个网站,输入学号或者姓名就能查个人信息。最后这件事还上了校领导接待会,说学校的信息安全系统建设水平还有待提升。不久之后迎新网就彻底关了,又过了一段时间发现可以查照片公司的网站也关闭了。

CSAPP数据实验

发表于 2020-05-24
| 字数统计: 1.5k | 阅读时长 ≈ 6

1.bitXor

  • 题目要求:使用~和&实现x^y
  • 允许操作:~ &
  • 操作数限制:14
  • 分值:1

第一题使用not以及and来实现xor。从书中例题可以知道x^y=(x&~y)|(~x&y),但是这题不能用or。

观察(x&~y),发现只有x=1且y=0时为1,对于(~x&y),x=0且y=1时为1。

将这两个取反得
| (x&y) | 1 | 0 |
| ——- | - | - |
| 1 | 1 | 0 |
| 0 | 1 | 1 |

(x&y) 1 0
1 1 1
0 0 1

此时两个结果做and再not即为xor的结果

1
2
3
int bitXor(int x, int y) {
return ~(~(x&~y)&~(~x&y));
}

2.tmin

  • 题目要求:返回最小二进制补码整数
  • 允许操作:! ~ & ^ | + << >>
  • 操作数限制:4
  • 分值:1

最小二进制补码整数Tmin就是10000000 00000000 00000000 00000000,十进制对应就是的-217483648。

把1左移31位就成了。

1
2
3
int tmin(void) {
return 1<<31;
}

3.isTmax

  • 题目要求:如果x是最大二进制补码整数返回1,否则返回0
  • 允许操作:! ~ & ^ | +
  • 操作数限制:10
  • 分值:1

和上一题类似,最大二进制补码整数Tmax的值为 01111111 11111111 11111111 11111111,对于这个数发现对其加一和取反的结果是一样的,都是Tmin,于是写出了!(~x ^ (x + 1)),想通过异或判断这两个数是否一样。但是测试的时候发现0xffffffff也有这个性质,只好在后面加一个判断看是否为全1.

1
2
3
int isTmax(int x) {
return !(~x ^ (x + 1)) & !!~x;
}

4.allOddBits

  • 题目要求:判断所有奇数位是否为1(最低位为0,最高位31),如果是返回1否则返回0。
  • 例:allOddBits(0xFFFFFFFD) = 0, allOddBits(0xAAAAAAAA) = 1
  • 允许操作:! ~ & ^ | + << >>
  • 操作数限制:12
  • 分值:2
1
2
3
4
5
6
int allOddBits(int x) {
int res;
x = x & (x>>8) & (x >> 16) & (x >> 24);
res = !(~(x | 0x55) & 0xff);
return res;
}

5.negate

  • 题目要求:返回-x
  • 例:negate(1) = -1
  • 允许操作:! ~ & ^ | + << >>
  • 操作数限制:5
  • 分值:2

此题使用观察法得出结果。设x=7则其二进制补码为0000 0111,-7的二进制补码为1111 1001。可以发现这两个数除了最后一位都是反过来的,要想得到一个数的相反数对其补码取反再加一就行了。这也是一个补码的性质。

1
2
3
int negate(int x) {
return ~x+1;
}

7.conditional

  • 题目要求:返回x?y:z的值
  • 例:conditional(2,4,5) = 4
  • 允许操作:! ~ & ^ | + << >>
  • 操作数限制:16
  • 分值:3

要得到x?y:z的值首先要判断x是0还是1,这就要用到!!操作符来两次取反将x变为0或1。之后将x扩展到所有32位,我用的方法是先左移32位使其成为最高位之后再右移32位(算术右移)。这样如果原先x为0则获得0,如果不为0则获得0xffffffff。

因为x为1的话返回y,为0返回z,可以通过将y与mask进行与操作,z与~x进行与操作来得到选择的效果,最后将两个结果合并就是最后的结果了。

1
2
3
4
5
6
int conditional(int x, int y, int z) {
int x1 = !!x;
int mask = x1 << 31 >> 31;
int res = (y&mask)|(z&~mask);
return res;
}

floatScale2

  • 题目要求:返回2*f的浮点数表示,当参数为NaN时直接返回参数
  • 允许操作:所有的,包括|| && if while
  • 操作数限制:30
  • 分值:4

对于规格化浮点数,其表示为2^expfrac,2f即2^(exp+1)*frac,将exp部分加一即可。

对于非规格化浮点数,因为exp已经确定不能改变,所以要想将其乘以2只要将frac乘以2,即左移一位即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
unsigned floatScale2(unsigned uf) {
int sign = uf & 0x80000000;
int exp = (uf & 0x7f800000) >> 23;
int frac = uf & 0x007fffff;
int res, masked;
if(exp == 255){
// if number is NaN or Infinity
return uf;
}
if(exp == 0){
// for denormal numbers, *2 means left shift frac once
frac = frac << 1;
return frac | sign;
}
// for normal numbers, *2 means left add one to exp
exp = exp + 1;
// clear original number's exp area and then apply new exp in
masked = uf & 0x807fffff;
res = (exp << 23) | masked;
return res;
}

floatFloat2Int

  • 题目要求:将输入的浮点数用整型表示,如果输出超出范围(包括NaN或是Infinity)返回0x80000000u
  • 允许操作:所有的,包括|| && if while
  • 操作数限制:30
  • 分值:4

首先从输入的浮点数中获取sign,exp和frac,然后根据这些信息来算出对应的整数。

主要思想为通过exp-127获得bias,就是frac乘以的2的次方数,如果bias为1就是乘以二,以此类推。通过将frac右移23-bias位即可获得对应的整数值。

最后如果sign为1还需要将结果变为负数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
int floatFloat2Int(unsigned uf) {
// getting sign, exponent and fraction from the float number
int sign = uf & 0x80000000;
int exp = (uf & 0x7f800000) >> 23;
int bias = exp - 127;
int frac = uf & 0x007fffff;
int res;
if(exp == 255 || bias > 30){
// if the number is infinity, NaN (bias is 255) or too big for integer (exp > 30)
return 0x80000000u;
} else if (exp == 0 || bias < 0){
// if the number is smaller than 0, return 0
return 0;
}
// add back the lost 1 to the front of fraction
frac = frac | (1 << 23);
// result is fraction right shift 23-bias times
res = frac >> (23 - bias);
// if the sign of float is 1, need to return -res
if(sign){
res = ~res+1;
}
// for debug purpose
//printf("\n%x\t%x\t%x\n", sign, bias, res);
return res;
}

floatPower2

  • 题目要求:返回2.0^x的浮点数表示,如果数太小不能用非规格化表示返回0,如果太大返回+INF
  • 允许操作:所有的,包括|| && if while
  • 操作数限制:30
  • 分值:4
    因为x是整数,所以2的x次方用浮点数表示就是exp部分为x。因为规格化浮点数只能表示到2^127,所以x比127大则返回+INF。又因为非规格化浮点数只能表示到2^-126,所以x<-126直接返回0。剩余的情况就是能表示的了,将x+bias(127)左移23为成为exp返回即可。
1
2
3
4
5
6
7
8
9
10
11
12
13
unsigned floatPower2(int x) {
int inf = 0x7f800000;
int exp, res;
if(x > 127){
return inf;
}else if(x < -126){
return 0;
}
exp = x+127;
res = exp << 23;
//printf("\n%x\t%x\n", exp, res);
return res;
}

Leetcode 149. 直线上最多的点数

发表于 2019-07-09
| 字数统计: 869 | 阅读时长 ≈ 3

题目描述

给定一个二维平面,平面上有 n 个点,求最多有多少个点在同一条直线上。

阅读全文 »

Leetcode 46. 全排列

发表于 2019-07-07
| 字数统计: 280 | 阅读时长 ≈ 1

题目描述

给定一个没有重复数字的序列,返回其所有可能的全排列。

阅读全文 »

Leetcode 130. 被围绕的区域

发表于 2019-06-15
| 字数统计: 890 | 阅读时长 ≈ 3

题目描述

给定一个二维的矩阵,包含 'X' 和 'O'(字母 O)。

找到所有被 'X' 围绕的区域,并将这些区域里所有的 'O' 用 'X' 填充。

阅读全文 »

Leetcode 138. 复制带随机指针的链表

发表于 2019-06-13
| 字数统计: 288 | 阅读时长 ≈ 1

题目描述

给定一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点。

要求返回这个链表的深拷贝。

1
2
3
4
5
6
输入:
{"$id":"1","next":{"$id":"2","next":null,"random":{"$ref":"2"},"val":2},"random":{"$ref":"2"},"val":1}

解释:
节点 1 的值是 1,它的下一个指针和随机指针都指向节点 2 。
节点 2 的值是 2,它的下一个指针指向 null,随机指针指向它自己。

分析

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
"""
# Definition for a Node.
class Node:
def __init__(self, val, next, random):
self.val = val
self.next = next
self.random = random
"""
class Solution:
def copyRandomList(self, head: 'Node') -> 'Node':
if not head: return None
node = head
while node:
next_node = node.next
node.next = Node(node.val, next_node, node.random)
node = node.next.next
node = head.next
while node.next:
node.random = node.random.next if node.random else None
node = node.next.next
node.random = node.random.next if node.random else None
old_node = head
new_node = head.next
cloned = head.next
while new_node.next:
old_node.next = old_node.next.next
new_node.next = new_node.next.next
old_node = old_node.next
new_node = new_node.next
old_node.next = None
return cloned

Leetcode 84. 柱状图中最大的矩形

发表于 2019-06-08
| 字数统计: 136 | 阅读时长 ≈ 1

题目描述

给定 $n$ 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。

求在该柱状图中,能够勾勒出来的矩形的最大面积。

以上是柱状图的示例,其中每个柱子的宽度为 1,给定的高度为 [2,1,5,6,2,3]。

图中阴影部分为所能勾勒出的最大矩形面积,其面积为 10 个单位。

阅读全文 »

Leetcode 146. LRU缓存机制

发表于 2019-06-06
| 字数统计: 1.2k | 阅读时长 ≈ 5

题目描述

运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制。它应该支持以下操作: 获取数据 get 和 写入数据 put 。

获取数据 get(key) - 如果密钥 (key) 存在于缓存中,则获取密钥的值(总是正数),否则返回 -1。

写入数据 put(key, value) - 如果密钥不存在,则写入其数据值。当缓存容量达到上限时,它应该在写入新数据之前删除最近最少使用的数据值,从而为新的数据值留出空间。

进阶:

你是否可以在$O(1)$ 时间复杂度内完成这两种操作?

阅读全文 »
12

李叶

15 日志
11 标签
GitHub E-Mail
© 2019 — 2020 李叶