问个算法问题

封装个方法传递两个参数,第一个传递一个数组,第二个传递位数,比如 传个1-9的数组进去,我要三位数的,就传个3。最小位是123 124..129 134 .135。 不能有重复的,
123 312 321 这三个都算重复的。 怎么写啊。想了半天没写出来 for循环嵌套可以实现,但是比如我要7位数的。7个循环嵌套 太麻烦了

《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 8

1.封装一个方法gen()生成数组return rand(最小值,位数*10-1)

2.

public $all,$sum,$count;  //all所有符合条件的数组  sum符合条件数组值和  count循环次数
public function genData($arr,$num)  //数组 位数
{
$val = gen($arr,$num);  //例如返回354
$val_arr = explode('',$val);
$sum = array_sum($val_arr);  //计算3+5+4的值  =12
if(! in_array($sum,$this->sum[])) {   //这个值没有重复
 $this->sum[] = $sum;
 $this->all[] = $val;
  $this->count++;         //次数+1
}

if($this->count == $num)
 return '满足了';
else
$this->genData($arr,$num); //递归调用

}

随手打的 没运行过
ps:这样会把557 467判断为是重复的

4年前 评论
$res = [];

function gen($arr, $n, $step = 0, $v = [])
{
    global $res;
    if (count($v) == 3) {
        $res[] = $v;
        return;
    }

    for ($i = $step; $i < count($arr); $i++) {
        array_push($v, $arr[$i]);
        gen($arr, $n, $i+1, $v);
        array_pop($v);
    }
}

gen([1, 2, 3, 4], 3);
print_r($res);
4年前 评论

这样可以打印出所有符合的数字数组,不清楚可以问我

function gen($arr,$n=3){
    $data = [];//返回值
    $first_max = count($arr)-$n;//首位数最大值
    $max_num = $arr[count($arr)-1];//最大数字
    foreach ($arr as $k => $v) {
        if($k>$first_max) break;//完成跳出
        $a = 0;
        $b = 0;
        $max = 0;
        rep:
        $item = '';//初始化单个元素
        for ($i=0; $i < $n; $i++) {
            if($i == 0) {
                $item .= $arr[$k+$i];continue;
            }
            if($i == $n-1) {
                $item .= $arr[$k+$i+$a];
                $max = $arr[$k+$i+$a];
                continue;
            }
            $item .= $arr[$k+$i+$b];
        }
        $data[] = $item;

        //最后位不是最大值时 继续
        if($max < $max_num) {
            $a++;
            goto rep;
        }
        $sec = count($arr)-$n-$k;
        if($b < $sec){
            $b++;
            $a = $b;
            goto rep;
        }
    }
    return $data;
}

$data = gen([1,2,3,4,5,6],3);
print_r($data);

打印效果如下:

file

4年前 评论
Sparkfly

有序排列组合问题

4年前 评论

@wuyan 对的 就是这样 :kissing_heart:

4年前 评论
wuyan94zl 4年前
caden123 (作者) (楼主) 4年前

@Sparkfly 嗯嗯 后面才知道 有这个

4年前 评论
function array2int(array $array,int $length):array{
    $arrayLength=count($array);
    if($arrayLength<=$length){
        return [implode('',$array)];
    }
    $firstEleArray=array_slice($array,0,$arrayLength-$length+1);
    $length--;
    $ret=[];
    foreach ($firstEleArray as $index=>$ele){
        $_ret=[];
        if($length>0){
            $_ret=array2int(array_slice($array,$index+1),$length);
        }
        if($_ret){
            foreach ($_ret as $_ele){
                $ret[]="{$ele}{$_ele}";
            }
        }else{
            $ret[]=$ele;
        }

    }
    return $ret;
}

var_export(array2int([1,2,3,4,5,6,7,8,9],3));
echo PHP_EOL;

不确定有没有理解错题意。

4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!