我正在准备一个面试问题.其中一个问题是还原一个句子.比如"它是一个令人敬畏的日子"到"令人敬畏的日子".在此之后,他们问是否有重复,你能否删除重复,如"我很好,他是好人","好他是,我是我" .
为了颠倒句子,我写了以下方法
public static string reversesentence(string one)
{
StringBuilder builder = new StringBuilder();
string[] split = one.Split(' ');
for (int i = split.Length-1; i >= 0; i--)
{
builder.Append(split[i]);
builder.Append(" ");
}
return builder.ToString();
}
Run Code Online (Sandbox Code Playgroud)
但我没有得到删除重复的想法.我可以在这里得到一些帮助.
Rob*_*Rob 10
这有效:
public static string reversesentence(string one)
{
Regex reg = new Regex("\\w+");
bool isFirst = true;
var usedWords = new HashSet<String>(StringComparer.InvariantCultureIgnoreCase);
return String.Join("", one.Split(' ').Reverse().Select((w => {
var trimmedWord = reg.Match(w).Value;
if (trimmedWord != null) {
var wasFirst = isFirst;
isFirst = false;
if (usedWords.Contains(trimmedWord)) //Is it duplicate?
return w.Replace(trimmedWord, ""); //Remove the duplicate phrase but keep punctuation
usedWords.Add(trimmedWord);
if (!wasFirst) //If it's the first word, don't add a leading space
return " " + w;
return w;
}
return null;
})));
}
Run Code Online (Sandbox Code Playgroud)
基本上,我们根据没有标点符号的单词来判断它是否与众不同.如果它已经存在,只需返回标点符号.如果它不存在,打印出包括标点符号在内的整个单词.
标点符号也会删除示例中的空格,这就是为什么我们不能这样做String.Join(" ", ...)(否则结果将good he Is , am I取而代之good he Is, am I
测试:
reversesentence("I am good, Is he good").Dump();
结果:
good he Is, am I
对于普通逆转:
String.Join(" ", text.Split(' ').Reverse())
Run Code Online (Sandbox Code Playgroud)
对于重复删除的逆转:
String.Join(" ", text.Split(' ').Reverse().Distinct())
Run Code Online (Sandbox Code Playgroud)
两者都适用于仅包含空格作为分隔符的字符串.当你介绍,当时的问题变得更加困难.这么多,你需要指定它应该如何处理.例如,应该"I am good, Is he good"成为"good he Is am I"或"good he Is , am I"?您在问题中的示例更改了案例,"Is"并将其","与其分组.这对我来说似乎不对.