今日面试有一道面试题没解出来,郁闷
今天面试有一道面试题没解出来,郁闷啊
假设有"123<em>abc</em>456<em>def</em>789"这么一个字符串,写一个函数,可以传入一个字符串,和一个要截取的长度。返回截取后的结果。
要求:
1 <em>和</em>标记不得计算在长度之内。
2 截取后的字符串,要保留原有<em>标签,不过如果最后有一个标签没有闭合,则去掉其开始标签。
示例:
题中的字符串,要截取长度5,则返回的字符串应该为:123ab,要截取长度8,应返回123<em>abc</em>45。
百度有PHP版本的答案,但看不懂
------解决方案--------------------
static string GetString(string source, int len)
{
string newSource = source.Replace("<em>", "");
newSource = newSource.Replace("</em>", "");
if (newSource.Length < len)
{
throw new Exception("要截取的长度超出了限制");
}
int lastIndex = source.LastIndexOf("</em>");
string endValue = lastIndex < source.Length - 5 ? source.Substring(lastIndex + 5, source.Length - lastIndex - 5) : "";
StringBuilder sb = new StringBuilder();
MatchCollection maths = Regex.Matches(source, "(?<value>[^>]*)(?<em>[<][/]?em[>])");
for (int i = 0; i < maths.Count; i++)
{
string value = maths[i].Groups["value"].Value;
string em = maths[i].Groups["em"].Value;
if (value.Length <= len)
{
if (em == "</em>")
{
sb.AppendFormat("<em>{0}</em>", value);
}
else
{
sb.Append(value);
}
len -= value.Length;
}
else
{
sb.Append(value.Substring(0, len));
len -= value.Length;
break;
}
}
if (len > 0)
{
sb.Append(endValue.Substring(0, len));
}
return sb.ToString();
}
坐等更好的办法
假设有"123<em>abc</em>456<em>def</em>789"这么一个字符串,写一个函数,可以传入一个字符串,和一个要截取的长度。返回截取后的结果。
要求:
1 <em>和</em>标记不得计算在长度之内。
2 截取后的字符串,要保留原有<em>标签,不过如果最后有一个标签没有闭合,则去掉其开始标签。
示例:
题中的字符串,要截取长度5,则返回的字符串应该为:123ab,要截取长度8,应返回123<em>abc</em>45。
百度有PHP版本的答案,但看不懂
------解决方案--------------------
static string GetString(string source, int len)
{
string newSource = source.Replace("<em>", "");
newSource = newSource.Replace("</em>", "");
if (newSource.Length < len)
{
throw new Exception("要截取的长度超出了限制");
}
int lastIndex = source.LastIndexOf("</em>");
string endValue = lastIndex < source.Length - 5 ? source.Substring(lastIndex + 5, source.Length - lastIndex - 5) : "";
StringBuilder sb = new StringBuilder();
MatchCollection maths = Regex.Matches(source, "(?<value>[^>]*)(?<em>[<][/]?em[>])");
for (int i = 0; i < maths.Count; i++)
{
string value = maths[i].Groups["value"].Value;
string em = maths[i].Groups["em"].Value;
if (value.Length <= len)
{
if (em == "</em>")
{
sb.AppendFormat("<em>{0}</em>", value);
}
else
{
sb.Append(value);
}
len -= value.Length;
}
else
{
sb.Append(value.Substring(0, len));
len -= value.Length;
break;
}
}
if (len > 0)
{
sb.Append(endValue.Substring(0, len));
}
return sb.ToString();
}
坐等更好的办法