2017-07-13 9 views
4

「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(); 
     } 

答えて

6

私はSplit(トリック示唆:だけでなく、スペースではなく、非単語のシンボルに - スペースを、コンマなどDOT)、修飾および最終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. 
+0

そこにいくつかのエレガントなコードでは、最もエレガントな解決策は、それが

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(); } 

編集]を動作します。ありがとうございました! –

+0

Regexの "not word"文字で分割することによる良い解決策 –

1

ここでは、元々持っていたものに基づいた解決策があります。逆の単語の最初の文字が句読点かどうかをチェックし、単語が逆になるまでそれを保持していればそれを戻します。 そして、上記のコードのもう少しコンパクト版:

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(); 
    } 
+0

まだ良い選択肢ですが、各単語の後ろに句読点を追加してください。ありがとうございました。 –

関連する問題