(不一定每個之間的空間)我有這個字符串:倒車串句
[email protected]
我想它使用的.Net是
[email protected]
,但直出概念或想法會很好。
我現在正在做的是遍歷每個字符,找出它是否是「特殊字符」之一,並將所有先前的字符賦值給數組的變量,最後,我將它們全部加入一起從最後到第一。
有沒有可能更有效的方法來做到這一點?
(不一定每個之間的空間)我有這個字符串:倒車串句
[email protected]
我想它使用的.Net是
[email protected]
,但直出概念或想法會很好。
我現在正在做的是遍歷每個字符,找出它是否是「特殊字符」之一,並將所有先前的字符賦值給數組的變量,最後,我將它們全部加入一起從最後到第一。
有沒有可能更有效的方法來做到這一點?
有了一點正則表達式和Linq,這很簡單。
想法是,我們把單詞和非單詞字符作爲單獨的標記與正則表達式patten。然後,我們只需將其反轉並加入即可。
var tokens = Regex.Matches("[email protected]", @"\w+|\W")
.Cast<Match>()
.Select(x=>x.Value)
.Reverse();
string reversed = string.Concat(tokens);
[email protected]
這是經典的逐字反轉,在分隔符上有小的扭曲。解決這個問題的方法是逐個反轉每個單詞,然後反轉整個字符串。翻轉單詞時請勿觸摸分隔符。
第一步去如下:我們發現每個令牌的限制和反向到位,像這樣:
反向的結果,讓您所需的輸出:
[email protected] -> [email protected]
至於實施的話,你可以通過字符串轉換爲字符數組,使其在發生變化的做,編寫一個簡短的幫助方法,讓您在索引i
和j
之間反轉char
陣列的一部分。有了這個輔助方法,你所需要做的就是找到分隔符,併爲每個分隔的單詞調用助手,然後進行最後一次調用以翻轉整個句子。
這把我一會兒,但我喜歡它。結合@ Erick的答案,將分隔符中的字符串拆分爲令牌,這是一個很好的解決方案。 –
您可以使用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.Reverse
method反轉陣列。
然後你可以用Foreach循環將你的字符串縫合在一起。
由於@marjan-venema在評論中提到,您可以在此處使用每個分隔符填充並行數組。反轉它,然後在每個條目處使用Foreach循環時連接字符串。
當您不知道哪些分隔符是哪裏時,您如何縫合它? –
廢話,你是對的我沒有想到這一點。 – Erick
有一個並行數組,並用您遇到分隔符的原始序列填充它。反過來,並使用它縫合回來的字符串。 –
這裏的另一種方式使用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);
}
非常優雅的解決方案。謝謝。 – Stavm