研三四月

最后一学期即将结束,逝去的四个月过得有些快。想来主要做了两件事情:确定工作和完成论文。

毕业找工作是我第一次和企业走得那么近。和对待其他事情一样,我依然保持自己的风格:不紧不慢,不功利也不失措。不能说这样好,只是比较合乎我的节奏。系里面的Offer狂人都有着一般人望尘莫及的能力和毅力,可以参考这里and这里。我仅仅记录一下找工作过程中自己的成长。

在正式找工作之前我们能准备的是两件事情:一张充实的简历和一种待人处事的心态。

关于简历,我没有刻意去想该怎么写,只是认为把自己遇到的事情完成,把能够经历的挑战变成经验。现在想想,简历最好做到1. 该有的都要有(成绩排名、学科竞赛、实习经历、科研论文、社团活动等);2. 有一两个亮点(一两点可以加粗显眼)。
关于心态,有一些很重要的词汇:自信、不卑不亢、积极。
在关键抉择前面,首先是要对自己有深刻的了解,其次是对周遭情况比较清楚,做到知己知彼。我比较清楚自己在实践上比较匮乏,在学校待久了对公司全然不知。

我首先是从争取实习开始涉足工作准备。实习需要准备好两方面条件:实验室和公司。尽力把实验室的事情完成,全力以赴完成让老板认可;找到一家社会认可度高的公司和一个力所能及的职位。在研二下我开始张罗毕业需要的条件和实验室项目,同时开始关注各个公司的情况。最终我两手准备完成毕业论文,并选择了去阿里实习。实习职位是测试开发工程师,工作内容比较轻松。老大人很好,短短的两个月末给我争取到实习转正的机会。只可惜当时对面试还停留在理论认知阶段,第一次怎么也无法入戏。倒是害得部门主管很内疚(估计他没有料大家全然不知道面试官看重什么),给我们做了一次面试交流。

九月初从杭州回到南京,开始准备校招。当时有太多的事情需要准备:专业基础、正式简历、笔经面经、公司情况。懊恼的是,周围的同学经过一个暑假甚至更久的准备后都跃跃欲试。反正顾全不了,我首先完成简历(定稿后就只要稍加修改),然后选定两类公司(一类是想去的公司,一类是备选),第三是每天都网申+看书做题。
九月来学校招聘的公司相对少,南京本地的华为、中兴、趋势,外来的有大众点评、人人网、淘宝、雅虎、EMC、IBM。我首先网申了华为,准从这家另类的公司开始攒经验。9月17号去华为上机,20号去面试,两面+网测,然后等结果(再也没等到)。然后去IBM面试(10分钟),同样没有结果。然后先后完成了淘宝、人人、EMC笔试。淘宝笔试没有通过,人人进一面,EMC笔试没有进南京现场面试(人人和EMC还有下文,所以找工作是一个需要历经数月的事情)。整个九月在习惯找工作的流程,把握找工作的节奏。虽然和预计的一样,一无所获。但是也基本是完成了既定目标。了解公司,也让公司了解我,明确公司对自己什么地方感兴趣,哪些东西还没准备,哪些东西又是重点。

十一假来得真是时候,我好好地喘息了一把。假期初回家参加了弟弟婚礼并会了几个老同学,在别人看来是车旅劳顿和闲心逸事,于我而言却是滋润内心萌生力量的甘泉。假期后半段针对九月份的初试未捷,我重点回顾了一下过去两年中自己从事的各种工作和成果,将所有的存档翻出来总结成三五句话的概述;同时把专业知识按照主题重新罗列后扫荡一遍。然后是疯狂的网申,list一直申请到十二月初(不一定都能去,但把门票先拽在手里)。

金秋十月以百度的笔试拉开序幕,一卷的算法题应该是我考的第一份算法试卷。十月9号考百度的时候,一边给自己打球说百度的算法题向来没人能答好,一般胡乱的码代码,只想过线拿到面试敲门砖就OK。当天下午参加南京本地的公司麒麟远创的宣讲和笔试。麒麟也是一个比较有意思的公司,自称需要笔试满分才能进面试,面试方式很特殊。题目比较常规,考试感觉比百度的好很多。9号晚上真累,避免脑袋休克去参加Marvel的宣讲。现在想来真为当时的决定庆幸,因为Marvel的HR给我们应届生上了一堂如何找工作的指导课。劳累有一个好处是倒床就能入睡,都没有精力去焦虑。

十一号凌晨接到阿里云的面试通知,而且面试就安排在十一号早上十点。之前经同学推荐免去了笔试,十月的第一次正式面试在第二天就开始了,也是我第一次正式的公司面试。九点半赶到珠江路明珠大酒店,排号等待十点的面试。我是第二批,面试九点已经开始,看到了一群从湖区赶来的兄弟姐妹正在那边打瞌睡,心里暗暗庆幸。阿里云的面试团队是从杭州过来的,采用的是车轮面,也就是面完一面后如果通过就继续等待下一面,一直到出局或者拿到Offer。一面是一个帅哥面试官,很亲切,在我做过自我介绍后特点根据我的知识背景选择性的给我出题,偏重考察算法和智力题以及解决问题能力。他出的第一道题目是一道赛马安排,刚好是我在淘宝实习时候天悟用来考察实习生的题目。记得当时他说过我们以后也会被面到,果不其然,我吸取了之前的教训,这次认真把解题过程写下来,边分析边回忆。第一道题很顺利的答出来,面试官比较满意。后面继续考察了几道题目,不论会与不会,我都注意和面试官保持交互,不会的索性跳过,最后在他的提示和自己的思索下基本都答了上来。最后面试官还很友好的同我约定出去后不能泄题,因为他会重用。我也猜到自己一面顺利的通过了。后面是焦急的等待二面。整个面试很乱,人多面试进度不一无法控制。我催问了一下好容易等到了二面。二面面试官了解到我是经过内推进入面试的,上来和我聊家常,又问我对这个同学的评价,又问我自己与别人比较有什么特点和优势。我只能赞美一下各位同学同时表了表决心。然后是让我沿着bayes公式从项目问到做题,然后回过头来扯mapreduce、hadoop,一直问道我思路混乱无言以对。现在想想应该是传说中的压力面。还好当时虽然很不舒服,没有显露慌张失措。两面结束已经是十二点多,面试没有安排午餐,让自己解决。因为知道二面通过,我就买了点面包和香蕉支撑一下,然后等待三面。后面听闻面试官都去吃午餐了,让下午有面试的各自去吃饭。我好是尴尬,吃了但不是很饱,想想后面就一面就没有去吃午餐。三面两点多才开始,是一个学院派风格的面试官。上来就跟我聊机器学习和数据挖掘以及搜索,然后是关注了一下我的科研工作,后面出了一道题,不会做。整个面试过程很随意,没有太强的考察味道,感觉大部分时间是面试官在给我上课,我在旁边听。三面结束后没有一点过与不过的征兆。在等待室等了一阵,HR通知我等待四面,面完就可以直接回去了。我听完有些糊涂,是四面不是HR面,还让直接回去。看来面试混乱到连HR都没时间照料我了。四面在将近五点的时候开始了,真是技术面,还是很严肃的男面试官。等待了太久,进屋时已经迫近黄昏,第一件事情是找电灯开关。原以为会谈一些轻松的话题,结果是测试、算法和智力题全面考察,最后饿得我体力不支。结束的时候四面面试官一改之前严肃的表情,微笑着对我说:“我已经完全了解你的优点和缺点,谢谢你的时间。”当时把我听蒙了,难到是委婉的拒绝?罢了罢了,我已尽力而为,该吃饭去了。

晚上回到实验室,得知在Marvell工作的师兄过来招聘,联系我们是否有兴趣过去面试。师兄人真是nice,之前已经在群里面问过,而我们决定方向不对口就没有回应。现在他还是不忘记给我们争取机会,而且找工作到此才真正意识到机会是多多益善。于是赶紧把简历邮件给了师兄。阿里云一整天的面试也让我意识到找工作的艰辛,试水两天也让我不得不重新评估接下来两个月的辛苦程度。十二号早上收到Marvell的通知,让十二号中午去面试,于是哈皮地感谢了一下师兄。正在各种调整中,这时人人从北京给我打来电话,问是否有空面试。我想多操练操练就来者不拒。一个多小时,各种问,最后问期望薪水。我还真没想过,但对人人的情况有所听闻,于是报价1w(后来人人再没消息了,据说给的工资远高于我的报价,有14k)。回想九月底人人面试把我鄙视的一无是处,现在又回头电面,找工作各种情况皆有可能。下午赶到五星级苏菲特大酒店等候Marvell的面试,又是车轮面,而且我是最后加进去的,被安排在了最末尾,等吧。果不其然,等到下午四点半还没轮上我。这时收到一条诡异的信息,是阿里云,让晚上六点半去面试酒店参加座谈会。真是尴尬,等了半天的面试需要放弃了,阿里神马意思,座谈会还是六点半,晚饭又被搅黄了。没办法,相比于Marvell,阿里云的机会更大些。跟HR打过招呼直奔明珠大酒店。不过在城市里骑车穿梭的感觉真的蛮惬意的~路上还接到远景能源的通知,让我去上海参加奖学金评选,这事情成为了我十月份的一道插曲。路过学校,买了瓶酸奶,匆匆喝完。到了酒店才知道座谈会是安排在饭桌上面,也认出了昨天的面试官们。这悬着的心一下子着了地。摸摸半饱的肚子,可惜得错过一桌的美味佳肴。确实没有想到这么快就拿到了第一个Offer,而且还是我一直奢望的一个。

果真如师兄所言,拿到第一个Offer后一切都会顺利起来,我继续调整了一下找工作的策略,不再饥不择食。后面陆续参加了微策略、ebay、腾讯、信步,841所等企业单位的笔试,其中微策略进入了面试。中间还花了些时间准备了一些远景奖学金评选的幻灯片,在十四号坐高铁去了一趟远景上海研发中心。在那里在看到了很多业界前辈,也看到了一家新兴公司的活力和追求。远景是一家值得去的公司,只可惜与我所学的不对口径。十月的第二个周末收到EMC的面试通知,又得去上海面,当时都想不起来时什么时候进行笔试的,感觉是在遥远的上个世纪。因为没有打算去国家单位,一直忽略各种所各种政府部门的招聘信息。现在有了保底,正好赶上南京841所招聘,也发了一份简历过去,而且还根据要求发了PP。但因为太久没有拍照了,连张像样的近期照片都没有,只能拿去年的充数。

十七号周一根据预约去南京麒麟远创面试。本地公司就是不一样,面试官一个接一个的过来找你聊,我有问题不会,他们就现场教我,知道把我教明白了,再重新来过。这个和我教别人的方式如出一辙。算法,算法还是算法;基础,基础还是基础,好不容易面过两面。面试官给我的评价是基础太差,学习能力还行,估计交流能力也被认可了。三面面试官做过来,压根不打算面,赞美了我两句说我的技术背景和他们公司不是很吻合,暗示我去淘宝等大公司闯荡。看来是想据我又要给我学校面子,不去也罢,公司环境真的不吸引我,我也不是非留南京。后来才知道他们研究中心才几十号人,每年在全国招个位数。也就是那几天收到中华英才网转发EMC面试通知,让跑到上海研发中心去面,于是二十号我又坐上了去上海的高铁。面试地点在上海复旦的杨浦校区旁边,正好那几天实验室哥们在那边参加NDBC会议。有几个兄弟因为找工作没有过去,我于是蹭道在复旦光顾了一下NDBC会场和餐宴。EMC是存储领域的领头羊,整个公司透露出一股外企的范儿,和我去过的微软上海研究中心一个风格。面试安排是连续三面,每面半小时,三人一组,面试官交叉面。果然是外企的风格,时间和过程都很有条理。面试中很多不会,我就很诚实的说不懂;至于英语,让我说我就是,至于你能不能听懂我尽量而为,呵呵,真是难为那几个面试官了。在EMC面试回来的路上收到了微策略的面试通知。后面也收到了841所的面试通知。十月的下旬时以这两次面试结束的。

二十七号我的找工作算是告一段落,后面转入论文阶段。话说论文科研的事情一丢已经丢了有五个月之久。于是我一边放松,一边做做翻译,开始堆砌学校要求的3万字阶段总结。也就在这个时候,杳无音信的百度蹦出来招呼我了,让我十一月六号准备电面。虽然我不一定会去百度,但是这次面试算是他们欠我的,我决定把这条路走到底。一面还是蛮顺利的,交流的一些问题都答出来了,然后丢掉忙论文。十一月初,焦急等待的阿里云的电子offer终于拿到了。这时我的第一个offer,也是我当时仅有的offer,于是口头答应会过去的。接着,841所也给offer啦。两个offer赶在一起了,面对两条完全不同的路,虽然我内心已经有了选择,但是还是矫情了一把。十六号晚上八点多接到一个北京的电话,告知我他是我的百度二面面试官,约我第二天面试。我听到他那疲惫的声音,很是无言,他忙得真的快把我的面试忘了。二面主要聊我自己的工作,面试官问得很细致,经历过十月份的操练现在答起来很有章法。面完我感觉三面游戏,于是丢掉继续等百度联系我。过了一周,北京准时打来电话,让我去北京三面,并承诺我面完就直接发offer。北京,北京,太远了,我直接回绝不愿去北京,即使北京给offer也基本不会去的。至此,与度娘的眉眼算是打住啦。前前后后有了一个月时间,论文的框架也基本成型。

我开始张罗着让老妈来一趟南京。在南京七年有余,老妈仅大学开学第一天送我到学校,在浦口待了一天。在她的记忆里面我的大学一直是一片荒郊野外,饭菜没有油水,甜辣难以下咽,还有那有如开水的免费汤。这几年我换了好几个地方,对学校的了解和感情也深了很多;老妈也真是老了不少,每次都爱唠叨这几句。十月是南京大学最好的季节,整个校园都是一层金色,银杏的叶子给学校裹上了一件很耐看的秋装。是该改变一下老妈的看法了,不然以后她唠叨起对学校的评价和我内心的出入太大。这个时候,度娘又出来搅局,让我十二月一号去上海研发中心现场面试。我是基本死心了,百度却不放手,还拿着我只愿意去上海的理由让我不好回绝。百度上海三面,内容和过程比较电面还简单,很快就考察完毕。最中心的话题仅是我是否愿意放弃之前的签约去改签百度,我只能回到说会慎重考虑。当然,面试官是一如既往的nice,给的机会也不错,可以去FC做广告搜索,也可以去联盟做数据学习分析,给了我很大主动权。只是这些都不足以让我动心去毁约改签百度,我也争取到了一个星期考虑这个事情。期间,我咨询了最好的兄弟,已经工作的朋友,他们同样没有能够帮我找到改签的理由。

十二月六号,我把老妈请到了南京。南京和南通仅五个小时车程,而老妈再次过来却花了七年时间,我内心还是有些歉疚的。我把拒了百度事情跟她说了,老妈一如既往的回答:“让你读这么多书,就是因为我不懂。你自己做决定,你觉得好就好。”老妈有些晕车,在食堂吃过饭,下午我带着她走了两个学校的校园,去台城那边看了一下玄武湖,也在实验室坐了会儿,还去金润发买了些东西。路上竟然收到EMC电话,问我是否有兴趣过去做前端开发(不感兴趣,委婉据了)。晚上导师给我打来电话(真是难得),问我是否愿意去英国读博士,他的一个合作伙伴正在实验室访问,可以过去面谈。我跟老妈说了一下出国读博的可能,她好似觉得儿子要飞到外星球一样立马说:“千万别去,千万别去,去了还不知道什么时候才能回来呢。”我乐呵呵的说:“好的,我不读了。”老妈来了南京,我的手机也活跃起来啦。这时我深深的意识到,所有的机会原来全是老妈带给我的。
第二天,我带老妈去万达看了《鸿门宴》,然后在新街口吃了一下鸭血粉丝(味道一般),下午一直逛商场。衣服很贵,老妈本要给我买的,我都说看不惯没有买。其实想给老妈买些衣服的,她肯定不愿意的,还是等我工作了。老妈其实也很倔,我拗不过的,所以很多事情安排都是先斩后奏。路上竟然遇到一个阿姨向老妈夸我孝顺,我想老妈这次南京之行应该不会只记得来去的晕车痛苦。

论文从写作到预答辩再到答辩,算是按部就班的完成了。工作做得还是有些粗糙,自己也不甚满意,不讲了。毕业万岁~

2012来了,挡也挡不住。希望这一年把身体练壮实、挣到年终奖,最重要的是找到你:)

一个男人该有的气质

一个男人,一定要有男人的样子,利利索索,痛痛快快,千万不要扭扭捏捏,婆婆妈妈。
一个男人,要懂得保护女人和尊重女人,尤其是后者,千万不要强迫她做她不愿意的事情,不要打女人,无论她伤过你还是骗过你。
一个男人要说话算话,吐出去的东西再咽回来,自己都会觉得恶心。
一个男人,可以不帅,但是一定要有风度,要有修养,要有内涵,要有底蕴,男人可以丑,但不可以丑陋。
一个男人,可以不用才高八斗,学富五车,但是应该有自己的一技之长,无论怎样,要养家糊口。
一个男人,要有自己的目标和追求,人也就这一辈子,头顶的天都是一样的,你可以失败,但不能自甘平庸。
一个男人,要有责任感,无论是对事业还是对家庭,无论是对父母妻儿还是朋友兄弟,都要担当自己的职责,自私自利的不是好男人,推脱逃避的不是好男人。
一个男人,还应该强悍,社会上鱼龙混杂,充满了危机和诱惑,意志力不够坚定,很容易被击败,被打跨,一个随随便便就被击败打跨的人,其他一切也无从谈起,无需谈起。
一个男人,应该学会赚钱,千万不要以为攒钱可以发家致富,钱都是赚来的,不是攒出来的。
一个男人,要勤奋果敢,天道酬勤的道理已属于老生常谈,而自己觉得对的事情就要努力去做。
一个男人,要沉稳冷静,沉稳是男人区别于男孩的标志,而冷静,可以让你最大限度发挥优势,降低风险,也让你显得更加成熟。
一个男人,不要习惯于解释,解释这东西是最最没用的,你想当初干吗去了?再者,有些时候,沉默确实是金。
做一个男人,一个真正的男人,顶天立地,纵横四海!!
—- 马云

两层指针的参数传值

#include <stdio.h>
 
void getCharX(char ** c)
{
  char x = 'X';
  char * cp = &x;
  *c = cp;
}
 
int main(void)
{
  char *xp;
  getCharX(&xp);
  printf("my char: %c", *xp);
  return 0;
}

本质上是传入指针的地址,然后可以将函数内部分配的空间的地址传给函数外部的指针,根据指针地址存入指针空间中。

字符串中删除多余的空白符

编一个函数,输入一个字符串,要求做一个新字符串,把其中所有的一个或多个连续的空白字符都压缩为一个空格。这里所说的空白包括空格、’\t’、’\n’、’\r’。

#include <stdio.h>
 
int isSpace(char c)
{
  if(c==' ' || c=='\t' || c=='\n' || c=='\r')
    return 1;
  else
    return 0;
}
 
char * mergeSpace(char *dest, const char *src)
{
  int spacePre=0;
 
  int i,j;
  for(i=0, j=0; src[i] !='\0'; i++)
  {
    if(isSpace(src[i]))
    {
      if(spacePre == 0)
      {
        spacePre = 1;
        dest[j++] = ' ';
      }
    }
    else
    {
      dest[j++] = src[i];
      spacePre = 0;
    }
  }
  return dest;
}
 
int main(void)
{
  char ca[] = "this contest   is\tok\n\nfile sty\n\tend";
  printf("before: %s\n", ca);
 
  char caa[100];
  printf("after: %s\n", mergeSpace(caa, ca));
  return 0;
}

迷宫寻路

import java.util.Deque;
import java.util.LinkedList;
 
/*
使用广度有限遍历实现迷宫路径
*/
public class Maze {
	private class Point{
		int x;
		int y;
		Point pre;
 
		public Point(int x, int y, Point p) {
			this.x = x;
			this.y = y;
			this.pre = p;
		}
	}
 
	Point[] queue = new Point[256];
	int head = 0, tail = 0;
 
	public void enqueue(Point p) {
		queue[tail++] = p;
	}
 
	public Point dequeue() {
		return queue[head++];
	}
 
	public boolean isEmpty() {
		return head == tail;
	}
 
	private static int MAX_ROW =5, MAX_COL = 5;
	int[][] maze = new int[][]{
		{0,1,0,0,0},
		{0,1,0,1,0},
		{0,0,0,0,0},
		{0,1,1,1,0},
		{0,0,0,1,0},
	};
 
	public void printMaze() {
		for(int i=0; i<MAX_ROW; i++) {
			for(int j=0; j<MAX_COL; j++) {
				System.out.print(maze[i][j]);
			}
			System.out.println();
		}
	}
 
	public void visit(int r, int c) {
		Point point = new Point(r, c, queue[head-1]);
		maze[r][c][/c] = 2;
		enqueue(point);
	}
 
	public void game() {
		Point p = new Point(0, 0, null);
		maze[p.x][p.y] = 2;		
		enqueue(p);
 
		while(!isEmpty()) {
			p = dequeue();
 
			if(p.x == MAX_ROW-1 && p.y == MAX_COL-1) { //goal
				break;
			}
			if(p.y+1 < MAX_COL && maze[p.x][p.y+1] == 0) { //right
				visit(p.x, p.y+1);
			}
			if(p.x+1 < MAX_ROW && maze[p.x+1][p.y] == 0) { //down
				visit(p.x+1, p.y);
			}
			if(p.y-1 >0 && maze[p.x][p.y-1] == 0) { //left
				visit(p.x, p.y-1);
			}
			if(p.x-1 > 0 && maze[p.x-1][p.y] == 0) { //up
				visit(p.x-1, p.y);
			}
 
			printMaze();
		}
 
		if(p.x == MAX_ROW-1 && p.y == MAX_COL-1) {
			System.out.println("(" + p.x + "," + p.y + ")");
			while(p.pre != null) {
				p = p.pre;
				System.out.println("(" + p.x + "," + p.y + ")");
			}
		}
		else {
			System.out.println("No Path");
		}
	}
 
	Deque<Point> deque = new LinkedList<Maze.Point>();
	public void visitV2(int r, int c, Point cur) {
		Point point = new Point(r, c, cur);
		maze[r][c][/c] = 2;
		deque.add(point);
	}
 
	public void gameV2() {
		Point p = new Point(0, 0, null);
		maze[p.x][p.y] = 2;		
		deque.add(p);
 
		while(!deque.isEmpty()) {
			p = deque.poll();
 
			if(p.x == MAX_ROW-1 && p.y == MAX_COL-1) { //goal
				break;
			}
			if(p.y+1 < MAX_COL && maze[p.x][p.y+1] == 0) { //right
				visitV2(p.x, p.y+1, p);
			}
			if(p.x+1 < MAX_ROW && maze[p.x+1][p.y] == 0) { //down
				visitV2(p.x+1, p.y, p);
			}
			if(p.y-1 >0 && maze[p.x][p.y-1] == 0) { //left
				visitV2(p.x, p.y-1, p);
			}
			if(p.x-1 > 0 && maze[p.x-1][p.y] == 0) { //up
				visitV2(p.x-1, p.y, p);
			}
 
			printMaze();
		}
 
		if(p.x == MAX_ROW-1 && p.y == MAX_COL-1) {
			System.out.println("(" + p.x + "," + p.y + ")");
			while(p.pre != null) {
				p = p.pre;
				System.out.println("(" + p.x + "," + p.y + ")");
			}
		}
		else {
			System.out.println("No Path");
		}
	}
 
	public static void main(String[] args) {
		Maze maze = new Maze();
 
		maze.gameV2();
 
		Deque<Integer> deque = new LinkedList<Integer>();
 
		deque.add(1);
		deque.add(2);
		deque.add(3);
		deque.add(5);
 
 
	}
}

单向链表操作

public class ListOperations {
	private String id;
 
	private class Node {
		Node next;
		int id;
 
		Node(Node n, int id) {
			this.next = n;
			this.id = id;
		}
 
		@Override
		public String toString() {
			return Integer.toString(id);
		}
	}
 
	/*
	 * 从后面添加节点
	 */
	public Node createList() throws IOException {
		Node head = null, last = null;
 
		boolean isHead = true;
		byte[] inputId = new byte[1024];
		while(true) {
			System.out.println("Please input the id of the Node. And '0' for exit");
			int length = System.in.read(inputId);
			String idStr = new String(inputId, 0, length-1);
 
			if(!idStr.equals("0")) {
				int id = new Integer(idStr);
 
				Node n = new Node(null, id);
 
				if(isHead) {
					head = n;
					last = n;
					isHead = false;
				}
				else {
					last.next = n;
					last = n;
				}
			}
			else {
				break;
			}
		}
 
		if(isHead) {
			return null;
		}
 
		return head;
	}
 
	public void printList(Node head) {
 
		Node cur = head;
		while(cur != null) {
			System.out.println(cur.id + "\n");
			cur = cur.next;
		}
	}
 
	public void deleteList(Node head, int id) {
		if(head.id == id) {
			head = head.next;
		}
 
		Node pre = head;
		Node cur = head.next;
		while(cur != null) {
			if(cur.id == id) {
				Node next = cur.next;
				pre.next = next;
				break;
			}
			pre = pre.next;
			cur = cur.next;
		}
	}
 
	public void insert(Node head, int num) {
		Node cur = head;
		Node pre = null;
		while(cur != null && cur.id < num ) {	
			pre = cur;
			cur = cur.next;
		}
 
		Node n = new Node(null, num);
 
		if(cur == head) {
			n.next = head;
			head = n;
			return;
		}
 
 
		pre.next = n;
		n.next = cur;
 
	}
 
	public static void main(String[] args) throws IOException {
		ListOperations operator = new ListOperations();
		Node head = operator.createList();
 
		operator.printList(head);
 
		operator.deleteList(head, 7);
 
		operator.printList(head);
 
		operator.insert(head, 7);
		operator.printList(head);
	}
 
}

二叉树

 
/*
 * 求二叉树的深度
 */
public class TreeDepth {
	private class Node {
		Node left;
		Node right;
		int id;
 
		Node(Node l, Node r, int id) {
			this.left = l;
			this.right = r;
			this.id = id;
		}
	}
 
	public int getDepth(Node root) {
		if(root == null)
			return 0;
 
		if(root.left == null && root.right == null)
			return 0;
 
		int leftDepth = getDepth(root.left);
		int rightDepth = getDepth(root.right);
 
		return leftDepth > rightDepth ? leftDepth + 1 : rightDepth + 1;
	}
 
	public void runTest() {
		Node n4 = new Node(null, null, 4);
		Node n5 = new Node(null, null, 5);
		Node n3 = new Node(n4, n5, 3);
		Node n2 = new Node(n3, null, 2);
		Node n1 = new Node(null, null, 1);
		Node n0 = new Node(n1, n2, 0);
 
		int depth = getDepth(n0);
 
		System.out.println(depth);
	}
 
	public static void main(String[] args) {
		TreeDepth treeDepth = new TreeDepth();
		treeDepth.runTest();
	}
}

字符串操作

 
import java.util.HashMap;
import java.util.Map;
 
/*
 * 给定一个字符串,其中一个字符出现的次数是奇数次,其余字符出现次数是偶数次,找出出现奇数次的那个字符
 */
public class OddChar {
	public void methodByMap(char[] a) {
 
 
		Map<Character, Integer> char_num = new HashMap<Character, Integer>();
		for(int i=0; i<a.length; i++) {
			char c = a[i];
			if(char_num.containsKey(c)) {
				char_num.put(c, char_num.get(c) + 1);
			}
			else {
				char_num.put(c, 1);
			}
		}
 
		for(Character c: char_num.keySet()) {
			Integer integer = char_num.get(c);
			if(integer % 2 == 1) {
				System.out.println(c);
				break;
			}
		}
	}
 
	public void methodByXOR(char[] a) {
		if(a.length == 0) {
			return;
		}
 
		if(a.length == 1) {
			System.out.println(a[0]);
		}
 
		char k = a[0];
		for(int i=1; i<a.length; i++) {
			k ^= a[i];
		}
 
		System.out.println(k);
	}
 
	public void methodByXORForString(String x) {
		int length = x.length();
 
		if(length == 0) {
			return;
		}
 
		if(length == 1) {
			System.out.println(x.charAt(0));
		}
 
		char k = x.charAt(0);
		for(int i=1; i<length; i++) {
			k ^= x.charAt(i);
		}
		System.out.println(k);
	}
 
	public static void main(String[] args) {
		OddChar odd = new OddChar();
 
		char[] a = {'a', 'a', 'a', 'b', 'b', 'c', 'c', 'd', 'd', 'x', 'x'};
 
		odd.methodByMap(a);
 
		odd.methodByXOR(a);
 
		String string = new String(a);
		odd.methodByXORForString(string);
 
		System.out.println( 'a' ^ 'a' ^ 'b');
	}
}

实习经历

在杭州实习阶段即将结束,在过去的两个月里面,应该写写的却始终敲不开键盘。总的来说,在这边不忙也不累,闲着的那段可以安静地看源代码;无能为力的那段到处寻找帮助。

实习阶段主要做了两项工作,分别对应到两种完全迥异的感觉。

第一项是阅读itest及相关框架的源代码,完成itest的web测试用例。这个从第三周开始全力投入的,前后延续一个月。我从最开始对测试一无所知,到对测试框架的理解,再到对被测对象(web 服务)的深入学习,完成了一次提升。整个过程慢慢揭开了一次源码+原理之旅。itest是老大叶渡开发的,其架构在单元测试和web测试之上,通过模拟服务(web服务)的运行环境做service test和web test。其扩展了单元测试框架junit,依赖于spring的服务配置管理,高层支持web服务测试,底层与数据库交互。我基本了解了在junit做扩展的机制,体会到java annotation和反射机制的灵活;另外,完成开源web框架支持用例过程中,了解到web服务中请求的发起、处理、返回的机理及运行上下文环境的构建。

第二项是做Aifly项目的预研。项目主要关注的是用java技术完成前端页面测试。我做的事情是调研已有的web页面测试框架在不启动浏览器的方式下完成一些测试用例。我之前在前端技术上的积累非常有限,尤其头疼的是JavaScript技术。这个异常灵活而形式纷繁的技术为各个浏览器演绎得各有千秋,产生了为前端工程师最为关注的兼容性问题。现有的页面测试框架一般都基于各个浏览器实现各自的方案,彼此不能统一。在不启动浏览器的方式下,主流的是使用一个“通用”的JS引擎来执行页面中的JS代码。而这里的“通用”实在是能力有限。面对这种境遇,我选择了解尝试的态度。了解JS的基本原理,尝试页面测试框架的基本功能。向项目组的师姐请教,向前端开发工程师寻求远程帮助,感受到公司里面同学般的互助和支持。真心祝福项目fly~

一个阶段很难判断自己的变化,但确实在变化。相信这次经历今后回想起来,感恩于其中的成长。

实习一周

到杭州有一个星期了,开始一次预工作的旅程。一个陌生的环境,一群未曾谋面的人,我默默地让自己知道一个从零开始的含义。

周末到的杭州。坐在大巴车里,听着一个杭城的节目。这次听到的话题是“放弃”,而主持人谈论的内容确是不要放弃,这题恰合了我的心境。不放弃工作,不放弃感情,不放弃追求,不放弃自己。不放弃收听电台。不该放弃的东西太多太多,现在只记得主持人说:如果一个男人在二十岁的时候不帅,在三十岁的时候不强壮,在四十岁的时候不富有,在五十岁的时候不智慧,那就真的该放弃了。

我下了大巴,来到的车站是一个分站,不是上次的那个,一种陌生迎面而来。走到公交站台寻找熟悉的名字,匹配头脑里面那张刚刚收录的地图。少了一分无知的兴奋,多了一分成长的惆怅。打的、旅店、入住、室友。

开心的是室友还是校友,上帝还给我们安排了一次默契的见面礼:我们穿了完全一样的T恤衫!呵呵,异乡的亲切~

周一到公司报到,我们一群人调研不足,随便拍拍脑袋找线路,吃过早饭,搭上备选线路。花了35分钟公交+15钟步行,总算没有迟到。我们一群Parttimer遇到上了Parttime HR,不熟悉啊不熟悉,凑合着把合同签了。后面是主管接人,我正顾虑着老大是不是还在度假,却听到了我的名字。终于见到老大了,和我预计的差不多,30左右,沉稳、智慧。

老大很快给我安排了一周工作,也就是这个成了一个纠结的开始。我很快搭建了工作环境,第一个任务看起来是那样容易。我忽略的是任务背后的复杂性,公司系统不是玩具,牵扯到安全,业务需求,隐藏了很多完全不懂的东西。问题是什么,一下子成了最棘手的问题。

第一周认识最深刻的教训是,事情没有想象的那样简单,自己所知道和掌握的东西非常有限。是的,承认无知才是学习的开始,是成长的开始。老大对我遇到的问题明确答复不会给予直接帮助:别人告诉你的,只是学到知识,解决问题的能力得不到提高;完成任务不是目的,学习和思考解决方法才是真正的锻炼。

明天又要去面对那个看似简单到让人抓狂的问题。哈哈,我愿意继续与你磨蹭。但愿能从你身上挖掘出真正的解决之道!