无聊的力量之序列组合方式
April 18, 2017 by jaifire
> 123456+-/只能用一次且全部用上得值为22用程序实现
> 我马上想到我只需要把‘123456+-/’的所用组合方式全部列出来,计算一下就行了,于是我现在需要写一个方法来把任意字符串的所有组合方式列出来
eval: 计算字符串中的表达式
exec: 执行字符串中的语句
execfile: 用来执行一个文件
一个长度单位的序列组合个数为: 1 * 2 * 3 * n
def func(n): r = 1 for i in range(1, n + 1, 1): r *= i return r
传入一个字符串,反回其所有组合方式的列表(长度不能超过9,超过后会很慢):
Python实现
def str_combine(s): arr = list(s) r = [arr[0]] for c in arr[1:]: tmp = r[:] r = [] for one in tmp: for x in range(len(one) + 1): t = list(one) t.insert(x, c) r.append(''.join(t)) return r
PHP实现
class Combine { public static function xx($str) { //最多只能算8位长度,超过会很慢 //$arr = str_split(mb_substr($str, 0, 8, 'utf8')); $arr = str_split($str); $r[] = [$arr[0]]; for ($i = 1; $i < count($arr); $i++) { $zj = $r[$i - 1]; $tmp = []; for ($j = 0; $j < count($zj); $j++) { $tmp = array_merge($tmp, self::c($zj[$j], $arr[$i])); } $r[$i] = $tmp; } return $r; } public static function c($str, $c) { $combine = []; $arr = str_split($str); $len = count($arr); for ($i = 0; $i <= $len; $i++) { $tmp = $arr; array_splice($tmp, $i, 0, $c); $combine[] = implode('', $tmp); } return $combine; } } list($t1, $t2) = explode(' ', microtime()); $r = Combine::xx('123456+-/'); list($t3, $t4) = explode(' ', microtime()); echo ($t4 + $t3) - ($t2 + $t1);
发表评论