原語位移算法
今天介紹一個有趣的算法——位移算法,此算法來源於《編程珠璣-第二版》,是爲了解決在最小空間內完成鏈表中的位移問題。書中用左右手作了個例子,通俗的講解位移算法。由於書中沒有代碼,因此我本身實現了一個,和你們一塊兒學習。此代碼是如此簡單,第一次運行就直接經過。真不是知道Brain Kernighan和P.J.Plauger兩位大神在1981年是咋想出來的。
c#源代碼以下:
/// <summary>
/// 原語位移算法
/// 原語一般由若干條指令組成,用來實現某個特定的操做。經過一段不可分割的或不可中斷的程序實現其功能。
/// 算法來源參考《編程珠璣 第二版》 P24 原語的力量一節
/// </summary>
public class PrimitiveDisplacement
{
private PrimitiveDisplacement() { }
/// <summary>
/// 偏移計算
/// </summary>
/// <param name="list">泛型數組</param>
/// <param name="offset">偏移量(偏移量不得大於泛型數組長度)</param>
/// <returns>泛型數組</returns>
public static string Displace(string str, int offset)
{
int length = str.Length;
offset = offset % length;
string s1 = str.Substring(0, offset);
s1 = Turn(s1);
string s2 = str.Substring(offset, length - offset);
s2 = Turn(s2);
return Turn(s1 + s2);
}
/// <summary>
/// 位置互換算法
/// </summary>
/// <param name="str">字符串</param>
/// <returns>互換位置後的字符串</returns>
private static string Turn(string str)
{
int length = str.Length;
switch (length)
{
case 0:
case 1:
return str;
case 2:
return str[1].ToString() + str[0].ToString();
default:
string s1 = str.Substring(0, length / 2);
s1 = Turn(s1);
string s2 = str.Substring(length / 2, length - length / 2);
s2 = Turn(s2);
return s2 + s1;
}
}
}
單元測試以下:
[TestMethod()]
public void DisplaceTest()
{
string actual = PrimitiveDisplacement.Displace("abcdefgh", 3);
Assert.AreEqual("defghabc", actual);
}
[TestMethod()]
public void TurnTest()
{
string actual = PrimitiveDisplacement_Accessor.Turn("abcdefgh");
Assert.AreEqual("hgfedcba", actual);
}算法