yxCoding

I am a coder

终于做了点有意义的事

这么几个月的辛苦努力没有白费,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已经不是一种坚持了,它已经变成了习惯。

看到一道Google的面试题

题目是这样的:写程序判断是否字符串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。

继续阅读

Crazy Faint

号称是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。
初看此题,觉得挺好理解。如果不满足时空复杂度,这道题非常简单。这道题的关键就在于如何优化时空复杂度。
对于每个元素的最终位
置可以用如下这个公式来计算.

  1. //For an element a[i], its new place will be i>=n/2?(i-n/2)*2+1:2*i
  2. int new_pos ( int i, int n ) {
  3. %nbsp printf ( "%d->%d \n " , i, i>=n/ 2 ? ( i-n/ 2 ) * 2 +1 : 2 *i ) ;
  4. %nbsp return i>=n/ 2 ? ( i-n/ 2 ) * 2 +1 : 2 *i;
  5. }

继续阅读

算法:下落的金字塔小球

题目是这样的:题目大概是这样的,一个金字塔,它的每个位置都有一个数字(如下图所示),顶端有一个小球,小球下落时经过任何位置都是等概率的。现在要求的是小球从顶端下落到低端的路径中,数字和最大的路径


我的解法是用%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)

继续阅读

Waiting....

等待的时间真是难熬。。。Good Luck!

简单来说

深度优先搜索用递归实现

  • 输出当前结点
  • 对于当前结点的所有子结点,依次递归运用深度优先搜索

广度优先搜索用队列实现

  • 将起始结点入队列
  • 循环(队列非空)
    • 取出一个结点
    • 输出结点内容
    • 将此结点的所有子结点入队列

继续阅读