请选择 进入手机版 | 继续访问电脑版

爱分享吧

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1958|回复: 0

[php]m个数取n个,每一位不重复组合

[复制链接]

75

主题

75

帖子

1058

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1058
发表于 2018-5-23 14:36:45 | 显示全部楼层 |阅读模式
拿去不谢!


  1. <?php
  2. //m个数取n个,每一位不重复组合
  3. $set = range(1, 11);
  4. $timeStart = microtime(true);
  5. print_r(getSetDiffNumber($set, 5));
  6. $timeEnd = microtime(true);
  7. echo '运行时间:'.($timeEnd - $timeStart);

  8. function getSetDiffNumber($set, $num){
  9.     $set = array_values(array_unique($set));
  10.     if($num <= 1){
  11.         return $set;
  12.     }
  13.     if($num > count($set)){
  14.         return 'error:$num值大于$set元素';
  15.     }

  16.     $numSet = count($set) - 1;
  17.     for ($i = 0; $i < $num; $i++) {
  18.         $setpSet[$i] = 0;
  19.     }
  20.     while (true) {
  21.         for ($i = ($num - 1); $i >= 0 ; $i--) {
  22.             if($setpSet[$i] > $numSet){
  23.                 $setpSet[$i] = 0;
  24.                 $setpSet[$i - 1]++;
  25.             }
  26.             if($i - 1 == 0 && $setpSet[$i - 1] > $numSet){
  27.                 return $newSet;
  28.             }
  29.         }
  30.         $check = [];
  31.         for ($i = ($num - 1); $i >= 0 ; $i--) {
  32.             $check[$setpSet[$i]] = 0;
  33.         }
  34.         if(count($check) < $num){
  35.             $setpSet[$num - 1]++;
  36.             continue;
  37.         }
  38.         $numArr = [];
  39.         for ($i = 0; $i < $num ; $i++) {
  40.             $numArr[] = $set[$setpSet[$i]];
  41.         }
  42.             $newSet[] = implode(',', $numArr);
  43.         $setpSet[$num - 1]++;
  44.     }
  45. }
复制代码

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|爱分享吧

GMT+8, 2021-4-14 13:10 , Processed in 0.097493 second(s), 21 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表