關於字串中取相同的字元問題(小學題)

憤怒的TryCatch發表於2015-12-01
有個新入門的學弟,在群裡發了這樣一個題目:

/*
*“出南門,走六步,見著六叔和六舅,叫聲六叔和六舅,借我六斗六升好綠豆;過了秋,打了豆,
* 還我六叔六舅六十六斗六升好綠 豆。”
* 有上面的字串內容。使用StringBuilder拼接獲取裡面所有的“舅”字和出現的次數。
* 例如:如果“和”字出現了6次,就輸出:和和和和和和6
*/

看題目,很簡單,很簡單。

應該是學校的老師給學生出的入門級題目。

考察的迴圈和string於stringbuilder之間的區別等等。

題目解法很簡單,常規解法就是迴圈一下,逐個匹配即可。

突然想,我們能不能不用迴圈呢?於是想了這個奇葩方法:

 1     static class Program
 2     {
 3         public static T LuckGo<T>(this T t, Action<T> action)
 4         {
 5             action(t);
 6             return t;
 7         }
 8 
 9         static void Main(string[] args)
10         {
11             /*
12                 *“出南門,走六步,見著六叔和六舅,叫聲六叔和六舅,借我六斗六升好綠豆;過了秋,打了豆,
13                 * 還我六叔六舅六十六斗六升好綠   豆。”
14                 * 有上面的字串內容。使用StringBuilder拼接獲取裡面所有的“舅”字和出現的次數。
15                 * 例如:如果“和”字出現了6次,就輸出:和和和和和和6    
16              */
17 
18 
19             new Lack() { Str = "", Charts = "“出南門,走六步,見著六叔和六舅,叫聲六叔和六舅,借我六斗六升好綠豆;過了秋,打了豆,還我六叔六舅六十六斗六升好綠豆。”" }
20                 .LuckGo(f => f.Begin())
21                 .LuckGo(f => f.Str = "")
22                 .LuckGo(f => f.Begin());
23 
24             Console.ReadLine();
25         }
26 
27     }
28 
29     public class Lack
30     {
31         /// <summary>
32         /// 目標字元
33         /// </summary>
34         public string Str { set; private get; }
35         /// <summary>
36         /// 源字串
37         /// </summary>
38         public string Charts { set; private get; }
39 
40         /// <summary>
41         /// 拆解方法
42         /// </summary>
43         public void Begin()
44         {
45             var strs = Charts.Replace(Str, "|").Split('|');
46             var stringBuilder = new StringBuilder();
47             for (var i = 0; i < strs.Length - 1; i++)
48             {
49                 stringBuilder.Append(Str);
50             }
51             stringBuilder.Append(strs.Length - 1);
52             Console.WriteLine(stringBuilder.ToString());
53         }
54 
55     }

執行結果:

思路:

我們不用常規的for來迴圈,我們先用replace來替換目標字元,換成特殊的位元組,然後用split來分組(這個split方法內部的實現過程我不清楚是如何完成的,可能也有迴圈的。)

然後直接組裝目標字元。完成輸出的資料。

結論:

理論上,這是應該可以提升效率的,但也不一定,因為replace和split方法內也是有迴圈的,個人認為,這樣寫,只是換了一種實現方式,效率應該不是很高。

請大牛講解replace和split了。

 

相關文章