无聊的力量之序列组合方式

无意间在QQ群里看到这样一个题目:

> 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);


发表评论

当一个人在某个小社会受了委屈时,请不要忘记外面还有个大社会.