一个数组怎么样做到平均分布

一个数组怎么样做到平均分布

  • 例如原数组[1,1,2]结果[1,2,1]
  • 例如原数组[2,1,1,2]结果[1,2,1,2]
  • 例如原数组[2,1,1,1,2]结果[1,2,1,2,1]
  • 例如原数组[3,1,1,1,2]结果[1,2,1,3,1]
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 13
awesee

代码如下:

function average(array $arr){
    $count_res = array_count_values($arr);
    ksort($count_res);
    arsort($count_res);
    $left = array();
    $right = array();
    $flag  = 1;
    $i = 0;
    while(count($count_res)){
        foreach( $count_res as $v => $c ){
            switch($c){
                case 1:
                if($flag){
                    $left[] = $v;
                    $flag = 0;
                } else {
                    if($i == $c){
                        array_unshift($right, $v);
                    }else {
                        $right[] = $v;
                    }
                    $flag = 1;
                }
                unset($count_res[$v]);
                break;
                case 2;
                $left[] = $v;
                if($i == $c){
                    array_unshift($right, $v);
                }else {
                    $right[] = $v;
                }
                unset($count_res[$v]);
                break;
                default:
                $left[] = $v;
                if($i == $c){
                    array_unshift($right, $v);
                }else {
                    $right[] = $v;
                }
                $count_res[$v] = $c-2;
            }
            if($c>1){
                $i = $c;
            } else {
                $i = 0;
            }

        }

    }

    return array_merge($left, array_reverse($right)) ;
}

$array = array(1,1,2);
print_r(average($array));       //1 2 1
$array = array(2,1,1,2);
print_r(average($array));       //1 2 1 2
$array = array(2,1,1,1,2);
print_r(average($array));       //1 2 1 2 1
$array = array(3,1,1,1,2);
print_r(average($array));       //1 2 1 3 1
6年前 评论
awesee

类似这样的:

$array = array(1,1,2,1,1);
print_r(average($array));       //1 2 1 1 1

如果想打印出[1, 1, 2, 1, 1]

代码稍微改一下就可以了。

6年前 评论
//原数据
array:192 [▼
  0 => 2538
  1 => 2538
  2 => 2538
  3 => 2538
  4 => 2538
  5 => 2538
  6 => 2538
  7 => 2538
  8 => 2538
  9 => 2538
  10 => 2538
  11 => 2538
  12 => 2465
  13 => 2465
  14 => 2465
  15 => 2465
  16 => 2465
  17 => 2465
  18 => 2465
  19 => 2465
  20 => 2465
  21 => 2465
  22 => 2465
  23 => 2465
  24 => 2465
  25 => 2465
  26 => 2465
  27 => 2465
  28 => 2465
  29 => 2465
  30 => 2465
  31 => 2465
  32 => 2465
  33 => 2465
  34 => 2465
  35 => 2465
  36 => 5794
  37 => 5794
  38 => 5794
  39 => 5794
  40 => 5794
  41 => 5794
  42 => 5794
  43 => 5794
  44 => 5794
  45 => 5794
  46 => 5794
  47 => 5794
  48 => 5801
  49 => 5801
  50 => 5801
  51 => 5801
  52 => 5801
  53 => 5801
  54 => 5801
  55 => 5801
  56 => 5801
  57 => 5801
  58 => 5801
  59 => 5801
  60 => 2121
  61 => 5814
  62 => 2121
  63 => 5814
  64 => 5814
  65 => 2121
  66 => 2121
  67 => 5814
  68 => 5814
  69 => 5814
  70 => 2121
  71 => 2121
  72 => 2121
  73 => 5814
  74 => 5814
  75 => 5814
  76 => 2121
  77 => 2121
  78 => 2121
  79 => 5814
  80 => 2121
  81 => 2121
  82 => 2121
  83 => 5814
  84 => 5814
  85 => 2121
  86 => 2121
  87 => 2121
  88 => 2121
  89 => 5814
  90 => 5814
  91 => 2121
  92 => 5814
  93 => 5814
  94 => 2121
  95 => 2121
  96 => 2121
  97 => 2121
  98 => 2121
  99 => 2121
  100 => 5814
  101 => 5814
  102 => 5814
  103 => 5814
  104 => 5814
  105 => 5814
  106 => 5814
  107 => 2121
  108 => 5814
  109 => 5814
  110 => 2121
  111 => 2121
  112 => 5814
  113 => 2121
  114 => 2121
  115 => 2121
  116 => 5814
  117 => 2121
  118 => 5814
  119 => 2121
  120 => 2107
  121 => 2107
  122 => 2107
  123 => 2107
  124 => 2107
  125 => 2107
  126 => 2107
  127 => 2107
  128 => 2107
  129 => 2107
  130 => 1857
  131 => 1857
  132 => 1857
  133 => 1857
  134 => 1857
  135 => 1857
  136 => 1857
  137 => 1857
  138 => 1857
  139 => 1857
  140 => 1857
  141 => 1857
  142 => 1857
  143 => 2140
  144 => 2140
  145 => 2140
  146 => 2140
  147 => 2140
  148 => 2140
  149 => 2140
  150 => 2140
  151 => 2092
  152 => 2092
  153 => 2092
  154 => 2092
  155 => 2092
  156 => 2092
  157 => 2092
  158 => 5813
  159 => 5813
  160 => 5813
  161 => 5813
  162 => 5813
  163 => 5813
  164 => 5813
  165 => 2177
  166 => 2004
  167 => 2177
  168 => 2004
  169 => 2177
  170 => 2177
  171 => 2177
  172 => 2004
  173 => 2004
  174 => 2214
  175 => 2214
  176 => 2214
  177 => 2214
  178 => 2214
  179 => 2214
  180 => 2214
  181 => 2214
  182 => 2214
  183 => 1990
  184 => 1990
  185 => 1990
  186 => 1990
  187 => 1990
  188 => 1990
  189 => 1990
  190 => 1990
  191 => 1990
]

//组装后的数据
array:192 [▼
  0 => 2121
  1 => 5814
  2 => 2465
  3 => 1857
  4 => 2538
  5 => 5794
  6 => 5801
  7 => 2107
  8 => 1990
  9 => 2214
  10 => 2140
  11 => 2092
  12 => 5813
  13 => 2177
  14 => 2004
  15 => 2121
  16 => 5814
  17 => 2465
  18 => 1857
  19 => 2538
  20 => 5794
  21 => 5801
  22 => 2107
  23 => 1990
  24 => 2214
  25 => 2140
  26 => 2092
  27 => 5813
  28 => 2177
  29 => 2004
  30 => 2121
  31 => 5814
  32 => 2465
  33 => 1857
  34 => 2538
  35 => 5794
  36 => 5801
  37 => 2107
  38 => 1990
  39 => 2214
  40 => 2140
  41 => 2092
  42 => 5813
  43 => 2177
  44 => 2121
  45 => 5814
  46 => 2465
  47 => 1857
  48 => 2538
  49 => 5794
  50 => 5801
  51 => 2107
  52 => 1990
  53 => 2214
  54 => 2140
  55 => 5813
  56 => 2121
  57 => 5814
  58 => 2465
  59 => 1857
  60 => 2538
  61 => 5794
  62 => 5801
  63 => 2107
  64 => 2214
  65 => 2121
  66 => 5814
  67 => 2465
  68 => 1857
  69 => 2538
  70 => 5794
  71 => 5801
  72 => 2121
  73 => 5814
  74 => 2465
  75 => 2121
  76 => 5814
  77 => 2465
  78 => 2121
  79 => 5814
  80 => 2465
  81 => 2121
  82 => 5814
  83 => 2465
  84 => 2121
  85 => 5814
  86 => 2465
  87 => 2121
  88 => 5814
  89 => 2465
  90 => 2121
  91 => 5814
  92 => 2121
  93 => 5814
  94 => 2121
  95 => 2121
  96 => 2121
  97 => 2121
  98 => 5814
  99 => 2121
  100 => 5814
  101 => 2121
  102 => 2465
  103 => 5814
  104 => 2121
  105 => 2465
  106 => 5814
  107 => 2121
  108 => 2465
  109 => 5814
  110 => 2121
  111 => 2465
  112 => 5814
  113 => 2121
  114 => 2465
  115 => 5814
  116 => 2121
  117 => 1857
  118 => 2465
  119 => 5814
  120 => 2121
  121 => 2538
  122 => 1857
  123 => 2465
  124 => 5814
  125 => 2121
  126 => 1990
  127 => 2107
  128 => 2538
  129 => 1857
  130 => 2465
  131 => 5814
  132 => 2121
  133 => 2092
  134 => 2140
  135 => 1990
  136 => 2107
  137 => 2538
  138 => 1857
  139 => 2465
  140 => 5814
  141 => 2121
  142 => 2092
  143 => 2140
  144 => 1990
  145 => 2107
  146 => 2538
  147 => 1857
  148 => 2465
  149 => 5814
  150 => 2121
  151 => 2004
  152 => 2177
  153 => 2092
  154 => 2140
  155 => 1990
  156 => 2107
  157 => 2538
  158 => 1857
  159 => 2465
  160 => 5814
  161 => 2121
  162 => 2004
  163 => 2177
  164 => 2092
  165 => 2140
  166 => 1990
  167 => 2107
  168 => 2538
  169 => 1857
  170 => 2465
  171 => 5814
  172 => 2121
  173 => 5794
  174 => 5801
  175 => 2214
  176 => 5813
  177 => 5794
  178 => 5801
  179 => 2214
  180 => 5813
  181 => 5794
  182 => 5801
  183 => 2214
  184 => 5813
  185 => 5794
  186 => 5801
  187 => 2214
  188 => 5794
  189 => 5801
  190 => 5794
  191 => 5801
]

array:15 [▼
  2121 => array:32 [▶]
  5814 => array:28 [▶]
  2465 => array:24 [▶]
  1857 => array:13 [▶]
  2538 => array:12 [▶]
  5794 => array:12 [▶]
  5801 => array:12 [▶]
  2107 => array:10 [▶]
  1990 => array:9 [▶]
  2214 => array:9 [▶]
  2140 => array:8 [▶]
  2092 => array:7 [▶]
  5813 => array:7 [▶]
  2177 => array:5 [▶]
  2004 => array:4 [▶]
]
6年前 评论

@Openset 2121有32个,但是你查一下,有很多中间是一样的

6年前 评论
awesee

@dope2008 你用权重吧,计算每个值的权重,然后根据权重排序。

6年前 评论

@Openset 比如A有5个,,,B有3个.....C有2个
正确来说,,,ABACABACBA
如果按权重 ABCABCABAA

6年前 评论
awesee

@dope2008 不是啊,你权重怎么算的

6年前 评论
awesee

@dope2008 A有5个,5个A对应的权重应分别为1/6,2/6,3/6,4/6,5/6。3个B权重分别为1/4,2/4,3/4。2个C权重分别为1/3,2/3。你按权重排一下试试。

6年前 评论
awesee

@dope2008 ABACABACAB

6年前 评论
awesee

@dope2008 如果只有一个值,那么它是没有权重的,作为填充值,补位就可以了。

6年前 评论

@Openset 不懂,你有没有详细的?

6年前 评论
awesee

@dope2008 6,4,3 最小公倍数是12,假设有12个位置。
1,2,3,4,5,6,7,8,9,10,11,12。5个A占用的位置分别是2,4,6,8,10。
现在还剩下1,3,5,7,9,11,12。3个B和2个C。
3个B占位,3,7,11。
还剩1,5,9,12。和2个C。
C占位5,9。结束。
1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - 10 - 11 - 12

  • A - B - A - C - A - B - A - C - A - B -
6年前 评论

一个思路:

  • 先做单词统计,得到一个无重复数据数组。单词为KEY, 统计数为VALUE
  • 按顺序循环输出单词,没输出一次,统计数-1
  • 直到所有单词统计数都为0
6年前 评论

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