问个算法问题

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

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《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年前 评论

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