$amount = 100; //110,90,200
$arr = [98,100,100,120,150,160,183];
如上:變量$amount跟$arr進(jìn)行對比,如果變量在數(shù)組中,則返回數(shù)組中的下標(biāo)值;
如果變量不在數(shù)組中,先檢測變量是否在哪兩個值(AB)之間,如果在,則返回這AB的下標(biāo);
如果不在兩個值之間,若變量小于數(shù)組的第一個值,則返回下標(biāo)0;
若變量大于數(shù)組的最后的值,則返回數(shù)組長度減一。
即:
$amount = 100; 返回 [1,2];
$amount = 110; 返回 [2,3];
$amount = 90; 返回 [0];
$amount = 200; 返回 [6];
下面是我寫的代碼,求精簡。
$key = []; //下標(biāo)值的數(shù)組
$count = count($arr) - 1;
foreach($arr as $k => $v){
if($amount == $v){
$key[] = $k;
}
}
if(empty($key)){
foreach($arr as $k => $v){
if($amount < $arr[0]){
$key[] = '';
break;
}
}
}
if(empty($key)){
foreach($arr as $k => $v){
if($amount > $arr[$count]){
$key[] = $count;
break;
}
}
}
if(empty($key)){
foreach($arr as $k => $v){
if($amount >= $arr[$k] && $amount < $arr[$k + 1]){
$key[] = $k;
$key[] = $k + 1;
}
}
}
var_dump($key);
function test($amount){
$arr = [98,100,100,120,150,160,183];
$max = max($arr);
$min = min($arr);
if($amount > $max){
return count($arr)-1;
}
if($amount < $min){
return 0;
}
foreach($arr as $key => $val){
if($amount == $val){
$tmp[] = $key;
}
}
if(!empty($tmp)){
return $tmp;
}
foreach($arr as $key => $val){
if($amount < $val){
continue;
}else{
$tmp[] = $key;
}
}
$return[] = max($tmp);
$return[] = max($tmp)+1;
return $return;
}
var_dump(test(99));
與其一個個判斷,不如把所有的結(jié)果都先拿到,再根據(jù)結(jié)果選擇想輸出的內(nèi)容
$amount = 100; //110,90,200
$arr = [98, 100, 100, 120, 150, 160, 183];
$equal = [];
$contain = [];
$result = [($amount > $arr[count($arr) - 1] ? count($arr) - 2 : 0)];
foreach ($arr as $index => $value) {
if ($amount === $value) {
$equal[] = $index;
} else if ($value < $amount) {
$contain[0] = $index;
} else if (count($contain) === 1) {
$contain[] = $index;
}
}
$result = count($equal) ? $equal : (count($contain) ? $contain : $result);
var_dump($result);
剛看到這一題,就想到了二分查找法, 但是有個問題是,數(shù)組元素是可以重復(fù)的,還要返回所有重復(fù)的值的index,所以,只好在找到匹配值的時候,再做個while了
<?php
$arr = [100,100,100,100,120,150,160,183,200];
function find($x,$arr){
$low = 0;
$len = count($arr);
$high =$len-1;
$result = [];
while ($low <= $high){
$middle = (int)round(($high + $low ) / 2);
if($x == $arr[$middle]){
//result = [middle]
while($low<=$high){
if($arr[$low] === $x){
array_push($result,$low);
}
$low++;
}
break;
} else if ($x>$arr[$middle]){
$low = $middle+1;
} else {
$high = $middle-1;
}
}
if(count($result) === 0 ){
$result = [$high,$low];
if($result[0]<=0){
return [0];
}
if($result[0] === $len-1 ){
return [$len-1];
}
}
return $result;
}
$d = find(100,$arr);
var_dump($d);
我寫的時候是用javascript 寫的,最大限度的避免使用語言的內(nèi)置函數(shù),加上php和javascript 都屬于c like的語言,所以這段代碼從javascript改成php 基本就是在變量前面加了個$
javascript 在線運(yùn)行可以看下面
http://jsbin.com/lazuwexuji/1...
精簡后的
<?php
$amount = 110; //110,90,200
$arr = [98,100,100,120,150,160,183];
$key = [];
$arr_length = count($arr);
for ($i=0; $i<$arr_length; $i++) {
if($amount == $arr[$i] || (empty($key) && $amount > $arr[$i] && $i == $arr_length - 1)){
$key[]=$i;
}
if(empty($key) && $amount < $arr[$i]) {
$i-1>=0 ? array_push($key, $i-1, $i) : $key[]=$i;
break;
}
}
var_dump($key);
?>
//在假設(shè)已經(jīng)做過去重和排序的時候:
$arr = [];
$r = rand(5,10);
for($i=0;$i<$r;$i++){
$arr[] = rand(1,10) + ($i>1?$arr[$i-1]:0);
}
$m = rand(0,100);
// main function
$l = $c = $r = 0;
foreach( $arr as $k => $v ){
if($v === $m){
$c = $k;
}else if($v<$m){
$l = $k;
$r = $k+1;
}
}
$key = ($c||!$l ) ? [$c] : ( $r===count($arr) ? [$l] : [$l,$r] );
// test
var_dump( $arr );
var_dump( $m );
var_dump( $l );
var_dump( $c );
var_dump( $r );
var_dump( $key );
自己拿去跑一下吧
<?php
function func($amount,$arr)
{
//若變量小于數(shù)組的第一個值,則返回下標(biāo)0;
if($arr[0] > $amount)
{
return [0];
}
$in = [];
$notin = [];
foreach($arr as $key => $value)
{
//如果變量在數(shù)組中,則返回數(shù)組中的下標(biāo)值;
if($value == $amount)
{
$in[] = $key;
}
//如果變量不在數(shù)組中,先檢測變量是否在哪兩個值(AB)之間,如果在,則返回這AB的下標(biāo);
elseif($value > $amount)
{
$notin[] = $key - 1;
$notin[] = $key;
break;
}
}
if(!empty($in))
{
return $in;
}
elseif(!empty($notin))
{
return $notin;
}
else
{
//若變量大于數(shù)組的最后的值,則返回數(shù)組長度減一。
return [count($arr) - 1];
}
}
$arr = [98,100,100,120,150,160,183];
var_dump(func(100,$arr),[1,2]);
var_dump(func(110,$arr),[2,3]);
var_dump(func(90,$arr),[0]);
var_dump(func(200,$arr),[6]);
function calcIndex($value, $resource = [])
{
if ($value < min($resource)) {
return [0];
} else if ($value > max($resource)) {
return [count($resource) - 1];
}
$result = [];
foreach ($resource as $index => $item) {
if ($item == $value) {
$result[] = $index;
} else if ($index < count($resource) - 1 && $value > $item && $value < $resource[$index + 1]) {
$result = [$index, $index + 1];
}
}
return $result;
}
北大青鳥APTECH成立于1999年。依托北京大學(xué)優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國家
北大青鳥中博軟件學(xué)院創(chuàng)立于2003年,作為華東區(qū)著名互聯(lián)網(wǎng)學(xué)院和江蘇省首批服務(wù)外包人才培訓(xùn)基地,中博成功培育了近30000名軟件工程師走向高薪崗位,合作企業(yè)超4
中公教育集團(tuán)創(chuàng)建于1999年,經(jīng)過二十年潛心發(fā)展,已由一家北大畢業(yè)生自主創(chuàng)業(yè)的信息技術(shù)與教育服務(wù)機(jī)構(gòu),發(fā)展為教育服務(wù)業(yè)的綜合性企業(yè)集團(tuán),成為集合面授教學(xué)培訓(xùn)、網(wǎng)
達(dá)內(nèi)教育集團(tuán)成立于2002年,是一家由留學(xué)海歸創(chuàng)辦的高端職業(yè)教育培訓(xùn)機(jī)構(gòu),是中國一站式人才培養(yǎng)平臺、一站式人才輸送平臺。2014年4月3日在美國成功上市,融資1
曾工作于聯(lián)想擔(dān)任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔(dān)任項(xiàng)目經(jīng)理從事移動互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍(lán)懿科技有限責(zé)任公司從事總經(jīng)理職務(wù)負(fù)責(zé)iOS教學(xué)及管理工作。
浪潮集團(tuán)項(xiàng)目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺面向?qū)ο箝_發(fā)經(jīng)驗(yàn),技術(shù)功底深厚。 授課風(fēng)格 授課風(fēng)格清新自然、條理清晰、主次分明、重點(diǎn)難點(diǎn)突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁制作和網(wǎng)頁游戲開發(fā)。
具有10 年的Java 企業(yè)應(yīng)用開發(fā)經(jīng)驗(yàn)。曾經(jīng)歷任德國Software AG 技術(shù)顧問,美國Dachieve 系統(tǒng)架構(gòu)師,美國AngelEngineers Inc. 系統(tǒng)架構(gòu)師。