一個小小的演算法問題

來源:互聯網
上載者:User
比如:我們儲值話費的時候,充大於10元送1元話費,充大於50元送5元話費。

那麼此時,我儲值的是51元話費,我怎麼去命中的是50元送5元話費,而此時不再命中大於10元送1元話費了。

老大,幫我看下吧
$a = array('50'=>'5','10'=>'1');$s = 51;function test($s,$a){$flag = 0;foreach($a as $k=>$v){if($s >=$k){$flag=$v;}}return $flag;}echo test($s,$a);


回複討論(解決方案)

$a = array('50'=>'5','10'=>'1');$s = 51;function test($s,$a){    $flag = 0;    foreach($a as $k=>$v){        if($s >=$k){            return $v; //注意這裡        }    }    return $flag;}echo test($s,$a);

$a = array('50'=>'5','10'=>'1');$s = 51;function test($s,$a){    $flag = 0;    foreach($a as $k=>$v){        if($s >=$k){            $flag=$v;            break; //這樣比較規範(一個模組只有一個出口)        }    }    return $flag;}echo test($s,$a);

$a = array('50'=>'5','10'=>'1');$s = 51;function test($s,$a){    $flag = 0;    foreach($a as $k=>$v){        if($s >=$k){            $flag=$v;            break; //這樣比較規範(一個模組只有一個出口)        }    }    return $flag;}echo test($s,$a);


如果$a 換成 $a = array('40'=>'3','50'=>'5','10'=>'1');
那麼結果就是3了,這個時候51比50要大,應該是5啊

你在foreach裡面賦值的話,如果數組是以金額從大到小排列,那第一次檢測到合格時候就應該返回,即同1#,否則會被接下來的合格小數額覆蓋。
或者把數組從小到大排列,但是這樣效率相對低一點,因為這樣要把數組從頭到尾判斷完。

如果$a 換成 $a = array('40'=>'3','50'=>'5','10'=>'1');
那麼結果就是3了,這個時候51比50要大,應該是5啊



[code=php]$a = array('50'=>'5','10'=>'1');$s = 51;function test($s,$a){    $flag = 0;    foreach($a as $k=>$v){        if($s >=$k){if($flag<$v)            $flag=$v;                   }    }    return $flag;}echo test($s,$a);

[/code]

數組是排列不規則的話就這樣

$a = array('40'=>'3','50'=>'5','10'=>'1');$s = 51;function test($s,$a){    $flag = 0;    foreach($a as $k=>$v){        if($s >=$k){                if($flag<$v)                           $flag=$v;                    }    }    return $flag;}echo test($s,$a);

$a = array('40'=>'3','50'=>'5','10'=>'1');$s = 51;function test($s,$a){    $flag = 0;    foreach($a as $k=>$v){        if($s >=$k){                if($flag<$v)                           $flag=$v;                    }    }    return $flag;}echo test($s,$a);


OK,這樣就解決了。3Q

??就可以了。

$a = array('40'=>'3','50'=>'5','10'=>'1');$s = 51;arsort($a,SORT_NUMERIC); // 先按key大小排序function test($s,$a){    foreach($a as $k=>$v){        if($s >=$k){            return $v;        }    }    return 0;}echo test($s,$a); // 5

規則都不好好的制定

$a = array('40'=>'3','50'=>'5','10'=>'1');$s = 51;function test($s,$a){  $flag = 0;  foreach($a as $k=>$v){    if($s >=$k){      $flag = max($flag, $v); //取大值    }  }  return $flag;}echo test($s,$a);
  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.