2015-05-03 69 views
2

(不一定每個之間的空間)我有這個字符串:倒車串句

[email protected] 

我想它使用的.Net是

[email protected] 

,但直出概念或想法會很好。

我現在正在做的是遍歷每個字符,找出它是否是「特殊字符」之一,並將所有先前的字符賦值給數組的變量,最後,我將它們全部加入一起從最後到第一。

有沒有可能更有效的方法來做到這一點?

回答

4

有了一點正則表達式和Linq,這很簡單。

想法是,我們把單詞和非單詞字符作爲單獨的標記與正則表達式patten。然後,我們只需將其反轉並加入即可。

var tokens = Regex.Matches("[email protected]", @"\w+|\W") 
.Cast<Match>() 
.Select(x=>x.Value) 
.Reverse(); 

string reversed = string.Concat(tokens); 

輸出:Ideone - Demo

[email protected] 
+0

非常優雅的解決方案。謝謝。 – Stavm

9

這是經典的逐字反轉,在分隔符上有小的扭曲。解決這個問題的方法是逐個反轉每個單詞,然後反轉整個字符串。翻轉單詞時請勿觸摸分隔符。

第一步去如下:我們發現每個令牌的限制和反向到位,像這樣:

  1. [email protected]
  2. moc.example.is-這個@ MYNAME
  3. [email protected]
  4. [email protected]
  5. [email protected]
  6. moc.elpmaxe.si,SIHT @ emanym

反向的結果,讓您所需的輸出:

[email protected] -> [email protected] 

至於實施的話,你可以通過字符串轉換爲字符數組,使其在發生變化的做,編寫一個簡短的幫助方法,讓您在索引ij之間反轉char陣列的一部分。有了這個輔助方法,你所需要做的就是找到分隔符,併爲每個分隔的單詞調用助手,然後進行最後一次調用以翻轉整個句子。

+0

這把我一會兒,但我喜歡它。結合@ Erick的答案,將分隔符中的字符串拆分爲令牌,這是一個很好的解決方案。 –

1

您可以使用Split C#方法。

以下示例來自here

using System; 

class Program 
{ 
    static void Main() 
    { 
     string s = "there is a cat"; 
     // Split string on spaces. 
     // ... This will separate all the words. 
     string[] words = s.Split(' '); 

     foreach (string word in words) 
     { 
      Console.WriteLine(word); 
     } 
    } 
} 

就像例子得到一樣簡單。

然後您將Split()

string [] split = strings .Split(new Char [] {'.' , '@', '-' }, 
           StringSplitOptions.RemoveEmptyEntries); 

RemoveEmptyEntries只是刪除不必要的空條目添加更多的條件,你的陣列。

之後,您使用Array.Reversemethod反轉陣列。

然後你可以用Foreach循環將你的字符串縫合在一起。

由於@marjan-venema在評論中提到,您可以在此處使用每個分隔符填充並行數組。反轉它,然後在每個條目處使用Foreach循環時連接字符串。

+3

當您不知道哪些分隔符是哪裏時,您如何縫合它? –

+0

廢話,你是對的我沒有想到這一點。 – Erick

+1

有一個並行數組,並用您遇到分隔符的原始序列填充它。反過來,並使用它縫合回來的字符串。 –

0

這裏的另一種方式使用List,它有一個方便的方法Insert,以及一個Reverse的方法來做到這一點。

Insert方法允許您繼續將字符添加到列表中的相同索引(以及其他字符移動到更高索引後)。

因此,當您讀取原始字符串時,您可以在開始處繼續插入字符。一旦你來到一個分隔符,你將它添加到最後,並將你的插入位置調整到分隔符之後。

當你完成,你只需要調用Reverse並加入字符回字符串:

public static string ReverseWords(string words, char[] wordDelimeters) 
{ 
    var reversed = new List<char>(); 
    int insertPosition = 0; 

    for(int i = 0; i < words.Length; i++) 
    { 
     var character = words[i]; 

     if (wordDelimeters.Contains(character)) 
     { 
      reversed.Add(character); 
      insertPosition = i + 1; 
      continue; 
     } 

     reversed.Insert(insertPosition, character); 
    } 

    reversed.Reverse(); 
    return string.Join("", reversed);   
}