需求是从数组 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}]
1
264768502 2018-03-21 22:57:41 +08:00 via Android
itertools groupby
|
2
siyemiaokube 2018-03-21 23:09:05 +08:00 via iPhone
排列组合都不会吗。。
|
3
siyemiaokube 2018-03-21 23:09:41 +08:00 via iPhone
一个数字标记数字的使用情况,然后搜索即可
|
4
264768502 2018-03-21 23:15:40 +08:00 via Android
itertools 的 combinations 就够了
|
5
acros 2018-03-21 23:18:08 +08:00 1
如果只能有序,为啥 1、3、5 不行?
|
6
xiaol825 2018-03-21 23:26:35 +08:00 1
itertools 的逻辑,可以参考下官方给的代码。
def combinations(iterable, r): # combinations('ABCD', 2) --> AB AC AD BC BD CD # combinations(range(4), 3) --> 012 013 023 123 pool = tuple(iterable) n = len(pool) if r > n: return indices = list(range(r)) yield tuple(pool[i] for i in indices) while True: for i in reversed(range(r)): if indices[i] != i + n - r: break else: return indices[i] += 1 for j in range(i+1, r): indices[j] = indices[j-1] + 1 yield tuple(pool[i] for i in indices) |
7
gclove 2018-03-21 23:26:53 +08:00
1,3,5 为什么不行,@acros 机智
|
8
lance6716276 2018-03-21 23:43:21 +08:00 via Android
C5,3 是 10 啊…要有十个啊…
|
9
whoami9894 2018-03-21 23:57:34 +08:00 via Android
@gclove 对呀 1.3.4 为啥也不行
|
10
junkiedon 2018-03-22 00:02:37 +08:00
DFS
|
11
kunluanbudang 2018-03-22 00:15:01 +08:00
把自己在 leetcode 上的垃圾代码粘贴一次
:) ``` class Solution: def __init__(self, ): self._res = [] def combine(self, n,k): if (n <= 0) or (k <= 0) or (k > n): return [] else: c = [] self.generate_combinations(n, k, 1, c) return self._res def generate_combinations(self, n, k, start, c): if len(c) == k: self._res.append(copy.deepcopy(c)) return else: i = start maxI = n - (k-len(c) )+ 1 while i <= maxI: print(c) c.append(i) self.generate_combinations(n, k, i+1, c) c.pop() i += 1 return ``` |
12
takeoffyoung 2018-03-22 00:23:09 +08:00
|
13
kkzxak47 2018-03-22 00:24:23 +08:00 via Android
一帮不看题的,做完说题出错了
|
14
neoblackcap 2018-03-22 00:44:30 +08:00
@kkzxak47 从题主描述问题就是一个排列问题 Combination(5,3)=10,但是跟题目期望不同,要不题目少了条件,否则就是题主记错例子。
|
15
ujued 2018-03-22 00:44:57 +08:00 via iPhone
这 m 个数,前 m-1 个是连续的,整体递增的。这样还不好实现?
|
16
kkzxak47 2018-03-22 01:03:20 +08:00 via Android
@neoblackcap 你还在这排列组合……
|
17
neoblackcap 2018-03-22 01:24:10 +08:00
@kkzxak47 这题不考排列组合考什么呢?我看了 5 分钟,没看出其他意思,的确没看出排列以外的意思。
|
18
markx 2018-03-22 01:26:31 +08:00
|
20
VincentBu 2018-03-22 02:16:30 +08:00
典型的 backtracking 题目
|
21
pyufftj 2018-03-22 08:09:06 +08:00
@264768502 哈哈,当时面试的时候我也有类似的经历。当时让我统计某种特征最多的几个数,我当时使用 Counter 库,两行代码搞定,面试官都蒙了。不过肯定是让你实现底层代码,这样做面试官肯定不满意吧
|
22
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}]
|
23
rebeccaMyKid 2018-03-22 08:59:28 +08:00
@Hopetree 对啊,怎么才这么几个呀。我都准备贴代码了
|
24
rebeccaMyKid 2018-03-22 09:07:53 +08:00 1
|
25
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)
一个递归甩上去呗 |
26
crane2018 2018-03-22 09:55:33 +08:00
就是说输出结果数组的 index 顺序还要满足源数组的 index 大小顺序,而且输出结果数组的前两个数在源数组中相邻,and that's all
|
27
cs5791393 2018-03-22 09:55:50 +08:00
用递归写个循环不就能解决了吗
|
28
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)) ``` |
29
di94sh 2018-03-22 10:26:14 +08:00
|
30
UnknownR 2018-03-22 10:40:26 +08:00
@rebeccaMyKid 一点显示 gist 代码,chrome 就卡成狗。。。滚屏特别卡
|
31
mathzhaoliang 2018-03-22 10:52:06 +08:00
@di94sh 递归的话效率不高,而且 python 里面有层数限制。
|
32
kkzxak47 2018-03-22 12:28:58 +08:00 via Android
@neoblackcap
题目的输出样例是摆看的吗? {1,2,3}{1,2,4},{1,2,5}, {2,3,4},{2,3,5} {3,4,5} 为什么一旦题设不符合你的思维定势,就无所适从,真的不能稍微多想一点点吗? |
33
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(); ?> |
34
dcalsky 2018-03-22 12:48:45 +08:00
<script src="https://gist.github.com/dcalsky/b1925dc429a37d033eed71ff755b4271.js"></script>
|
35
neoblackcap 2018-03-22 13:30:01 +08:00
@kkzxak47
1. 你的推测只是你个人推测,并没有实据,编程是科学。所谓的找规律,我能找更多的满足题意但是是其他的规律。难道不可能推测最后一个元素限定是[3,4,5]这三个数字中的一个? 2. 你推测有额外的规则就是正常,难道我就不能推测题目有问题?这样就思维定式了?就算是面试也是允许询问的。题是人出的就会有错,这很正常的事情。 |
36
kkzxak47 2018-03-22 15:40:33 +08:00 via Android
@neoblackcap 目瞪狗呆。你赢了啊,八辈子都赢了。
|
37
shihty5 2018-03-22 16:05:55 +08:00
@RicardoScofileld 楼主快出来把题目说清楚
|
38
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) |
40
zacard 2018-03-22 17:16:32 +08:00
|
41
juicy 2018-03-22 17:24:18 +08:00
题目只有一条测试用例么,那一句 if..else..就可以了。。
|
42
sikariba 2018-03-22 17:59:03 +08:00
坐等楼主出来改题目
|
43
yidinghe 2018-03-22 18:59:29 +08:00
我这刚好昨天写了个组合遍历:
https://segmentfault.com/a/1190000013899418 虽然语言是 Java,但思路写在里面了:通过将解集看作树节点来遍历,而不是递归,可以做到: 1. 内存使用较小,因为只存储一个解; 2. 因为是在遍历树节点,所以可以从任何一个解开始遍历,或者叫“断点续历(?)” 3. 通过对树节点进行分派,可以实现多线程并发遍历。 |
44
MeteorCat 2018-03-22 19:02:11 +08:00 via Android
暴力穷举,无需动脑,上去就是莽
|
45
wwww961h 2018-03-22 19:19:58 +08:00
直接随机数组下标,然后排除重复,走 1000 次,不怕出不来,
|
46
Betsy 2018-03-22 20:25:22 +08:00 via Android
阿里的实习面试?
|
47
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) } } } |
48
lepig 2018-03-23 09:17:55 +08:00
楼主放完题 就不来关注回复了。 简直没诚意请教。楼下都散了吧
|
49
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])); } } } |
50
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)) ``` |
51
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]] |
52
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]] |
53
RicardoScofileld OP @acros 135 是可以的 我没列出来 就是数学中的组合
|
54
RicardoScofileld OP @lepig 抱歉 这两天有事都没上
|