首页
社区
课程
招聘
[原创]刘涛涛的面试题
发表于: 2010-8-28 17:18 28825

[原创]刘涛涛的面试题

2010-8-28 17:18
28825
想起被W哥拒绝和被S哥无情地忽视,真是很伤心
既学不成国际一流的做壳技术,也学不成国际一流的解密技术,世上还有什么事能让人快乐呢?从此之后,我便郁郁寡欢,整日在网上闲逛。

一日,我无意间访问到我国著名程序员刘涛涛的blog,逐一阅读其博文之后,深感佩服,让我印象最深的要数“扭曲变换加密”与“哈巴雪山-帐篷事件”,两篇文章让人感受到前辈技术和人格上的魅力。除此之外,我还在另外一篇文章中看到了他出的一道面试题目,引用原文片段如下

我出的一道测试题,在此公布,没有版权,随便转抄:有一个字符串,里面包含一些数字,写一个函数,把这些数字加起来。比如“我30你40他50”结果就是120。就是这么一道题,来面试程序员的本科毕业生,有超过60%做不出来!

现在的大学生,真是不得了。就这水平也敢来应聘程序员。有时我就问他们,大学四年都干什么了,读书了?没有。学专业了?没有。泡女朋友了?没有。这就奇怪了,你大学这几年到底干了点什么呢?原来是打电脑游戏了!


看了刘涛涛前辈的话,我感到压力很大,在大学这几年,每天早上我都用父母给的钱在学校吃一根油条两个鸡蛋,现在我发现居然什么都没在大学里学到,书没读过几本,专业课一塌糊涂,女朋友也没谈过,最悲剧的是,电脑游戏我也很少玩

为了毕业以后仍然能每天早上吃上一根油条两个鸡蛋,我决定从解此题开始努力学习,在知识的海洋里奋勇遨游了十几个来回之后,我总算是做出了这道题目的基本解法
#include<stdio.h>
#include<string.h>
#include<stdlib.h>

void mystrrev(unsigned char* s);
void add(char *s1,const char *s2);

int main(int argc,char *argv[])
{
	
	const char* szStr = NULL;
	const char* locate = NULL;
	unsigned char szSum[101];
	unsigned char szTemp[101];
	if(argc != 2)
		return -1;
	szStr = argv[1];
	memset(szSum,0,101);
	while((szStr = strpbrk(szStr,"0123456789")) != NULL)
	{
		locate = szStr;
		while(*locate >= 0x30 && *locate <= 0x39)
			++locate;
		memset(szTemp,0,101);
        strncpy(szTemp,szStr,locate - szStr);
		mystrrev(szSum);
		mystrrev(szTemp);
		add(szSum,szTemp);
		mystrrev(szSum);
		szStr = (const char*)(locate + 1);
	}
    printf("the sum is:%s\n",szSum);
	system("pause");
	return 0;
}

void mystrrev(unsigned char* s)
{
	char *p = NULL;
	char i = strlen(s);
	p = calloc(1,i + 1);
	if(p == NULL)
	{
		printf("strrev:fatal error!\n");
		return;
	}
	while(--i >= 0)
	{
		*(p++) = *(s + i);
	}
	p -= strlen(s);
	memset(s,0,strlen(s) + 1);
	strcpy(s,p);
	free(p);
}

void add(unsigned char *s1,const unsigned char *s2)
{
    while(*s1 != 0 && *s2 != 0)
	{
		*s1 = ( ((*s1) - 0x30) + ((*s2) - 0x30) );
		if(*s1 >= 10)
		{
			if(*(s1 + 1) != 0)
			    *(s1 + 1) = ((*(s1 + 1) - 0x30) + 1) + 0x30;
			else
				*(s1 + 1) = 0x31;
			*s1 %= 10;
		}
		*s1 += 0x30;
		++s1;
		++s2;
	}
	while(*s2 != 0)
	    *(s1++) = *(s2++);

}

用一个bat来启动程序进行测试
@echo off
test.exe 你54839865486548650468054658847397577599他554238599778899934566666666666666666666999999999999999999999999我8888888888888888888888888888888888888
得到如下的结果

和Google计算器对比一下


总结:
有一个字符串,里面包含一些数字,写一个函数,把这些数字加起来。

刘涛涛前辈的这个题目,看似很简单,实际不是很简单。他只说了包含一些数字,但并没有说正数还是负数,整数还是浮点数,我的答案只能够计算一定位数的正整数的情况,看来要找一份程序员的工作真不容易
惟有用诗人屈原的话自勉:路漫漫其修远兮,吾将上下而求索!

[课程]FART 脱壳王!加量不加价!FART作者讲授!

上传的附件:
  • 1.jpg (19.32kb,2450次下载)
  • 2.jpg (54.39kb,2454次下载)
收藏
免费 7
支持
分享
最新回复 (47)
雪    币: 6075
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
2
In [1]: s = '你54839865486548650468054658847397577599他5542385997788999345666666
66666666666666999999999999999999999999我8888888888888888888888888888888888888'

In [2]: import re

In [3]: sum(map(int, re.findall('-*\d+', s)))
Out[3]: 554238599778899934566666730395421042104539356943547736286466486L

2010-8-28 17:35
0
雪    币: 391
活跃值: (135)
能力值: ( LV2,RANK:140 )
在线值:
发帖
回帖
粉丝
3
f哥,小弟只会简单的C和汇编,请问你用的是什么语言啊?
2010-8-28 17:36
0
雪    币: 6075
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
4
python2.7,好在题目没规定用c
2010-8-28 17:39
0
雪    币: 391
活跃值: (135)
能力值: ( LV2,RANK:140 )
在线值:
发帖
回帖
粉丝
5
python真是一门强大的语言,看来我要学习的还有很多
2010-8-28 17:42
0
雪    币: 278
活跃值: (709)
能力值: ( LV15,RANK:520 )
在线值:
发帖
回帖
粉丝
6
可怜的孩子啊
2010-8-28 20:26
0
雪    币: 7
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
forgot大哥,你用的是ipython吧
2010-8-28 20:38
0
雪    币: 60
活跃值: (1010)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
还真不会做啊!
2010-8-28 22:27
0
雪    币: 156
活跃值: (26)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
9
这很像那种简单的字符串处理的ACM题……
另外话说我一看到高精度算术就头疼……
2010-8-28 22:53
0
雪    币: 346
活跃值: (1953)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
10
还以为printf 30+40+50=120呢
2010-8-29 00:40
0
雪    币: 391
活跃值: (135)
能力值: ( LV2,RANK:140 )
在线值:
发帖
回帖
粉丝
11
唉,就是呀,w哥和s哥都不理我,相当的可怜
2010-8-29 10:12
0
雪    币: 1708
活跃值: (586)
能力值: ( LV15,RANK:670 )
在线值:
发帖
回帖
粉丝
12
s哥是谁?
2010-8-29 10:54
0
雪    币: 1022
活跃值: (31)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
13
对于字符串还要考虑编码的问题吧,除非题目有默认是ANSI的编码。
先应该检测字符串的编码,然后根据相应的编码来确定哪些是数字。
2010-8-29 11:07
0
雪    币: 391
活跃值: (135)
能力值: ( LV2,RANK:140 )
在线值:
发帖
回帖
粉丝
14
s哥是sessiondiy啦



我很赞同,所以我说刘涛涛前辈的这道题目看似简单,实则包含好几个问题
2010-8-29 12:04
0
雪    币: 2323
活跃值: (4113)
能力值: ( LV12,RANK:530 )
在线值:
发帖
回帖
粉丝
15
果然牛人到处都是啊~~
2010-8-29 14:35
0
雪    币: 326
活跃值: (88)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
16
两行的来了,纯属娱乐
python2.5

s = '你54839865486548650468054658847397577599他554238599778899934566666666666666666666999999999999999999999999我8888888888888888888888888888888888888'

sum(map(int,"".join(x*x.isdigit()+(not x.isdigit())*" " for x in s ).split()))
2010-8-29 19:40
0
雪    币: 367
活跃值: (20)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
17
楼主的题就是搜索数字(遇到数字开始,非数字结束),然后相加.
楼主的代码太没效率了..
2010-8-29 22:51
0
雪    币: 247
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
话说地球人就是强。
2010-8-29 23:08
0
雪    币: 6075
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
19
继续娱乐
sum(map(int, ''.join(x if x.isdigit() else ' ' for x in s).split()))
2010-8-29 23:11
0
雪    币: 6075
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
20
[QUOTE=forgot;852494]继续娱乐
sum(map(int, ''.join(x if x.isdigit() else ' ' for x in s).split()))
[/QUOTE]

继续娱乐
sum(map(int, __import__('re').findall('-*\d+', s)))
2010-8-30 02:04
0
雪    币: 440
活跃值: (119)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
21
向牛人学习~~~
2010-8-30 09:44
0
雪    币: 260
活跃值: (11)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
22
atoi
2010-8-30 12:56
0
雪    币: 208
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
这题的本意不是搜索数字的方法,主要考N个大数相加的算法.........
2010-8-30 14:58
0
雪    币: 354
活跃值: (157)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
24
问一句:楼主用的是何编译器?
2010-8-30 20:15
0
雪    币: 354
活跃值: (157)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
25
在vc++ 6.0下将代码中所有unsigned去掉,编译链接通过
楼主果然强大,不知现在就业否,鄙人学习了
2010-8-30 20:26
0
游客
登录 | 注册 方可回帖
返回
//