今天面试的一道算法题,求教

2018-03-21 22:27:09 +08:00
 RicardoScofileld

需求是从数组 N 中获取长度为 M 的集合 example N = [1,2,3,4,5] M=3, 那么输出为 [{1,2,3}{1,2,4},{1,2,5},{2,3,4},{2,3,5}{3,4,5}]

9323 次点击
所在节点    Python
54 条回复
pyufftj
2018-03-22 08:09:06 +08:00
@264768502 哈哈,当时面试的时候我也有类似的经历。当时让我统计某种特征最多的几个数,我当时使用 Counter 库,两行代码搞定,面试官都蒙了。不过肯定是让你实现底层代码,这样做面试官肯定不满意吧
Hopetree
2018-03-22 08:54:05 +08:00
为什么不是 [{1, 2, 3}, {1, 2, 4}, {1, 2, 5}, {1, 3, 4}, {1, 3, 5}, {1, 4, 5}, {2, 3, 4}, {2, 3, 5}, {2, 4, 5}, {3, 4, 5}]
rebeccaMyKid
2018-03-22 08:59:28 +08:00
@Hopetree 对啊,怎么才这么几个呀。我都准备贴代码了
rebeccaMyKid
2018-03-22 09:07:53 +08:00
faceRollingKB
2018-03-22 09:26:37 +08:00
简单想下,数组 N 长度 M 的集合 Arr(N)*L(M)=n1*Arr(N-n1)*L(M-1)+Arr(N-n1)*L(M)
一个递归甩上去呗
crane2018
2018-03-22 09:55:33 +08:00
就是说输出结果数组的 index 顺序还要满足源数组的 index 大小顺序,而且输出结果数组的前两个数在源数组中相邻,and that's all
cs5791393
2018-03-22 09:55:50 +08:00
用递归写个循环不就能解决了吗
di94sh
2018-03-22 10:17:00 +08:00
``` python
def combination(numlist, m, low=0):
if m==0:
yield []
else:
for i in range(low, len(numlist)):
for rest in combination(numlist, m - 1, i + 1):
yield [numlist[i]] + rest

def combinations(numlist, m):
return list(combination(numlist, m))
numlist = [1, 2, 3, 4, 5]
print(combinations(numlist, 3))
```
di94sh
2018-03-22 10:26:14 +08:00
UnknownR
2018-03-22 10:40:26 +08:00
@rebeccaMyKid 一点显示 gist 代码,chrome 就卡成狗。。。滚屏特别卡
mathzhaoliang
2018-03-22 10:52:06 +08:00
@di94sh 递归的话效率不高,而且 python 里面有层数限制。
kkzxak47
2018-03-22 12:28:58 +08:00
@neoblackcap

题目的输出样例是摆看的吗?
{1,2,3}{1,2,4},{1,2,5},
{2,3,4},{2,3,5}
{3,4,5}
为什么一旦题设不符合你的思维定势,就无所适从,真的不能稍微多想一点点吗?
yao978318542
2018-03-22 12:33:08 +08:00
<?php
//悄悄的进村---------
$a=array(1,2,3,4,5);
$num=count($a)-1;
foreach($a as $key=>$b){
$x=$key+1;
foreach($a as $key2=>$c){
$y=$x+1;
if($x<=$num) {
foreach ($a as $d) {

if ($y <= $num) {

$aaa[]=array($b, $a[$x], $a[$y]);
}
$y++;
}
}
$x++;
}
}
print_r($aaa);die();
?>
dcalsky
2018-03-22 12:48:45 +08:00
neoblackcap
2018-03-22 13:30:01 +08:00
@kkzxak47

1. 你的推测只是你个人推测,并没有实据,编程是科学。所谓的找规律,我能找更多的满足题意但是是其他的规律。难道不可能推测最后一个元素限定是[3,4,5]这三个数字中的一个?
2. 你推测有额外的规则就是正常,难道我就不能推测题目有问题?这样就思维定式了?就算是面试也是允许询问的。题是人出的就会有错,这很正常的事情。
kkzxak47
2018-03-22 15:40:33 +08:00
@neoblackcap 目瞪狗呆。你赢了啊,八辈子都赢了。
shihty5
2018-03-22 16:05:55 +08:00
@RicardoScofileld 楼主快出来把题目说清楚
liqueur
2018-03-22 16:49:30 +08:00
N = [1, 2, 3, 4, 5]
M = 3
'''
output = [{1,2,3}{1,2,4},{1,2,5},{2,3,4},{2,3,5}{3,4,5}]
'''

output = []

for ix, x in enumerate(N):
for iy, y in enumerate(N[ix + 1:]):
for iz, z in enumerate(N[iy + 1:]):
if(y - x) == 1 and z > y:
output.append({x, y, z})

print(output)
liqueur
2018-03-22 16:50:15 +08:00
@liqueur 哇 v2 的代码支持不行啊
zacard
2018-03-22 17:16:32 +08:00

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/440230

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX