PHP面试题目

29个成员

金币奖励制度算法

发表于 2015-12-10 1397 次查看

某电商为了提升用户的回头率,策划一个金币奖励机制,金币可以直接抵扣现金进行消费,金币的获得需要用户连续的进行购买,规则如下:连续购买3天,从第3天奖励10,后续每天有购买奖励10个,中间如果中断购买,需重新计算连续3天才会奖励金币。

例子:第1天购买,不奖励,第2天购买也不奖励,第3天购买奖励10个,第4天购买奖励10,第5天不购买,不奖励,第6天购买,未连续3天购买不奖励。

现有如下小明的购买记录(键名为天数,键值1是购买,0是未购买):

$days = array(
  '1'=> 0,
  '2'=> 1,
  '3'=> 1,
  '4'=> 1,
  '5'=> 1,
  '6'=> 0,
  '7'=> 0,
  '8'=> 1,
  '9'=> 1,
  '10'=> 0,
  '11'=> 1,
  '12'=> 1,
  '13'=> 1,
  '14'=> 1,
  '15'=> 1 
  );

请写一个方法,传入购买记录,返回小明目前的金币的总数。

7回复
  • 2楼 福娃 2015-12-10

    $days = array(
      '1'=> 0,
      '2'=> 1,
      '3'=> 1,
      '4'=> 1,
      '5'=> 1,
      '6'=> 0,
      '7'=> 0,
      '8'=> 1,
      '9'=> 1,
      '10'=> 0,
      '11'=> 1,
      '12'=> 1,
      '13'=> 1,
      '14'=> 1,
      '15'=> 1 
    );

    function 以往历史奖励数统计($days,$起记天数,$每次奖励数额){ 
        $连续天数=0;
        $合计金币数=0;
        foreach($days as $k=>$v){
             $连续天数 = $v ? $连续天数+1 : 0;
             if($连续天数 >= $起记天数){  $合计金币数+=$每次奖励数额;  }
        }
        return $合计金币数;
    }

    $起记天数 = 3;
    $每次奖励数额 = 10;
    $合计金币数 = 以往历史奖励数统计($days,$起记天数,$每次奖励数额);
    echo "以往历史上奖历金币数为:{$合计金币数}";


    //本次新购买订单,是否增加金币
    $days[16]=1; //增加购买记录(16号)
    $zt=0;
    for($i=1;$i<3;$i++){ $zt+=$days[count($days)-$i]; } //计算近两天购买情况
    if($zt==2) $合计金币数 = $合计金币数 + $每次奖励数额;  //如果连续两天购买,则增加金币
    echo "<br>当前购买后,最新金币数更新为:{$合计金币数}";

  • 3楼 井底之蛙 2015-12-10

    <?php
    header("content-type:text/html;charset=utf-8");
    $days = array(
        '1'=> 0,
        '2'=> 1,
        '3'=> 1,
        '4'=> 1,
        '5'=> 1,
        '6'=> 0,
        '7'=> 0,
        '8'=> 1,
        '9'=> 1,
        '10'=> 0,
        '11'=> 1,
        '12'=> 1,
        '13'=> 1,
        '14'=> 1,
        '15'=> 1
    );
    function jinbi($arr){
        $i=1;$jinbi=0;
        foreach($arr as $key => $value){
            if($value == 0){
                $i=1;
            }else{
                $i++;
                if($i >= 3){
                    $jinbi=$jinbi+10;
                }
            }
        }
       echo '金币个数:'.$jinbi;
    }
     jinbi($days);
    ?>

  • 4楼 城子 2015-12-10

    <?php
    header('content-type:text/html;charset=utf-8');
    function countGold($days){
        $sumGold=0;
        for($i=1;$i<=count($days);$i++){
        //如果值为1
            if($days[$i]==1){
                if($i-1>0 && $days[$i-1]==1){
                    if($i-2>0 && $days[$i-2]==1){
                        //计算金币总额
                        $sumGold=$sumGold+10;
                    }
                }
            }    
        }
        echo $sumGold;
    }    
        
    //测试
    $days = array('1'=> 0,'2'=> 1,'3'=> 1,'4'=> 1,'5'=> 1,'6'=> 0,'7'=> 0,'8'=> 1,'9'=> 1,'10'=> 0,'11'=> 1,'12'=> 1,'13'=> 1,'14'=> 1,'15'=> 1);
    countGold($days);
    ?>

  • 5楼 祝你好运 2015-12-10

    <?php
    header('content-type:text/html;charset=utf-8');

    $days = array(
      '1'=> 0,
      '2'=> 1,
      '3'=> 1,
      '4'=> 1,
      '5'=> 1,
      '6'=> 0,
      '7'=> 0,
      '8'=> 1,
      '9'=> 1,
      '10'=> 0,
      '11'=> 1,
      '12'=> 1,
      '13'=> 1,
      '14'=> 1,
      '15'=> 1 
      );
    function jl($days){
        $day=0;$jb=0;
       foreach ($days as $k => $v) {
        $day+=$v;
          if ($v==0) {
                 $day=0;
           }
          if($day>=3){
                 $jb=$jb+10;
           }
       }
       echo $jb;
    }

    jl($days);

  • 6楼 zzliux 2015-12-10

    function fun($d){
        $cnt = $res = 0;
        foreach ($d as $v) {
            if($v) $cnt++;
            else $cnt = 0;
            if($cnt>2) $res += 10;
        }
        return $res;
    }

  • 7楼 思念是一种病 2015-12-10

    <?php
    $days=array(
        '1'=>0,
        '2'=>1,
        '3'=>1,
        '4'=>1,
        '5'=>1,
        '6'=>0,
        '7'=>0,
        '8'=>1,
        '9'=>1,
        '10'=>0,
        '11'=>1,
        '12'=>1,
        '13'=>1,
        '14'=>1,
        '15'=>1,
    );
    function countGoldcoin($days){
        $day=0;//连续购买的天数
        $i=0;
        $j=0;
        $coin=0;
        $v1=0;
        $total=array();//中断前的超过连续三天购物的次数
        $total1=array();//还在持续连续三天以上的记录
        foreach($days as $key => $value){
            if($value == 1){
                $day=$day+1;
                if($day>=3){
                    $total1[$j]=$day;
                    $j++;
                }
            }else{
                unset($total1);
                if($day>=3){
                    $total[$i]=$day;
                    $i=$i+1;
                    $day=0;
                }else{
                    $day=0;
                }
            }
        }
        foreach($total as $k => $v){
            $coin+=($v - 2) * 10;
        }
        $v1=count($total1);
        $coin+=$v1*10;
        return $coin;
    }
    echo countGoldcoin($days);

发表回复
你还没有登录,请先登录注册

加入我们吧,一起学习QQ群516033298