Maison > développement back-end > tutoriel php > 帮帮看看这个简单的算法

帮帮看看这个简单的算法

WBOY
Libérer: 2016-09-19 09:16:25
original
1041 Les gens l'ont consulté

写的不好,求大家优化
一个用户ID的数组

1

<code>$uids = [1,2,3,5,6,8,9,11,13,25,65];</code>

Copier après la connexion
Copier après la connexion

这个数组的每一个键值代表一个UID
金额数组

1

2

3

4

5

6

7

8

9

10

11

12

13

<code>$amounts = [

    1=>12000,

    2=>500,

    3=>11000,

    5=>1000,

    6=>11000,

    8=>12000,

    9=>12000,

    11=>11000,

    13=>12000,

    25=>22000,

    65=>123123

];</code>

Copier après la connexion
Copier après la connexion

此数组的键名和$uid数组的键值对应。
循环$uids这个数组,取出对应的金额$amount,
如果这个金额大于等于12000($boundary),就在总金额($totals)加上这个$amount
如果这个金额小于12000,就再向下循环,循环到这几个$amount相加大于等于12000,然后在总金额($totals)加上这几个$amount的和
最多取三层。
最后得出$totals的值。
我现在的代码:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

<code><?php $boundary = 12000;

$uids= [1,2,3,5,6,8,9,11,13,25,65];

$amounts = [

    1=>12000,

    2=>500,

    3=>11000,

    5=>1000,

    6=>11000,

    8=>12000,

    9=>12000,

    11=>11000,

    13=>12000,

    25=>22000,

    65=>123123

];

$totals = 0;

foreach($uids as $k => $uid){

    $amont = $amounts[$uid];

    if($amont >= $boundary){

        $totals += $amont;

    }else{

        $next = get_next($uids ,$k+1 ,$amont);

        if($next && is_array($next)){

            $curKey = $next[0]; //amouts index 3

            $totals+=$next[2];

            //再向下获取一层

            $nextKey = $curKey+1;

            if(!isset($uids[$nextKey])){

                break;

            }

            $nextUid = $uids[$nextKey];

            $nextAmount = $amounts[$nextUid];

            if($nextAmount >= $boundary){

                $totals+=$nextAmount;

            }else{

                $last = get_next($uids ,$nextKey+1 ,$nextAmount);

                if($last && is_array($last)){

                    $totals+=$last[2];

                }

            }

        }

        break; //跳出主循环

    }

}

echo $totals;

exit;

 

function get_next($uids ,$start ,$prevAmount){

    global $amounts ,$boundary;

    $leaves = array_slice($uids ,$start ,count($uids),true);

    if($leaves){

        foreach($leaves as $k=>$uid){

            $amount = $prevAmount+$amounts[$uid];

            if($amount >= $boundary){

                return [$k ,$uid ,$amount];

                break;

            }else{

                return get_next($uids ,$k+1 ,$amount);

            }

        }

    }

    return 0;

}</code>

Copier après la connexion
Copier après la connexion

得出$totals=47500

回复内容:

写的不好,求大家优化
一个用户ID的数组

1

<code>$uids = [1,2,3,5,6,8,9,11,13,25,65];</code>

Copier après la connexion
Copier après la connexion

这个数组的每一个键值代表一个UID
金额数组

1

2

3

4

5

6

7

8

9

10

11

12

13

<code>$amounts = [

    1=>12000,

    2=>500,

    3=>11000,

    5=>1000,

    6=>11000,

    8=>12000,

    9=>12000,

    11=>11000,

    13=>12000,

    25=>22000,

    65=>123123

];</code>

Copier après la connexion
Copier après la connexion

此数组的键名和$uid数组的键值对应。
循环$uids这个数组,取出对应的金额$amount,
如果这个金额大于等于12000($boundary),就在总金额($totals)加上这个$amount
如果这个金额小于12000,就再向下循环,循环到这几个$amount相加大于等于12000,然后在总金额($totals)加上这几个$amount的和
最多取三层。
最后得出$totals的值。
我现在的代码:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

<code><?php $boundary = 12000;

$uids= [1,2,3,5,6,8,9,11,13,25,65];

$amounts = [

    1=>12000,

    2=>500,

    3=>11000,

    5=>1000,

    6=>11000,

    8=>12000,

    9=>12000,

    11=>11000,

    13=>12000,

    25=>22000,

    65=>123123

];

$totals = 0;

foreach($uids as $k => $uid){

    $amont = $amounts[$uid];

    if($amont >= $boundary){

        $totals += $amont;

    }else{

        $next = get_next($uids ,$k+1 ,$amont);

        if($next && is_array($next)){

            $curKey = $next[0]; //amouts index 3

            $totals+=$next[2];

            //再向下获取一层

            $nextKey = $curKey+1;

            if(!isset($uids[$nextKey])){

                break;

            }

            $nextUid = $uids[$nextKey];

            $nextAmount = $amounts[$nextUid];

            if($nextAmount >= $boundary){

                $totals+=$nextAmount;

            }else{

                $last = get_next($uids ,$nextKey+1 ,$nextAmount);

                if($last && is_array($last)){

                    $totals+=$last[2];

                }

            }

        }

        break; //跳出主循环

    }

}

echo $totals;

exit;

 

function get_next($uids ,$start ,$prevAmount){

    global $amounts ,$boundary;

    $leaves = array_slice($uids ,$start ,count($uids),true);

    if($leaves){

        foreach($leaves as $k=>$uid){

            $amount = $prevAmount+$amounts[$uid];

            if($amount >= $boundary){

                return [$k ,$uid ,$amount];

                break;

            }else{

                return get_next($uids ,$k+1 ,$amount);

            }

        }

    }

    return 0;

}</code>

Copier après la connexion
Copier après la connexion

得出$totals=47500

Étiquettes associées:
php
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal