PHP 数组元素->组合算法排列题,求算法解决?

2018-08-10 09:19:30 +08:00
 eluotao

根据数组元素写出所有组合排列. 条件:组合排列的位数 为数组成员数 例如: 数组 $arr=array('1','2','3','4','5'); 计算出 $arr 元素值 所有 5 位数组合. 例如

1111

2222

3333

4444

5555

12222

13333

14444

15555

21111

23333

24444

25555

31111

32222

34444

35555

41111

42222

43333

45555

51111

52222

53333

54444

....

....

....

以此类推.

通过以上组合 把每个元素值相加

计算出 11111 = 5

22222 = 10

33333 = 15

44444 = 20

....

....

....

找出能组合的所有不同值..

例如 12345 54321 23451 34512 45123 51234 43215 等等 计算和 都是 16 只能算一个值.

有大佬能帮忙看看吗?

这道题有点想不通?

有什么优雅的算法吗?

3030 次点击
所在节点    PHP
24 条回复
airdge
2018-08-10 15:34:05 +08:00
@shenhhd @eluotao
可以用 range 输出 11111 到 55555 的数组,再判新断数组元素有没含有其他的数字,过滤得到新数组
class Num
{
public $array;
public $count;
public $unique;
public $diff;
public $exec;
public function __construct($array)
{
sort($array);
$this->array = $array;
$this->count = count($array);
$this->unique = array_unique($array);
$this->diff = array_diff(range(0, 9), $this->unique); //得到差集
$this->exec = implode('|', $this->diff); // 匹配字符 6|7|8
}
public function soft()
{
$low = str_pad($this->array[0], $this->count, $this->array[0]);
$high = str_pad(end($this->array), $this->count, end($this->array));
$range = range($low, $high);
$str = array_map(function ($a) {
if (preg_match('/' . $this->exec . '/', $a)) {
# 如果匹配到差集的数字,则不输出
} else {
return $a;
}
}, $range);
return array_values(array_filter($str));
}
}
$array = [1, 2, 4, 5, 6];
$a = new Num($array);
print_r($a->soft());
eluotao
2018-08-10 18:16:07 +08:00
@airdge 多谢 新思路
ProfaneAria
2018-08-10 20:11:05 +08:00
递归处理,思路如下(例子就用 1-5,3 位)
第一次( 1 位数时的可能值)
$list = [1, 2, 3, 4, 5]
第二次( 2 位数时的可能值,在 1 位数的基础上处理)
分别取$list 中的值加上 1~5,1~5 具体位置并不影响最后加值
1 -> 2, 3, 4, 5, 6
2 -> 3, 4, 5, 6, 7
3 -> 4, 5, 6, 7, 8
....
做个并集
最后$list = [2, 3, 4, 5, 6, 7, 8, 9, 10]
第三次依次
最后$list = [3, 4, 5 , 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]


可能说的不够清楚。原理其实很简单,最后统计加值的时候其实和数字具体在哪个位置无关,所以可以按位数依次加上所有可能的值进行扩展,知道扩展到你想要的位数位置。
eluotao
2018-08-12 01:10:49 +08:00
@shenhhd 这个算法 遇上 10 位以上 就不行了. 内存不够搞了.

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

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

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

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

© 2021 V2EX