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

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}]

9349 次点击
所在节点    Python
54 条回复
juicy
2018-03-22 17:24:18 +08:00
题目只有一条测试用例么,那一句 if..else..就可以了。。
sikariba
2018-03-22 17:59:03 +08:00
坐等楼主出来改题目
yidinghe
2018-03-22 18:59:29 +08:00
我这刚好昨天写了个组合遍历:
https://segmentfault.com/a/1190000013899418

虽然语言是 Java,但思路写在里面了:通过将解集看作树节点来遍历,而不是递归,可以做到:

1. 内存使用较小,因为只存储一个解;
2. 因为是在遍历树节点,所以可以从任何一个解开始遍历,或者叫“断点续历(?)”
3. 通过对树节点进行分派,可以实现多线程并发遍历。
MeteorCat
2018-03-22 19:02:11 +08:00
暴力穷举,无需动脑,上去就是莽
wwww961h
2018-03-22 19:19:58 +08:00
直接随机数组下标,然后排除重复,走 1000 次,不怕出不来,
Betsy
2018-03-22 20:25:22 +08:00
阿里的实习面试?
cs5791393
2018-03-23 08:53:13 +08:00
swfit

func arrangement(index: Int, arr: Array<String>) {
for i in index ... list.count-1{
let newArr = arr + [list[i]]
if newArr.count >= m{
print(newArr)
}else if i+1 < list.count{
arrangement(index:i+1,arr: newArr)
}
}
}
lepig
2018-03-23 09:17:55 +08:00
楼主放完题 就不来关注回复了。 简直没诚意请教。楼下都散了吧
zhijian
2018-03-23 10:27:48 +08:00
c#代码:

private static void Main(string[] args)
{
var m = new List<int> {1, 2, 3, 4, 5};
var result = new List<string>();
GetResult(m, ref result);
Console.Read();
}

private static void GetResult(List<int> m, ref List<string> result)
{
for (var i = 0; i < m.Count - 2; i++)
{
for (var k = i + 2; k < m.Count; k++)
{
result.Add(string.Format("{0},{1},{2}", m[i], m[i + 1], m[k]));
}
}
}
titachi
2018-03-23 11:39:33 +08:00
```python
def req(seq, m, idx=1):
n = len(seq)
sidx = idx - 1
eidx = m + sidx - 1
if m > n or n - sidx < m:
raise '大于 list 长度'
l, t = [], []
while eidx < n:
for i in seq[eidx:]:
l = seq[sidx:eidx]
l.append(i)
t.append(l)
sidx = sidx + 1
eidx = eidx + 1
return t


if __name__ == '__main__':
print(req([1, 2, 3, 4, 5], 3))

```
xpresslink
2018-03-23 17:59:51 +08:00
这么简单的一道题还用这么费劲。
算法是:
( 1 )取列表前两个元素依次和剩余每个元素组合
( 2 )递归下一次,列表取第一个元素后面部分按步骤( 1 )执行
( 3 )结束条件:列表剩三个元素直接返回列表

def solution(n, m):
□□□□if len(n) == m:
□□□□□□□□return [n]
□□□□else:
□□□□□□□□return [n[:2] + [i] for i in n[2:]] + solution(n[1:], m)

N=[1,2,3,4,5]
M=3

print(solution(N, M))
# [[1, 2, 3], [1, 2, 4], [1, 2, 5], [2, 3, 4], [2, 3, 5], [3, 4, 5]]
xpresslink
2018-03-23 18:08:31 +08:00
上面的给写死了,应该是按 M 可以变的
https://paste.ubuntu.com/p/jtnHCJmFp5/

def solution(n, m):
□□□□if len(n) == m:
□□□□□□□□return [n]
□□□□else:
□□□□□□□□return [n[:m-1] + [i] for i in n[m-1:]] + solution(n[1:], m)

N=[1,2,3,4,5]
M=3

print(solution(N, M))
# [[1, 2, 3], [1, 2, 4], [1, 2, 5], [2, 3, 4], [2, 3, 5], [3, 4, 5]]
RicardoScofileld
2018-03-25 21:59:29 +08:00
@acros 135 是可以的 我没列出来 就是数学中的组合
RicardoScofileld
2018-03-25 22:04:57 +08:00
@lepig 抱歉 这两天有事都没上

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

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

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

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

© 2021 V2EX