抛个砖:
1:<?php
if(is_array($_POST) && count($_POST))
{
  for($c=0,$len=strlen($_POST['target']); $c<$len; $c++)
  {
    $array[strtolower($_POST['target']{$c})] += 1;
  }
  foreach($array as $k=>$v)
  {
    echo $k.":".$v." ";
  }
}
?>
<form method="post">
  参照:<input name="target">
  <input type="submit">
</form>======================================================
2:<?php
if(is_array($_POST) && count($_POST))
{
  function getBigger($target)
  {
    global $array;
    foreach($array as $v)
    {
      if($v > $target) return $v;
    }
    return false;
  }  $result = "";
  $array = explode(" ", $_POST['array']);
  sort($array);
  $smallest = $array[0] ? $array[0] : $array[1];
  $len = strlen($_POST['target']);  if(in_array($_POST['target']{0}, $array))
  {
    $found = false;
    for($C=$len-1; $C>=0; $C--)
    {
      if($found)
      {
        $result .= $C==0 ? $_POST['target']{0} : $array[0];
      }
      else
      {
        if($C == $len-1)
        {
          $t = getBigger($_POST['target']{$C});
          if($t === false)
          {
            $found = false;
            $result .= $array[0];
          }
          else
          {
            $found = true;
            $result .= $t;
          }
        }
        elseif($C == 0)
        {
          $t = getBigger($_POST['target']{$C});
          if($t===false) $result.=$array[0].$smallest;
          else $result.=$t;
        }
        else $result.=$array[0];
      }
    }
  }
  else
  {
    $t = getBigger($_POST['target']{0});
    if($t === false)
    {
      for($c=0; $c<=$len-1; $c++) $result.=$array[0];
      $result .= $smallest;
    }
    else
    {
      for($c=0; $c<$len-1; $c++) $result.=$array[0];
      $result .= $t;
    }
  }
  echo strrev($result);
}
?>
<form method="post">
  集合:<input name="array">空格分割<br>
  参照:<input name="target">
  <input type="submit">
</form>

解决方案 »

  1.   

    第一个:function strnum($str){
    if(empty($str)){
    return ;
    }
    $arrstr = array();
    for($i=0;$i<strlen($str);$i++){
    if (array_key_exists(strtolower($str[$i]), $arrstr)) {
    $arrstr[strtolower($str[$i])]+=1;
    }elseif(array_key_exists(strtoupper($str[$i]), $arrstr)){
    $arrstr[strtoupper($str[$i])]+=+1;
    }else{
    $arrstr[$str[$i]]=1;
    }
    }
    foreach($arrstr as $key=>$value){
    $returnstr = $returnstr.$key.':'.$value.'&nbsp';
    }
    return $returnstr;
    }
    echo strnum('bCcd*ba');
      

  2.   

    第一条 substr_count 可以直接得出
      

  3.   

    to wasuka:
    第二题有一点问题:集合是0 1 2 3 4,参照是239881,你的结果就是200002
      

  4.   

    第一题:http://www.52lf.net/?p=116
    第二题:http://www.52lf.net/?p=118
      

  5.   

    代码不行
    第一题,实质是词频统计;这个PHP数组功能强大
    第二题:以前有人说过的,排列组合找最近值或排列方式
      

  6.   

    <?php 
    function test($str){ $str = strtolower($str); for($i=0;$i<strlen($str);$i++)
    {
    $ary[$str[$i]]++;
    } foreach($ary as $key=>$value)
    {
    echo $key.":".$value;
    }
    }$str = "bcCd*ba";test($str);
    ?> 
      

  7.   

    <?php
    function get_min($a,$b,$offest=0){
    if($offest==0){
    $b=(string)$b;
    sort($a);
    } $min='';$flag=0; if(is_every_char_in_array($a,$b))
    {
    for($i=strlen($b)-1;$i>=0;$i--){
    $bigger=get_bigger($a,$b[$i]);
    if($bigger){
    $min=substr($b,0,$i).$bigger;
    for($j=$i;$j<strlen($b)-1;$j++)
    $min.=$a[0];
    return $min;
    }
    }
    $min=get_min_not_zero($a);
    for($i=0;$i<strlen($b);$i++)
    $min.=$a[0];
    return $min;
    }

    for($i=$offest;$i<strlen($b);$i++){
    if($flag==0){
    if(get_equal($a,$b[$i])){
    return get_min($a,$b,++$i);
    } $bigger=get_bigger($a,$b[$i]);
    if($bigger){
    $min.=$bigger;
    $flag=1;
    }
    else{
    if(strlen($b)==1)
    return "$a[0]";
    $before_str=substr($b,0,$i);
    $min=get_min($a,$before_str).$a[0];
    for($j=$i+1;$j<strlen($b);$j++)
    $min.=$a[0];
    return $min;
    }
    }
    else{
    $min.=$a[0];
    }
    }
    return substr($b,0,$offest).$min;
    }
    function is_every_char_in_array($a,$b){
    for($i=0;$i<strlen($b);$i++){
    if(!in_array($b[$i],$a))
    return false;
    }
    return true;
    } function get_bigger($a,$c){
    foreach($a as $value){
    if($value>$c)
    return $value;
    }
    return false;
    }
    function get_equal($a,$c){
    foreach($a as $value){
    if($value==$c)
    return true;
    if($value>$c)
    return false;
    }
    return false;
    } function get_min_not_zero($a){
    foreach($a as $value){
    if($value>0)
    return $value;
    }
    die("all int is less than zero");
    }
    for($i=1;$i<=20;$i++){
    $d=(int)(rand()%1000);echo "$d\t";
    echo get_min(array(1,0,2,3),$d);
    echo "<br>";
    }
    ?>
      

  8.   

    第一题:
    <?php
    $str = strtolower('123421412213213asdwqEWqewqewqeqwewqe12312312');$n = 0;
    $result = array();
    while (isset($str{$n})) {
    $result[$str{$n++}]++;
    }print_r($result);更简单的解法
    <?php
    $str = strtolower('123421412213213asdwqEWqewqewqeqwewqe12312312');
    foreach (count_chars($str, 1) as $code => $total) {
    echo chr($code), ':', $total, "\n";
    }
      

  9.   

    <?php
    function getMinCom($sets, $num) {
    $result = array();
    $n = 0;
    $num = strval($num);

    sort($sets);

    while (isset($num{$n})) {
    $result[] = getMinNum4Index($sets, $num{$n++});
    }
    return implode('', $result);
    }function getMinNum4Index($sets, $num) {
    $first = 0;
    $last = count($sets);
    $bfMid = 0; while ($first < $last) {
    $mid = intval(($first + $last) / 2);

    $midValue = $sets[$mid]; if ($midValue >= $num) {
    $last = $mid;
    } else {
    $first = $mid;
    }
    if ($mid == $bfMid || $mid == 0) {
    return $midValue = $sets[$mid];
    }
    $bfMid = $mid;
    }
    }$sets = array(1, 5, 7);
    echo getMinCom($sets, 42156);再优化的话,就是缓存排序后的数组
    没有经过太严格的测试。。
      

  10.   


    <?
    function getMinNumberNotZero($AR)
    {
    return $AR[0]?$AR[0]:$AR[1];
    }
    function getMinNumber($AR)
    {
    return $AR[0];
    }
    function getMaxNumber($AR)
    {
    return $AR[count($AR)-1];
    }
    function getBigerNum($AR,$m)
    {
    foreach($AR as $k =>$v)
    if($v > $m)return $v;
    return false;
    }

    function getK($Ar,$k)
    {
    $MinNumberNotZero=strval(getMinNumberNotZero($Ar));
    $MinNumber=strval(getMinNumber($Ar));
    $MaxNumber=strval(getMaxNumber($Ar));
    $str_k=strval($k);
    $klen=strlen($str_k);
    $eq_max_num=intval(str_repeat($MaxNumber,$klen));

    if($eq_max_num <= $k)
    {
    return intval($MinNumberNotZero.str_repeat($MinNumber,$klen));
    }
    else
    {
    $retK="";
    for($i=0;$i<$klen;$i++)
    {
    $bit_k_num=intval($str_k[$i]);
    if(in_array($bit_k_num,$Ar))
    $retK.=$str_k[$i];
    else
    {
    $bignum=getBigerNum($Ar,$bit_k_num);
    $retK.=$bignum.str_repeat($MinNumber,$klen-$i);
    }
    }
    $retnum=intval($retK);
    if($retnum > $k)return $retnum;
    $retK[$klen-1]=getBigerNum($Ar,intval($retK[$klen-1]));
    return intval($retK);


    }
    $Ar=array(1,2,0);
    $k=23;
    sort($Ar);
    $Knum=getK($Ar,$k);
    echo $Knum;
    ?>
      

  11.   

    上面循环没break,
    还有可能出现相等的情况
    修改了一下<?
    function getMinNumberNotZero($AR)
    {
    return $AR[0]?$AR[0]:$AR[1];
    }
    function getMinNumber($AR)
    {
    return $AR[0];
    }
    function getMaxNumber($AR)
    {
    return $AR[count($AR)-1];
    }
    function getBigerNum($AR,$m)
    {
    foreach($AR as $k =>$v)
    if($v > $m)return $v;
    return $AR[count($AR)-1];
    }

    function getK($Ar,$k)
    {
    $MinNumberNotZero=strval(getMinNumberNotZero($Ar));
    $MinNumber=strval(getMinNumber($Ar));
    $MaxNumber=strval(getMaxNumber($Ar));
    $str_k=strval($k);
    $klen=strlen($str_k);
    $eq_max_num=intval(str_repeat($MaxNumber,$klen));

    if($eq_max_num <= $k)
    {
    return intval($MinNumberNotZero.str_repeat($MinNumber,$klen));
    }
    else
    {
    $retK="";
    for($i=0;$i<$klen;$i++)
    {
    $bit_k_num=intval($str_k[$i]);
    if(in_array($bit_k_num,$Ar))
    $retK.=$str_k[$i];
    else
    {
    $bignum=getBigerNum($Ar,$bit_k_num);
    $retK.=$bignum.str_repeat($MinNumber,$klen-$i);
    break;
    }
    }
    $retnum=intval($retK);
    if($retnum > $k)return $retnum;
    $retK_len = strlen($retK);
    for($i=$retK_len-1;$i>=0;$i--)
    {
    $bit_k_num = intval($retK[$i]);
    $bignum=getBigerNum($Ar,$bit_k_num);
    if($bignum > $bit_k_num)
    {
    $retK[$i]=strval($bignum);break;
    }
    }
    return intval($retK);


    }
    $Ar=array(1,5,7);
    $k=23;
    sort($Ar);
    $Knum=getK($Ar,42156);
    echo $Knum;
    ?>
      

  12.   

    $Ar=array(1,5,7);
    数组要处理下,不能出现重复元素,也不允许出现array(0),且已经排好序
      

  13.   


    <?
    function getMinNumberNotZero($AR)
    {
    return $AR[0]?$AR[0]:$AR[1];
    }
    function getMinNumber($AR)
    {
    return $AR[0];
    }
    function getMaxNumber($AR)
    {
    return $AR[count($AR)-1];
    }
    function getBigerNum($AR,$m)
    {
    foreach($AR as $k =>$v)
    if($v > $m)return $v;
    return $AR[count($AR)-1];
    }

    function getK($Ar,$k)
    {
    $MinNumberNotZero=strval(getMinNumberNotZero($Ar));
    $MinNumber=strval(getMinNumber($Ar));
    $MaxNumber=strval(getMaxNumber($Ar));
    $str_k=strval($k);
    $klen=strlen($str_k);
    $eq_max_num=intval(str_repeat($MaxNumber,$klen));

    if($eq_max_num <= $k)
    {
    return intval($MinNumberNotZero.str_repeat($MinNumber,$klen));
    }
    else
    {
    $retK="";$fc=true;
    for($i=0;$i<$klen;$i++)
    {
    $bit_k_num=intval($str_k[$i]);
    if(in_array($bit_k_num,$Ar))
    $retK.=$str_k[$i];
    else
    {
    $bignum=getBigerNum($Ar,$bit_k_num);
    $tmp_retK=$retK.$bignum.str_repeat($MinNumber,$klen-$i-1);
    if(intval($tmp_retK) >$k && $fc)
    {
    $retK.=$bignum.str_repeat($MinNumber,$klen-$i-1);
    break;
    }
    $retK.=$str_k[$i];
    $fc=false;
    }
    }
    $retnum=intval($retK);
    echo $retnum."-";
    if($retnum > $k)return $retnum;
    $retK_len = strlen($retK);
    $retK2="";
    for($i=$retK_len-1;$i>=0;$i--)
    {
    $bit_k_num = intval($retK[$i]);
    $bignum=strval(getBigerNum($Ar,$bit_k_num));
    $retK2=intval(substr($retK,0,$i).$bignum.str_repeat($MinNumber,$retK_len-$i-1));
    if($retK2 >$k)return $retK2;
    }
    return intval($retK2);


    }
    $Ar=array(0,1,3,4,6,7,9);
    sort($Ar);
    for($i = 0;$i< 1000;$i++)
    {
    $k=rand(1,99999999);
    echo $k.":".getK($Ar,$k)."<br>";
    }?>
      

  14.   


    <?
    function getMinNumberNotZero($AR)
    {
    return $AR[0]?$AR[0]:$AR[1];
    }
    function getMinNumber($AR)
    {
    return $AR[0];
    }
    function getMaxNumber($AR)
    {
    return $AR[count($AR)-1];
    }
    function getBigerNum($AR,$m)
    {
    foreach($AR as $k =>$v)
    if($v > $m)return $v;
    return $AR[count($AR)-1];
    }

    function getK($Ar,$k)
    {
    $MinNumberNotZero=strval(getMinNumberNotZero($Ar));
    $MinNumber=strval(getMinNumber($Ar));
    $MaxNumber=strval(getMaxNumber($Ar));
    $str_k=strval($k);
    $klen=strlen($str_k);
    $eq_max_num=intval(str_repeat($MaxNumber,$klen));

    if($eq_max_num <= $k)
    {
    return intval($MinNumberNotZero.str_repeat($MinNumber,$klen));
    }
    else
    {
    $retK="";
    for($i=$klen-1;$i>=0;$i--)
    {
    $bit_k_num = intval($str_k[$i]);
    $bignum=strval(getBigerNum($Ar,$bit_k_num));
    $retK=intval(substr($str_k,0,$i).$bignum.str_repeat($MinNumber,$klen-$i-1));
    if($retK >$k)return $retK;
    }
    return intval($retK);

    return intval($retK);

    }
    $Ar=array(0,1,2,3,4,5,6,7,8,9);
    sort($Ar);
    for($i = 0;$i< 1000;$i++)
    {
    $k=rand(1,99999999);
    echo $k.":".getK($Ar,$k)."<br>";
    }?>
      

  15.   


    <?
    function getMinNumberNotZero($AR)
    {
    return $AR[0]?$AR[0]:$AR[1];
    }
    function getMinNumber($AR)
    {
    return $AR[0];
    }
    function getMaxNumber($AR)
    {
    return $AR[count($AR)-1];
    }
    function getBigerNum($AR,$m)
    {
    foreach($AR as $k =>$v)
    if($v > $m)return $v;
    return $AR[count($AR)-1];
    }

    function getK($Ar,$k)
    {
    $MinNumberNotZero=strval(getMinNumberNotZero($Ar));
    $MinNumber=strval(getMinNumber($Ar));
    $MaxNumber=strval(getMaxNumber($Ar));
    $str_k=strval($k);
    $klen=strlen($str_k);
    $eq_max_num=intval(str_repeat($MaxNumber,$klen));

    if($eq_max_num <= $k)
    {
    return intval($MinNumberNotZero.str_repeat($MinNumber,$klen));
    }
    else
    {

    $retK="";$fc=true;
    for($i=0;$i<$klen;$i++)
    {
    $bit_k_num=intval($str_k[$i]);
    if(in_array($bit_k_num,$Ar))
    $retK.=$str_k[$i];
    else
    {
    $bignum=getBigerNum($Ar,$bit_k_num);
    $tmp_retK=$retK.$bignum.str_repeat($MinNumber,$klen-$i-1);
    if(intval($tmp_retK) >$k && $fc)
    {
    $retK.=$bignum.str_repeat($MinNumber,$klen-$i-1);
    break;
    }
    $retK.=$bignum;
    $fc=false;
    }
    }
    $retnum=intval($retK);
    echo $retnum."-";
    if($retnum > $k)return $retnum;
    $retK_len = strlen($retK);
    $retK2="";
    for($i=$retK_len-1;$i>=0;$i--)
    {
    $bit_k_num = intval($retK[$i]);
    $bignum=strval(getBigerNum($Ar,$bit_k_num));
    $retK2=intval(substr($retK,0,$i).$bignum.str_repeat($MinNumber,$retK_len-$i-1));
    if($retK2 >$k)return $retK2;
    }
    return intval($retK2);


    }
    $Ar=array(0,1,2,3);
    sort($Ar);
    for($i = 0;$i< 1000;$i++)
    {
    $k=rand(1,99999999);
    echo $k.":".getK($Ar,$k)."<br>";
    }?>
      

  16.   

    改正了上面一个bug.
    <?php
    function get_min($a,$b,$offest=0){
    if($offest==0){
    $b=(string)$b;
    sort($a);
    } $min='';$flag=0; if(is_every_char_in_array($a,$b))
    {
    for($i=strlen($b)-1;$i>=0;$i--){
    $bigger=get_bigger($a,$b[$i]);
    if($bigger){
    $min=substr($b,0,$i).$bigger;
    for($j=$i;$j<strlen($b)-1;$j++)
    $min.=$a[0];
    return $min;
    }
    }
    $min=get_min_not_zero($a);
    for($i=0;$i<strlen($b);$i++)
    $min.=$a[0];
    return $min;
    }

    for($i=$offest;$i<strlen($b);$i++){
    if($flag==0){
    if(get_equal($a,$b[$i])){
    return get_min($a,$b,++$i);
    } $bigger=get_bigger($a,$b[$i]);
    if($bigger){
    $min.=$bigger;
    $flag=1;
    }
    else{
    if(strlen($b)==1)
    return get_min_not_zero($a).$a[0];
    $before_str=substr($b,0,$i);
    $min=get_min($a,$before_str).$a[0];
    for($j=$i+1;$j<strlen($b);$j++)
    $min.=$a[0];
    return $min;
    }
    }
    else{
    $min.=$a[0];
    }
    }
    return substr($b,0,$offest).$min;
    }
    function is_every_char_in_array($a,$b){
    for($i=0;$i<strlen($b);$i++){
    if(!in_array($b[$i],$a))
    return false;
    }
    return true;
    } function get_bigger($a,$c){
    foreach($a as $value){
    if($value>$c)
    return $value;
    }
    return false;
    }
    function get_equal($a,$c){
    foreach($a as $value){
    if($value==$c)
    return true;
    if($value>$c)
    return false;
    }
    return false;
    } function get_min_not_zero($a){
    foreach($a as $value){
    if($value>0)
    return $value;
    }
    die("all int is less than zero");
    }
    for($i=1;$i<=20;$i++){
    $d=(int)(rand()%1000);echo "$d\t";
    echo get_min(array(1,0,2,3),$d);
    echo "<br>";
    }
    ?>
      

  17.   

    $sftr='bcCd*ba';
    $sftr=strtolower($sftr);
    $len=strlen($sftr);
    $arr=array();
    for ($i=0;$i<$len;$i++)
    {
    $arr[$i]=$sftr[$i];
    }
    $arr_1=array_count_values($arr);
    foreach ($arr_1 as $key=>$val)
    {
    echo $key.':'.$val.'&nbsp';
    }
      

  18.   

    <?php 
    function test($str){ $str = strtolower($str); for($i=0;$i <strlen($str);$i++) 

    $ary[$str[$i]]++; 
    } foreach($ary as $key=>$value) 

    echo $key.":".$value; 

    } $str = "bcCd*ba"; test($str); 
    ?> 
    14楼
    echo $key.":".$value 中$key 和 $value.
    值从哪来,怎么得到的。
    谢谢。。
      

  19.   


    有没有规定用什么语言?
    JS可以不?
    还是用PHP?
      

  20.   

    第一题最简单了第二题说下思路:
    A=[0,1,3,8]这个应该算是一个数组
    比较简单利用这个数组组合出一些数字来,然后与K比较,挑出大于K的数,再从中选择最小的整数
      

  21.   

    无聊,标准 标题党
    这种问题,也许第一个php中还能用到,第二个估计10几年编码都用不到。顺便提醒下coder们,做了这行,如果这些都没概念,最好好好温习下。
    但具体到做网络编程,尤其是web程序,基本上这个不会出现。感兴趣的当基础,不感兴趣的还不如学学用得上的东西。
    博文不如精专。