日期:2014-05-17  浏览次数:20498 次

噢3个数字之间纠缠不清的故事...
嘿嘿,标题党又来了。话说朋友问我个问题,如何判断3个数字是顺的?比如 123 321 456 654 465 ...901 901 019

也就是根据数值判断是3个数字是否是相连内的成员

我的想法是 先分割,取得3个数里最小的,然后判断剩下的两个是否都在里面
比如 321 取得1 然后判断 23 是否存在,如果存在就能确定.

特殊的901 直接定义一个数组进行判断,判断是否包含0 如果是 判断是否包含9和1 ...(这里可能需要排除012)

不知道各位有没有其他更简便的方式?



------解决方案--------------------
可以挨着判断,比如一个为234,取出2,那么第二位就是3或者1,记录下是增还是减,然后就可以递归判断后面的n位,这样可以适合多个数字的判断
------解决方案--------------------
我的想法是:只真对数子哈:
直接将之截取放入数组中!然后数组安小-》大排个序,在取中间数去和两边的数比较判断;


------解决方案--------------------
想到一个,019 特殊情况 之和为10 ,其他情况之和为中间数*3 . 代码如下:
PHP code
function foo($s){
      $arr=str_split($s);
      if(in_array('9',$arr))
             return (array_sum($arr)==10) ;
      sort($arr,SORT_NUMERIC);
      return array_sum($arr)==$arr[1]*3 ;
}
var_dump(foo('019'));   //bool(true)
var_dump(foo('243'));   //bool(true)

------解决方案--------------------
一般的,对于 $n, $n∈{123 321 456 654 465 ..}
可以有:
$t = str_split($n);
if( array_sum($t) == (reset($t)+end($t))*count($t)/2 ) echo 'ok';

但是对于认定 901、109 为连续,就超出一般的认知了
------解决方案--------------------
不能判断能够相加被3除就行,比如 258..
------解决方案--------------------
PHP code
$temp = '0123456789 089 019';
$samples = array(123, 321, 456, 654, 465, 901, 109, '019', 890, 908, 135, 250);
foreach ( $samples as $value ) {
    $ds = str_split( $value );
    sort( $ds );
    $ds = implode( '', $ds );
    $result = ( strstr( $temp, $ds ) !== false ) ? 'yes' : 'no';
    echo "{$value} - {$ds} : {$result}<br>";
}