热搜:NVER node 开发 php

分享今天面试的三道题

2024-09-04 15:25:01
分享今天面试的三道题

面试题

公司名不说了。

一、模拟扑克发牌,有52张扑克牌,我们给它编号,从1,2,3...52。一共52张牌。请使用数组装载这些牌,然后再打乱顺序输出。比如:43,2,18,21...3。


二、公司要和QQ合作,提供接口给QQ,会发QQ号过来。请帮忙检测QQ好嘛的规则。如4323254,规则为:ABAB。5723723,规则为ABCABC。


三、假如我们现在要记录下网站中每一个flash小游戏被玩过多少次,每个游戏在一个单独的页面。
(a)请问在玩这些游戏的时候如何记录数据?
(b)如果计算出每个游戏被玩过多少次?(如果使用数据库的话,请写出SQL)


第二题我没答出来。请教下如何实现那个需求。

题量还不错,就三道,不过这些题考的貌似没啥针对性,比那些一写就要写2小时的好多了。

回复讨论(解决方案)

第二题思路:
对于每个qq,判断qq的前缀和后缀。树的长度从0 - strlen/2
如4323254
索引0开始的:
1位前缀:4,后缀3  不等
2位前缀:43 后缀23 不等
3位前缀的:432后缀325 不等
。。。

索引1开始的:
2前缀32 后缀32相等

计算长度最大的即可

$qqNs = array("4323254","22222","5123123","23412341234","2222222");$str = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";foreach($qqNs as $tmp){	$max = 1;	$qq = $tmp;	while($qq){		for($i=1,$n = floor((strlen($qq)/2));$i <= $n;$i++){			$preTree = substr($qq, 0, $i);			$postTree = substr($qq,$i,$i);			if($preTree == $postTree){				if($i>=$max){					$max = $i;				}			}		}		$qq = substr($qq,1);	}	echo $tmp.":  ".substr($str,0,$max)."
";

结果:
4323254: AB22222: AB5123123: ABC23412341234: ABCD2222222: ABC

第二题
如果不是考算法,也可以简单的用正则反向引用:

$qqNs = array("4323254","22222","5123123","23412341234","2222222");$preg = "/(\d+)(\\1)/";foreach($qqNs as $qq){	if(preg_match($preg,$qq,$res)){		echo $qq.":".substr($str,0,strlen($res[1]))."
"; }}

感谢楼上!!看了你的思路瞬间懂了!


1 索引从1开始,与索引0的做比较,如果相同,匹配向量自增。
2 拿索引0和索引1相连。与索引2与索引3相连的值进行比较,如果相等,匹配向量再自增。
3 如此循环下去到整个QQ号字符串的一半。得到最大自增向量。

最后从字符串数组的头部出栈,再按上述流程计算一遍。。。


不知各位还有其他算法吗?

嗯,当时第一反应就是正则,不过考虑到他出这题应该是考算法。确实没想出来。

不至于吧?全是基础题,不要自己为难自己
一、

$ar = range(1, 54);shuffle($ar);print_r($ar);


二、用正则(既然第一题是基础,那么第二题也不会有过高的要求)
$qq = array('4323254', '5723723');$p = array('/.*(\d\d)\\1.*/', '/.*(\d\d\d)\\1.*/');$r = array('ABAB $0', 'ABCABC $0');$t = preg_replace($p, $r, $qq);print_r($t);
Array
(
[0] => ABAB 4323254
[1] => ABCABC 5723723
)

不至于吧?全是基础题,不要自己为难自己
一、

$ar = range(1, 54);shuffle($ar);print_r($ar);


二、用正则(既然第一题是基础,那么第二题也不会有过高的要求)
$qq = array('4323254', '5723723');$p = array('/.*(\d\d)\\1.*/', '/.*(\d\d\d)\\1.*/');$r = array('ABAB $0', 'ABCABC $0');$t = preg_replace($p, $r, $qq);print_r($t);
Array
(
[0] => ABAB 4323254
[1] => ABCABC 5723723
)
这样的只能固定的号码里弄,如果不固定的,那就没法了

公司名不说了。

一、模拟扑克发牌,有52张扑克牌,我们给它编号,从1,2,3...52。一共52张牌。请使用数组装载这些牌,然后再打乱顺序输出。比如:43,2,18,21...3。


二、公司要和QQ合作,提供接口给QQ,会发QQ号过来。请帮忙检测QQ好嘛的规则。如4323254,规则为:ABAB。5723723,规则为ABCABC。


三、假如我们现在要记录下网站中每一个flash小游戏被玩过多少次,每个游戏在一个单独的页面。
(a)请问在玩这些游戏的时候如何记录数据?
(b)如果计算出每个游戏被玩过多少次?(如果使用数据库的话,请写出SQL)


第二题我没答出来。请教下如何实现那个需求。

题量还不错,就三道,不过这些题考的貌似没啥针对性,比那些一写就要写2小时的好多了。


第二题是什么意思 AB ABC?怎么我看不懂

在#1代码上扩充一下

$qqs = array('2343232', "4323254","22222","5123123","23412341234","2222222", '123456789');foreach($qqs as $qq) {  $len = strlen($qq);  $t = array();  echo "qq: $qq:: ";  for($i=0; $i<$len; $i++) {    if(($j = strpos($qq, $qq{$i}, $i+1)) != false) {      if(($p=substr($qq, $i, $j-$i)) == substr($qq, $j, $j-$i)) $t[] = $p;      while($j<$len-1 && $qq{$i} == $qq{++$j}) $t[] = substr($qq, $i, $j-$i+1);    }  }  usort($t, function($a, $b) { return strlen($b) - strlen($a); });  $t = current($t);  echo $d = 'A';  for($i=1; $iqq: 2343232:: AB  
qq: 4323254:: AB
qq: 22222:: AAAAA
qq: 5123123:: ABC
qq: 23412341234:: ABCD
qq: 2222222:: AAAAAAA
qq: 123456789:: A 连续号码,留着你自己扩展吧

第三题flash和php通信,要在flash那边传参数过来才行。

什么是“只能固定的号码里弄”?

这样的只能固定的号码里弄,如果不固定的,那就没法了

第二题是指数字中有连续重复循环的现象,就像循环小数那种:4 323254和5 723723
同理随便几个例子:87 42342398,74 914891489134

什么是“只能固定的号码里弄”?


这样的只能固定的号码里弄,如果不固定的,那就没法了
打个比方,用你的那个正则的形式如果再来一个222222的号码,那就不正确了,不可能说来一个号码加一个规则的

$qq = array('4323254', '5723723', '222222');$p = array('/.*(\d\d)\\1.*/', '/.*(\d\d\d)\\1.*/');$r = array('ABAB $0', 'ABCABC $0');$t = preg_replace($p, $r, $qq);print_r($t);

Array
(
[0] => ABAB 4323254
[1] => ABCABC 5723723
[2] => ABCABC ABAB 222222
)
有什么不对吗?

$qq = array('4323254', '5723723', '222222');$p = array('/.*(\d\d)\\1.*/', '/.*(\d\d\d)\\1.*/');$r = array('ABAB $0', 'ABCABC $0');$t = preg_replace($p, $r, $qq);print_r($t);

Array
(
[0] => ABAB 4323254
[1] => ABCABC 5723723
[2] => ABCABC ABAB 222222
)
有什么不对吗?
当然不对了
222222这个是属于AAAAAA的,怎么算是那2个格式?

222222 既符合 ABCABC 的规则,又符合 ABAB 的规则


什么是“只能固定的号码里弄”?


这样的只能固定的号码里弄,如果不固定的,那就没法了
打个比方,用你的那个正则的形式如果再来一个222222的号码,那就不正确了,不可能说来一个号码加一个规则的

222222 既符合 ABCABC 的规则,又符合 ABAB 的规则



什么是“只能固定的号码里弄”?


这样的只能固定的号码里弄,如果不固定的,那就没法了
打个比方,用你的那个正则的形式如果再来一个222222的号码,那就不正确了,不可能说来一个号码加一个规则的

还有如果只是22222呢?那你说他是ABAB形式?
那我只能说汗颜,无话可说

不错,但题目并没有给出相邻数相同的识别规则,当然就不需要单列了

考虑到一般的需求,所以我才有 #8 的代码


$qq = array('4323254', '5723723', '222222');$p = array('/.*(\d\d)\\1.*/', '/.*(\d\d\d)\\1.*/');$r = array('ABAB $0', 'ABCABC $0');$t = preg_replace($p, $r, $qq);print_r($t);

Array
(
[0] => ABAB 4323254
[1] => ABCABC 5723723
[2] => ABCABC ABAB 222222
)
有什么不对吗?
当然不对了
222222这个是属于AAAAAA的,怎么算是那2个格式?

题目是:
二、公司要和QQ合作,提供接口给QQ,会发QQ号过来。请帮忙检测QQ好嘛的规则。如4323254,规则为:ABAB。5723723,规则为ABCABC。

一般不应在题目之外附加条件吧?


还有如果只是22222呢?那你说他是ABAB形式?
那我只能说汗颜,无话可说

题目是:
二、公司要和QQ合作,提供接口给QQ,会发QQ号过来。请帮忙检测QQ好嘛的规则。如4323254,规则为:ABAB。5723723,规则为ABCABC。

一般不应在题目之外附加条件吧?




还有如果只是22222呢?那你说他是ABAB形式?
那我只能说汗颜,无话可说

那是你不理解题目而已

人家题目都说是任意的号码,后面2个后面只是打一个比方而已,并不是只是2个号码

第二题是指数字中有连续重复循环的现象,就像循环小数那种:4 323254和5 723723
同理随便几个例子:87 42342398,74 914891489134

原来是这样 谢谢你回答!

无论是多少的号码,但规则总是不变的。如果在一给定的条件之外增加自己臆想的条件,那就是蛇足了
考试嘛,按题意解答就是了


题目是:
二、公司要和QQ合作,提供接口给QQ,会发QQ号过来。请帮忙检测QQ好嘛的规则。如4323254,规则为:ABAB。5723723,规则为ABCABC。

一般不应在题目之外附加条件吧?




还有如果只是22222呢?那你说他是ABAB形式?
那我只能说汗颜,无话可说

那是你不理解题目而已

人家题目都说是任意的号码,后面2个后面只是打一个比方而已,并不是只是2个号码

无论是多少的号码,但规则总是不变的。如果在一给定的条件之外增加自己臆想的条件,那就是蛇足了
考试嘛,按题意解答就是了



题目是:
二、公司要和QQ合作,提供接口给QQ,会发QQ号过来。请帮忙检测QQ好嘛的规则。如4323254,规则为:ABAB。5723723,规则为ABCABC。

一般不应在题目之外附加条件吧?




还有如果只是22222呢?那你说他是ABAB形式?
那我只能说汗颜,无话可说

那是你不理解题目而已

人家题目都说是任意的号码,后面2个后面只是打一个比方而已,并不是只是2个号码

呵呵,那我无话可说,人家这题都声明了根据号码来找出号码的规则,并不固定,你却说那是自己臆测,自己加条件,当我啥都不懂,啥都没说吧

我比较好钻牛角

请帮忙检测QQ号码的规则

根据号码来找出号码的规则
是一个意思吗?

检测号码的规则,当然是根据已有规则做检测啦!

再说“根据号码来找出号码的规则”也应该是“根据号码来找出号码的 规律”呀




无论是多少的号码,但规则总是不变的。如果在一给定的条件之外增加自己臆想的条件,那就是蛇足了
考试嘛,按题意解答就是了



题目是:
二、公司要和QQ合作,提供接口给QQ,会发QQ号过来。请帮忙检测QQ好嘛的规则。如4323254,规则为:ABAB。5723723,规则为ABCABC。

一般不应在题目之外附加条件吧?




还有如果只是22222呢?那你说他是ABAB形式?
那我只能说汗颜,无话可说

那是你不理解题目而已

人家题目都说是任意的号码,后面2个后面只是打一个比方而已,并不是只是2个号码

呵呵,那我无话可说,人家这题都声明了根据号码来找出号码的规则,并不固定,你却说那是自己臆测,自己加条件,当我啥都不懂,啥都没说吧

我比较好钻牛角

请帮忙检测QQ号码的规则

根据号码来找出号码的规则
是一个意思吗?

检测号码的规则,当然是根据已有规则做检测啦!

再说“根据号码来找出号码的规则”也应该是“根据号码来找出号码的 规律”呀





无论是多少的号码,但规则总是不变的。如果在一给定的条件之外增加自己臆想的条件,那就是蛇足了
考试嘛,按题意解答就是了



题目是:
二、公司要和QQ合作,提供接口给QQ,会发QQ号过来。请帮忙检测QQ好嘛的规则。如4323254,规则为:ABAB。5723723,规则为ABCABC。

一般不应在题目之外附加条件吧?




还有如果只是22222呢?那你说他是ABAB形式?
那我只能说汗颜,无话可说

那是你不理解题目而已

人家题目都说是任意的号码,后面2个后面只是打一个比方而已,并不是只是2个号码

呵呵,那我无话可说,人家这题都声明了根据号码来找出号码的规则,并不固定,你却说那是自己臆测,自己加条件,当我啥都不懂,啥都没说吧

那你的意思就是说,先列出所有的进可能的规则,然后用号码去里面匹配就完了呗
呵呵

提供接口给QQ,会发QQ号过来。请帮忙检测QQ好嘛的规则

这句话应该很清楚,“请检测QQ好嘛的规则”
难道说规则已知?
那我确实愚昧了

既然是“检测规则”,自然是规则已存在了


我比较好钻牛角

请帮忙检测QQ号码的规则

根据号码来找出号码的规则
是一个意思吗?

检测号码的规则,当然是根据已有规则做检测啦!

再说“根据号码来找出号码的规则”也应该是“根据号码来找出号码的 规律”呀





无论是多少的号码,但规则总是不变的。如果在一给定的条件之外增加自己臆想的条件,那就是蛇足了
考试嘛,按题意解答就是了



题目是:
二、公司要和QQ合作,提供接口给QQ,会发QQ号过来。请帮忙检测QQ好嘛的规则。如4323254,规则为:ABAB。5723723,规则为ABCABC。

一般不应在题目之外附加条件吧?




还有如果只是22222呢?那你说他是ABAB形式?
那我只能说汗颜,无话可说

那是你不理解题目而已

人家题目都说是任意的号码,后面2个后面只是打一个比方而已,并不是只是2个号码

呵呵,那我无话可说,人家这题都声明了根据号码来找出号码的规则,并不固定,你却说那是自己臆测,自己加条件,当我啥都不懂,啥都没说吧

那你的意思就是说,先列出所有的进可能的规则,然后用号码去里面匹配就完了呗
呵呵

提供接口给QQ,会发QQ号过来。请帮忙检测QQ好嘛的规则

这句话应该很清楚,“请检测QQ好嘛的规则”
难道说规则已知?
那我确实愚昧了

第三题,可以在游戏开始时,去请求一个php页面,将消息发送至php页面,php页面再去记录玩家玩的信息,如果比如ID,昵称,时间等。也可以直接在flash端使用 socket方式与服务器的服务建立联系。

我记得flash中好像可以调用php页面中的js的,所以访问动态页面地址也是可以的吧。我之前做过flash与aspx页面的交互,做flash抽奖模块时。

动态页面端如果执行成功就write("success=1"),这时flash中一可以收到success的值,也可以不用在动态页面端输出这些字符串(若flash端不需要知道执行结果的情况)

既然是“检测规则”,自然是规则已存在了



我比较好钻牛角

请帮忙检测QQ号码的规则

根据号码来找出号码的规则
是一个意思吗?

检测号码的规则,当然是根据已有规则做检测啦!

再说“根据号码来找出号码的规则”也应该是“根据号码来找出号码的 规律”呀





无论是多少的号码,但规则总是不变的。如果在一给定的条件之外增加自己臆想的条件,那就是蛇足了
考试嘛,按题意解答就是了



题目是:
二、公司要和QQ合作,提供接口给QQ,会发QQ号过来。请帮忙检测QQ好嘛的规则。如4323254,规则为:ABAB。5723723,规则为ABCABC。

一般不应在题目之外附加条件吧?




还有如果只是22222呢?那你说他是ABAB形式?
那我只能说汗颜,无话可说

那是你不理解题目而已

人家题目都说是任意的号码,后面2个后面只是打一个比方而已,并不是只是2个号码

呵呵,那我无话可说,人家这题都声明了根据号码来找出号码的规则,并不固定,你却说那是自己臆测,自己加条件,当我啥都不懂,啥都没说吧

那你的意思就是说,先列出所有的进可能的规则,然后用号码去里面匹配就完了呗
呵呵

提供接口给QQ,会发QQ号过来。请帮忙检测QQ好嘛的规则

这句话应该很清楚,“请检测QQ好嘛的规则”
难道说规则已知?
那我确实愚昧了
跟你讨论没意义,如果是已知规则,人家就不需要叫你去检测,而是叫你写程序来匹配并且告诉你规则了
没必要跟你讨论这个下去,你喜欢钻文字牛角尖你就去钻吧

这道题纯粹就是考简单的算法而已,写一个简单的算法能检测任意一个号码的规则

这三道题

第一题主要考的是数组的运用
第二题考的是算法
第三题考的是flash与php的通信

第二题思路:
对于每个qq,判断qq的前缀和后缀。树的长度从0 - strlen/2
如4323254
索引0开始的:
1位前缀:4,后缀3 不等
2位前缀:43 后缀23 不等
3位前缀的:432后缀325 不等
。。。

索引1开始的:
2前缀32 后缀32相等

计算长度最大的即可

$qqNs = array("4323254","22222","5123123","23412341234","2222222");$str = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";foreach($qqNs as $tmp){	$max = 1;	$qq = $tmp;	while($qq){		for($i=1,$n = floor((strlen($qq)/2));$i <= $n;$i++){			$preTree = substr($qq, 0, $i);			$postTree = substr($qq,$i,$i);			if($preTree == $postTree){				if($i>=$max){					$max = $i;				}			}		}		$qq = substr($qq,1);	}	echo $tmp.":  ".substr($str,0,$max)."
";

结果:
4323254: AB22222: AB5123123: ABC23412341234: ABCD2222222: ABC




你好问一下里面的while($qq)怎么不是死循环啊


第二题思路:
对于每个qq,判断qq的前缀和后缀。树的长度从0 - strlen/2
如4323254
索引0开始的:
1位前缀:4,后缀3 不等
2位前缀:43 后缀23 不等
3位前缀的:432后缀325 不等
。。。

索引1开始的:
2前缀32 后缀32相等

计算长度最大的即可

$qqNs = array("4323254","22222","5123123","23412341234","2222222");$str = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";foreach($qqNs as $tmp){	$max = 1;	$qq = $tmp;	while($qq){		for($i=1,$n = floor((strlen($qq)/2));$i <= $n;$i++){			$preTree = substr($qq, 0, $i);			$postTree = substr($qq,$i,$i);			if($preTree == $postTree){				if($i>=$max){					$max = $i;				}			}		}		$qq = substr($qq,1);	}	echo $tmp.":  ".substr($str,0,$max)."
";

结果:
4323254: AB22222: AB5123123: ABC23412341234: ABCD2222222: ABC




你好问一下里面的while($qq)怎么不是死循环啊

...

每次循环完,$qq的位数都减一位,怎么会死循环啊?$qq = substr($qq,1);

他不是有 $qq = substr($qq,1); 吗?
每次去掉第一个字符,直到为空


第二题思路:
对于每个qq,判断qq的前缀和后缀。树的长度从0 - strlen/2
如4323254
索引0开始的:
1位前缀:4,后缀3 不等
2位前缀:43 后缀23 不等
3位前缀的:432后缀325 不等
。。。

索引1开始的:
2前缀32 后缀32相等

计算长度最大的即可

$qqNs = array("4323254","22222","5123123","23412341234","2222222");$str = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";foreach($qqNs as $tmp){	$max = 1;	$qq = $tmp;	while($qq){		for($i=1,$n = floor((strlen($qq)/2));$i <= $n;$i++){			$preTree = substr($qq, 0, $i);			$postTree = substr($qq,$i,$i);			if($preTree == $postTree){				if($i>=$max){					$max = $i;				}			}		}		$qq = substr($qq,1);	}	echo $tmp.":  ".substr($str,0,$max)."
";

结果:
4323254: AB22222: AB5123123: ABC23412341234: ABCD2222222: ABC




你好问一下里面的while($qq)怎么不是死循环啊
怎么会是死循环呢?
while的用法你了解么?
不过他这个算法写的有点?嗦而已



第二题思路:
对于每个qq,判断qq的前缀和后缀。树的长度从0 - strlen/2
如4323254
索引0开始的:
1位前缀:4,后缀3 不等
2位前缀:43 后缀23 不等
3位前缀的:432后缀325 不等
。。。

索引1开始的:
2前缀32 后缀32相等

计算长度最大的即可

$qqNs = array("4323254","22222","5123123","23412341234","2222222");$str = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";foreach($qqNs as $tmp){	$max = 1;	$qq = $tmp;	while($qq){		for($i=1,$n = floor((strlen($qq)/2));$i <= $n;$i++){			$preTree = substr($qq, 0, $i);			$postTree = substr($qq,$i,$i);			if($preTree == $postTree){				if($i>=$max){					$max = $i;				}			}		}		$qq = substr($qq,1);	}	echo $tmp.":  ".substr($str,0,$max)."
";

结果:
4323254: AB22222: AB5123123: ABC23412341234: ABCD2222222: ABC




你好问一下里面的while($qq)怎么不是死循环啊
怎么会是死循环呢?
while的用法你了解么?
不过他这个算法写的有点?嗦而已

呵呵,多谢

涉及到规则,一般都会有标准的争论。
#2要考虑对称的情况,比如445445,44554455,这些都应该是AB?

#3是一个高并发计数器+nosql的应用场景,how about nodejs+redis?

涉及到规则,一般都会有标准的争论。
#2要考虑对称的情况,比如445445,44554455,这些都应该是AB?
这种情况确实是忘记考虑了,#1的也忽略了2222这种应该是AAAA的规则。

flash如何与php通信呢?
第三道题没有人讨论吗?

第一道题,应该用链表最适合了。
还有很多其他的办法,但是都显得比较臃肿。

第二到题,没有好办法。、

第三道题,用js?

学习了

学到一个词 高并发计数器

用缓存来计数之后再存入数据库 这么简单的思路之前没想到 悲剧

flash如何与php通信呢?
第三道题没有人讨论吗?
1.利用页面刷新,存在session
2.借助xml通信

第二题反了吧,应该是QQ提供公共API,然外面的人调用。不然来一个公司就要响应一个接口,腾讯的人不累死,也不符合软件是设计思想

看这帖子我是明白了两点:
1.是都是从应试教育走过来的,考题贴不论题目难易,总能吸引相当多的人
2.是几十年来总算见到个比我脾气还犟的人,哈哈

第二题我想到的是,最小编辑距离,偶算法弱,就不参与讨论了

第二题,综合前面各位大大,简单写下,欢迎给意见

function gz($qq){    $len = strlen($qq);    $str = "ABCDEFG";    $ret = '无规则';    $first = substr($qq,0,1);    if($len==substr_count($qq,$first)) return 'AA';    for($i=0;$i';echo gz('6521218').'
';echo gz('8712312369').'
';echo gz('881881');


运行结果:
AAABABABCABCABCABC

看这帖子我是明白了两点:
1.是都是从应试教育走过来的,考题贴不论题目难易,总能吸引相当多的人
2.是几十年来总算见到个比我脾气还犟的人,哈哈

第二题我想到的是,最小编辑距离,偶算法弱,就不参与讨论了

不是很懂,知识学习学习

第二题我也没有想出来。。其他还好呢。如果仅是:4323254,规则为:ABAB。5723723,规则为ABCABC的话还是蛮简单。如果有33224556 AABB 22222 AAAAA的话就麻烦了

学习了,是很有用的面试方法,也是大家要学习的面试技巧。


C# 第一题