李开复博士的创新工场开始在全国范围内招聘了。今天下午李开复来到我们华中科技大学,由于粉丝太多,讲座地点也临时从8号楼换到1号楼,我在考察情况之后最终还是选择放弃。

看了创新工场在中大站的笔试题,第一题是把一串英文句子按单词反序输出,如:"good moring" -> "moring good"。题目不难,应该考察的是算法的高效性,我用链表简单实现了,也没太过于考虑算法的效率,不过还是贴出来和大家分享吧。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

typedef struct StringList
{
char word[20];
struct StringList *next;

}slist;

slist * revert(char* str)
{
char p[20]="";
char temp;
slist *sl;
slist *head = (slist *)malloc(sizeof(slist));
head->next = NULL;
if (str[strlen(str)-1] != ' ')  {
str[strlen(str)] = ' ';
str[strlen(str)+1]='\0';
}
for (;*str!='\0';str++)
{   int i = 0;
if (*str == ' ') {
sl = (slist *)malloc(sizeof(slist));
memset(sl->word,'\0',20);
for (;i<strlen(p);i++)
{
sl->word[i]=p[i];
}
sl->next = head->next;
head->next = sl;
memset(p, '\0', 20);
continue;
}
temp = *str;
p[strlen(p)]=temp; /*在这里用strcat(p, &temp)会局部出现乱码*/
}
return head;
}

void main()
{

char a[] = "you are how";
slist * p = (slist *)revert(a);
for (; p != NULL; )
{
p = p->next;
if (p!=NULL)
printf("%s ", p->word);
}
getch();
return;
}



Comments
omycle on 十一月 2nd, 2009 at 3:49 下午 #

用STL里面的reverse更简洁 :P

[ 引用 ]
superhaiou on 十一月 2nd, 2009 at 5:52 下午 #

一般不推荐用库函数滴~

[ 引用 ]
很好很QD on 十一月 17th, 2009 at 11:03 下午 #

我想到的办法是:先将每个单词按字母反序,再将整个句子按字母反序,这样可以在线性时间复杂度内完成,且不需要额外的存储空间。比如Good Morning:
\n要有两个整数变量记录单词的开始和结束位置,逐个字母地扫描整个句子,每扫到一个空格就定位了这两个位置,然后利用“从两边夹到中间”交换的办法就可以把每个单词里的字母反序,于是成了这样:
\ndooG gninroM
\n最后,对整个句子作首尾交换的操作,就得到最终结果:
\nMorning Good

[ 引用 ]
superhaiou on 十一月 19th, 2009 at 10:32 上午 #

很好很QD 在 十一月 17, 2009 11:03 下午 说到:

我想到的办法是:先将每个单词按字母反序,再将整个句子按字母反序,这样可以在线性时间复杂度内完成,且不需要额外的存储空间。比如Good Morning:
\n要有两个整数变量记录单词的开始和结束位置,逐个字母地扫描整个句子,每扫到一个空格就定位了这两个位置,然后利用“从两边夹到中间”交换的办法就可以把每个单词里的字母反序,于是成了这样:
\ndooG gninroM
\n最后,对整个句子作首尾交换的操作,就得到最终结果:
\nMorning Good

最简单的就是从后往前读~~

[ 引用 ]
kumbayaco on 十一月 28th, 2009 at 2:56 下午 #

用递归就好了

reverse(char* str)
{
if (*str == 0) return;
reverse(str+1);
printf("%c", *str);
}

[ 引用 ]
superhaiou on 十一月 28th, 2009 at 6:01 下午 #

算法题有几个人会用递归~

[ 引用 ]
cesc jiang on 十二月 29th, 2009 at 9:58 上午 #

先分词用spilt函数 然后用stack,最后取出也可以的

[ 引用 ]
Post a comment
Name: 
Email: 
URL: 
Comments: