【问题标题】:Calculate number of acquired points given an input integer, size of levels, and points per level给定输入整数、级别大小和每个级别的点数,计算获取的点数
【发布时间】:2020-08-07 05:52:18
【问题描述】:

我有一个任务,我必须根据一个值达到多少“级别”来计算“获得点数”。

假设每个级别都有 5 个增量的范围。 换句话说,如果$x = 5 那意味着:

  • 1 级是 1,2,3,4,5 和
  • 2级是6、7、8、9、10等

输入值($a)每进入一个新关卡,即可获得 10 分($y = 10)。

如果$a2,则此数字属于第一个范围,因此获得10 积分。
此外,$a = 5 获得10$a = 7 获得20,并且$a = 12 赚取 30

我已经使用while循环编写了一些代码,但由于时间复杂性,我不想使用while循环。

$a = 11;
$x = 5;
$y = 10;
$count = 100/$x;
$i = 1;
$c = 1 ;
while($i<=$count){
    $min = $c ;
    $max = $c = $c + ($x -1);
    if (in_array($a, range($min, $max))) {
        echo "\n result= " . $i * $y;
        break;
    }
    $c++;
    $i++;
}

上述代码的输出是正确的30,但我想找到一种更有效的技术。

【问题讨论】:

    标签: php algorithm time-complexity logic formula


    【解决方案1】:

    您似乎想为从1 开始的x 数字的每个范围添加y 直到a如果这个假设是正确的,您可以将a 除以x 得到偏移量(将出现的范围数)并将其乘以y。如果 a / x 的除法有小数,则在乘以 y 之前将商(如偏移量)加 1。

    片段:

    <?php
    
    $tests = [
            2,
            5,
            7,
            11,
            12
        ];
        
    $x = 5;
    $y = 10;
    
    foreach($tests as $a){
        $quo = intval($a / $x);
        if($quo * $x < $a) $quo++;
        echo $a," => " ,$quo * $y,PHP_EOL;
    }
    

    演示: https://3v4l.org/rDe3Z

    所以,这样,时间复杂度是O(1)

    【讨论】:

      【解决方案2】:

      我会简单地使用ceil($a / $x) * $y 来计算总数。用简单的英语,将数字除以每级的点数,然后将该值四舍五入到下一个整数,然后将该值乘以每级的点数。

      我假设负输入要么是不可能的,要么应该产生负结果。我还假设零输入应该有零输出。

      代码:(Demo)

      $as = [0, 1, 2, 5, 7, 10, 16, 49];
      $x = 5;
      $y = 10;
      foreach ($as as $a) {
          echo "$a => " . (ceil($a / $x) * $y) . "\n";
      }
      

      输出:

      0 => 0
      1 => 10
      2 => 10
      5 => 10
      7 => 20
      10 => 20
      16 => 40
      49 => 100
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多