这么几个月的辛苦努力没有白费,paper终于发了,虽然不是第一作者,但是还是很开心,毕竟凝聚着我的心血,毕竟是AAAI的paper啊,哈哈。第一次做research就能发paper真是开心啊,再接再厉!不过怎么看自己都像一个developer,不像一个researcher。做开发才是我的兴趣所在,不过惭愧的是到如今也没写出什么像样的软件。学校快毕业了,工作还没有着落,苦闷啊。。
--再接再厉,再接再厉!
连接字符串A, B,但是要求把字符串A的尾部和B的头部重复的地方合并;
例如:
A: "12345"
B: "45678"
那么A+B = "12345678";
我第一个想法就是对A的每个位置都去检测剩下的是否和B可以合并,不过实现的效率很低O(strlen(A)*strlen(B)). 程序如下:
告别windows已经3个月了,虽然期间还时不时要用虚拟机来跑炮Word, Excel之类的。其实Word, Excel 也不用有一段时间了,但是基于负责的原则,帮别人改office文件的时候还是得用Office, 毕竟OpenOffice经常改出来会有问题。OpenOffice用起来实在是不顺手,操作性和MS Office简直没法比,所以我连OpenOffice现在也很少用了,一般记东西就用纯文本,要写论文就用Latex。
想起当初用Ubuntu的原因其实很简单,就是为了告别盗版软件,当时也是心血来潮加上以前折腾过Redhat, Gentoo。用了三个月的Ubuntu好像也没有特别需要Windows的地方(除了那个垄断的MS Office),几乎所有以前常用的东西在Linux都有高质量的替代品。而且Linux下也有一些我现在离不开的好东西,比如Quod Libet, Referencer...
再过20来天Ubuntu 8.04也要发布了,各方面的新闻很多,改进也很多,所以也很期待,不过当前我用的7.10也已经用的很爽了。其实很多人已经用上8.04了,不过我还不忍心当小白,还是等Release版吧。
现在用Linux已经不是一种坚持了,它已经变成了习惯。
题目是这样的:写程序判断是否字符串A里每个字符在A中出现的次数都大于在字符串B中出现的次数。
我的想法是
1. 首先我们可以发现,如果判断成立的话,A的长度必定要比B的长度长。
2. 因为字符char的大小有限,所以可以建立一个对应所有字符的数组,一般情况下应该是char chars[2^8], 初始化为0,然后先统计A串中所有出现的字符的个数。对于A的字符c,我们可以用chars[c]++来进行统计。在统计完毕之后,对于B的每个字符进行反向统计,即对于B中的字符c', 计算chars[c']--。若在对B的统计过程中,有某一chars[c']<=0,这说明对于字符c',它在B中出现的次数不比A中少,由此返回0, 若所有chars[c']均满足chars[c']>0,则返回1。
号称是Google的面试题:输入a_1, a_2, ..., a_n, b_1, b_2, ..., b_n,如何在O(n)的时间,用O(1)的空间,将这个序列顺序改为a_1, b_1, ..., a_n, b_n。
初看此题,觉得挺好理解。如果不满足时空复杂度,这道题非常简单。这道题的关键就在于如何优化时空复杂度。
对于每个元素的最终位
置可以用如下这个公式来计算.
题目是这样的:题目大概是这样的,一个金字塔,它的每个位置都有一个数字(如下图所示),顶端有一个小球,小球下落时经过任何位置都是等概率的。现在要求的是小球从顶端下落到低端的路径中,数字和最大的路径
我的解法是用%ldquo动态规划法%rdquo,用一个二维数组pyrimid表示当前的金字塔,在小球的下落过程中,对于每个位置pyrimid[i]][j],它的前一个位置只有两个选择pyrimid[i-1][j-1]或者pyrimid[i-1][j],因此我的算法就是依次计算每个位置的累计数字值,然后在最后一层选取最大的。下落路径可以一步一步反推回去,它的程序如下:
一个整数数组array, 在所有的子数组(从下标i到下标j)中最大的和,要求时间复杂度为O(n).
举个例子 int array[]={1, 4, -5, 9, -2, -5, 4, 1}, 最大的子数组和为9(从0~3或者4~4)
简单来说
深度优先搜索用递归实现
广度优先搜索用队列实现