ホームページ > バックエンド開発 > PHPチュートリアル > 小さなアルゴリズムの問​​題

小さなアルゴリズムの問​​題

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
リリース: 2016-06-23 13:37:12
オリジナル
853 人が閲覧しました

例: 電話料金をリチャージする場合、10 元を超えるリチャージの場合は 1 元の電話クレジットが付与され、50 元を超えるリチャージの場合は 5 元の電話クレジットが付与されます。

それで、この時、私は 51 元の電話クレジットをリチャージしていました。なぜ、50 元のヒットで 5 元の電話クレジットが得られたのに、この時点では、もう 1 元の電話クレジットを得ることができませんでした。 10元以上。

ボス、チェックしてください

$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 に置き換えると= 配列('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);
ログイン後にコピー

関連ラベル:
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート