腾讯一道经典的面试题,我的解法思路是利用栈的原理作<em>和</em>的匹配判断,入栈时记录对应在输出数组里面的索引值,把不是<em>和</em>的正常字符存入输出数组中,索引值累加。如索引值已超过要求的长度,则遍历中断。
最后还留在栈里面的值就是要删除的没有配对的<em>,进行删除,最后输出正确的字符串。
/**
题目是:
假设有"123<em>abc</em>456<em>def</em>789"这么一个字符串,写一个函数,可以传入一个字符串,和一个要截取的长度。返回截取后的结果。
要求:
1 <em>和</em>标记不得计算在长度之内。
2 截取后的字符串,要保留原有<em>标签,不过如果最后有一个标签没有闭合,则去掉其开始标签。
示例:
题中的字符串,要截取长度5,则返回的字符串应该为:123ab,要截取长度8,应返回123<em>abc</em>45。
*/
/**
@author Tony
@blog http://fengweihong.iteye.com/
@date 2010-08-19
*/
function substr_new($string, $length) {
$str = str_replace(array('<', '>'), array(',<', '>,'), $string);
$array = explode(',', $str);
$echo = $stack = array();
$i = $j = 0;
foreach ($array as $v) {
if ($v == '<em>') {
$stack[] = array('index' => $j, 'value' => $v);
$echo[$j] = $v;
} elseif ($v == '</em>') {
array_pop($stack);
$echo[$j] = $v;
} else {
$strlen = strlen($v);
if ($i + $strlen > $length) {
$strlen = min($length - $i, $strlen);
$echo[$j] = substr($v, 0, $strlen);
} else {
$echo[$j] = $v;
}
$i += $strlen;
}
$j++;
if ($i >= $length) {
break;
}
}
foreach ($stack as $v) {
unset($echo[$v['index']]);
}
return implode('', $echo);
}
$string = '123<em>abc</em>456<em>def</em>789';
var_dump(substr_new($string, 8));
分享到:
相关推荐
面试必备书籍。 经典100题。关于数据结构,算法,各种大公司的面试题。
2016 年 杭电 笔试 第二题 Ruby解法
新数通 HCIE3.0 LAB完整版【拓扑+TS+TAC+解法】解法题库新增论述题HCIE笔试题库,同时赠送ENSP软件,用于2022年6月底HCIE数通笔试及LAB实验考试。 1、HCIE数通笔试背过里面题库去考全部通过 2、HCIE LAB拓扑及解法,...
微分方程数值解法 一书中主要习题解答 及其习题拓展,纯手工录入,公式清晰,步骤清晰
语言连贯题解法秘籍.ppt
考面试之前需要通过笔试和LAB,笔试和LAB实验题库拓扑解法在之前分享的资料里有都有题库拓扑到时下载练习一次通过很稳。本资源分享的是面试题库,用于2021年HCIE面试,面试须知: 1、面试时间一小时,一人一个小屋...
一元二次方程练习题解法.doc
信息系统项目管理师运筹学历年真题解法汇总笔记
信息系统项目管理师运筹学历年真题解法汇总笔记,整理了历年的真题和讲解,有需要的请下载。
历年全国数学建模试题及解法归纳及06~08年全国赛题评阅要点
高三数学选择题解法PPT课件.pptx
高三数学填空题解法PPT课件.pptx
中小学数学奥赛题解法分析.pdf
初中《道德与法治》选择题解法指导.ppt
2016年高考数学选择题解法选讲
高中政治漫画寓意型选择题解法.ppt
09年中考数学应用题解法集锦.ppt
例谈中考历史材料分析题解法.doc
15个顶级Java多线程面试题及回答.docx
极化恒等式优化向量题解法.doc