恶搞 关于腾讯的那道题截取字符串的题
假设有"123abc456def789"这么一个字符串,写一个函数,可以传入一个字符串,和一个要截取的长度。返回截取后的结果。
要求:
1 和标记不得计算在长度之内。
2 截取后的字符串,要保留原有标签,不过如果最后有一个标签没有闭合,则去掉其开始标签。
示例:
题中的字符串,要截取长度5,则返回的字符串应该为:123ab,要截取长度8,应返回123abc45。
5.3 可以把注释去掉{ $i=$j=0; while(strlen($saveString)') { $number[$j++][$k++]=$i; break; } }while($str[$i++] != '>'); } else { $saveString.=$str[$i]; /*if(strlen($saveString) == $size) { if($str[++$i] =='' : continue; case ' ' : break; default : $newstr .= $str[$i]; } } return $newstr;}function deleteReservedTag(&$string, &$number, $reserved) // 从标签组里去除 保留标签{ $stringLength = count($string); $reservedLength = count($reserved); for($i=0; $i123
abc45
6defg789';$size=15;$reserved = array //保留标签( '
', '
', '
', '
');$string[]=''; // 保存所有标签$number[][]=0; // 保存所有标签位置$saveString = ''; // 保存截取标签后的所有字符串$newString = ''; // 保存所有未截取标签的字符串find($str, $size, $string, $number, $saveString, $newString); // 查找标签deleteReservedTag($string, $number, $reserved); // 从标签组里去除 保留标签compare($string, $number); // 从标签组里去除 成对标签replace($string, $number, $newString);printf("截取长度:%d\n\n", $size);printf("完整长度:%s\n\n",$str);printf("处理结果:%s\n\n", $string);printf("截取长度:%s (%s)\n\n",$saveString,strlen($saveString));printf("未处理前:%s\n",$newString);?>
运算结果如下
------------------------------------------------------------------------------------
截取长度:15
完整长度:
123
abc45
6defg789
处理结果:123
abc45
6defg78
截取长度:123abc456defg78 (15)
未处理前:
123
abc45
6defg78
回复讨论(解决方案)
P4+768MB 机运行速度如下
内存使用情况:2176
算法运行时间(microtime):0.0012378692626953
欢迎各位 PHP 爱好者来 QQ群:23930992
程序处理一些特殊数据的时候会出问题,请把代码粘贴到上面
function filter($str) // 过滤标签,然后进行比较
{
$newstr = '';
$strLength = strlen($str);
for($i=0;$i {
switch($str[$i])
{
case ' case '/' : continue;
case '>' : continue;
case ' ' : break 2;
default : $newstr .= $str[$i];
}
}
return $newstr;
}
又修正一个错误,请把下面代码粘贴到上面
function replace(&$string, $number, $newString){ $tempString = ''; $saveStringLength = strlen($newString); $stringLength = count($string); for($i=0, $j=0; $i完整修改后的代码
5.3 可以把注释去掉{ $i=$j=0; while(strlen($saveString)') { $number[$j++][$k++]=$i; break; } }while($str[$i++] != '>'); } else { $saveString.=$str[$i]; /*if(strlen($saveString) == $size) { if($str[++$i] =='' : continue; case ' ' : break 2; default : $newstr .= $str[$i]; } } return $newstr;}function deleteReservedTag(&$string, &$number, $reserved) // 从标签组里去除 保留标签{ $stringLength = count($string); $reservedLength = count($reserved); for($i=0; $i364867的玉米小店
买家信用:0
卖家好评率:100.00%
买家好评率:0.00%
注册时间:2010年04月29日荣誉资质:';$size=160;$reserved = array //保留标签( '
', '
', '
', '
', '', '');$string[]=''; // 保存所有标签$number[][]=0; // 保存所有标签位置$saveString = ''; // 保存截取标签后的所有字符串$newString = ''; // 保存所有未截取标签的字符串find($str, $size, $string, $number, $saveString, $newString); // 查找标签deleteReservedTag($string, $number, $reserved); // 从标签组里去除 保留标签compare($string, $number); // 从标签组里去除 成对标签replace($string, $number, $newString);printf("截取长度:%d\n\n", $size);printf("完整长度:%s\n\n",$str);printf("处理结果:%s\n\n", $string);printf("截取长度:%s (%s)\n\n",$saveString,strlen($saveString));printf("未处理前:%s\n",$newString);echo "内存使用情况:",(memory_get_usage()-$stmem),"\n";echo "算法运行时间(microtime):",(microtime(true)-$sttime),"\n";?>
截取长度:160
完整长度:
364867的玉米小店买家信用:0 卖家好评率:100.00% 买家好评率:0.00% 注册时间:2010年04月29日 荣誉资质:
|
处理结果:
364867的玉米小店
买家信用:0
卖家好评率:100.00%
买家好评率:0.00%
注册
截取长度:
364867的玉米小店
买家信用:0
卖家好评率:100.00%
买家好评率:0.00%
注册 (160)
未处理前:
364867的玉米小店买家信用:0 卖家好评率:100.00% 买家好评率:0.00% 注册 内存使用情况:5096 算法运行时间(microtime):0.0040628910064697 精简后的代码 '); $number[$j++][$k]=$i; } else { $saveString.=$str[$i]; } $i++; } for($j=0; $j' : continue; case ' ' : break 2; default : $newstr .= $str[$i]; } } return $newstr;}function deleteReservedTag(&$string, &$number, $reserved) // 从标签组里去除 保留标签{ $stringLength = count($string); $reservedLength = count($reserved); for($i=0; $i123 研究得好透彻啊 人都去那了啊,郁闷了
$s = '123abc456def789def789def789def789';function subs($s, $len){//此函数参数有二:$s - 源字符串, $len - 要截取的长度 (当让你也可以将标签传进来,不过要进行其他操作) $s1 = $s; $s1 = preg_replace('//s', '', $s1); $sub = mb_substr($s1, 0, $len, 'gbk'); //处理成数组 $s2 = $s; $s2 = preg_replace('//s', '[p]', $s2); $arr = explode('[p]', $s2); $arr1 = $arr2 = array(); $num = count($arr); $num1 = $num2 = 0; $bs = 0; for($i = 0; $i = $len){ $num1 = $len - $num2 + strlen($arr[$i]); if($num1 != strlen($arr[$i]))$bs = 1 $s3 = mb_substr($arr[$i], 0, $num1, 'gbk'); $arr[$i] = $s3; $arr2 = array_slice($arr, 0, $i + 1); break; } } //处理数组,结合成所需要的成字符串 $num = count($arr2); $s4 = ''; for($i = 0; $i 专题推荐
|
上一篇: php的if else有关问题?
网友评论
文明上网理性发言,请遵守 新闻评论服务协议
我要评论