给定一个字符串“hello there,compiler。”,除标点符号外,如何反转每个单词。因此,在完成后将打印出来:“olleh ereht,relipmoc。”而不是“olleh,ereht .relipmoc”
我的代码(忽略标点符号):
static string ReverseString(string s)
{
StringBuilder sb = new StringBuilder();
string[] words = s.Split(' ');
foreach (var word in words)
{
for (int i = word.Length - 1; i >= 0; i--)
{
sb.Append(word[i]);
}
sb.Append(" ");
}
return sb.ToString();
}
答案 0 :(得分:7)
我建议Split
(技巧:不仅仅在空格上,而是在非单词符号上 - 空格,逗号,点等),修改和最终Concat
:
using using System.Text.RegularExpressions;
...
string source = @"hello there, compiler.";
string result = string.Concat(Regex
.Split(source, @"(\W+)") // split on not word letter, separator preserved
.Select(letter => letter.Length > 0 && char.IsLetter(letter[0])
? string.Concat(letter.Reverse()) // reverse letter
: letter)); // keep separator intact
Console.Write(result);
结果:
olleh ereht, relipmoc.
答案 1 :(得分:1)
这是一个基于您原来的解决方案。只需检查反向词中的第一个字符是否为标点符号,如果保留它直到该词被反转,则将其添加回去。不是最优雅的解决方案,但它可以工作
static string ReverseString(string s)
{
var sb = new StringBuilder();
var words = s.Split(' ');
foreach (var word in words)
{
var toAdd = new char();
for (var i = word.Length -1; i >= 0; i--)
{
if (char.IsPunctuation(word[i]))
{
toAdd = word[i];
}
else
{
sb.Append(word[i]);
}
}
if (toAdd != new char())
{
sb.Append(toAdd);
}
sb.Append(" ");
}
return sb.ToString();
}
编辑: 以上代码的一个稍微紧凑的版本:
static string ReverseString(string s)
{
var sb = new StringBuilder();
foreach (var s1 in s.Split(' '))
{
var rev = s1.Reverse().ToList();
char punct;
if (char.IsPunctuation(punct = rev.First()))
{
rev.RemoveAt(0);
rev.Add(punct);
}
rev.Add(' ');
sb.Append(rev.ToArray());
}
return sb.ToString();
}