嘿嘿,标题党又来了。话说朋友问我个问题,如何判断3个数字是顺的?比如 123 321 456 654 465 ...901 901 019也就是根据数值判断是3个数字是否是相连内的成员我的想法是 先分割,取得3个数里最小的,然后判断剩下的两个是否都在里面
比如 321 取得1 然后判断 23 是否存在,如果存在就能确定.特殊的901 直接定义一个数组进行判断,判断是否包含0 如果是 判断是否包含9和1 ...(这里可能需要排除012)不知道各位有没有其他更简便的方式?

解决方案 »

  1.   

    想到一个,019 特殊情况 之和为10 ,其他情况之和为中间数*3  . 代码如下:
    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)
      

  2.   

    一般的,对于 $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.   

    $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>";
    }
      

  4.   

    怎么结贴了。仔细一看,#3 代码对于 089 有问题。改进:
    function foo($s){
          $arr=str_split($s);
          if(in_array('9',$arr) && in_array('0',$arr))
                 return (array_sum($arr)==10 || array_sum($arr)==17) ;
          sort($arr,SORT_NUMERIC);
          return array_sum($arr)==$arr[1]*3 ;
    }
    var_dump(foo('019'));   //bool(true)
    var_dump(foo('243'));   //bool(true)
    var_dump(foo('089'));   //bool(true)