mysql 字串 反轉 字串反轉的9種方法

2021-10-20 22:22:55 字數 4872 閱讀 2496

1. 使用array.reverse方法

對於字串反轉,我們可以使用.net類庫自帶的array.reverse方法

public static string reversebyarray(string original)

char c = original.tochararray();

array.reverse(c);

return new string(c);

2. 使用字元快取

在面試或筆試中,往往要求不用任何類庫方法,那麼有朋友大概會使用類似下面這樣的迴圈方法

public static string reversebycharbuffer(this string original)

char c = original.tochararray();

int l = original.length;

char o = new char[l];

for (int i = 0; i < l ; i++)

o[i] = c[l - i - 1];

return new string(o);

當然,聰明的同學們一定會發現不必對這個字元陣列進行完全遍歷,通常情況下我們會只遍歷一半

public static string reversebycharbuffer2(string original)

char c = original.tochararray();

int l = original.length;

for (int i = 0; i < l / 2; i++)

char t = c[i];

c[i] = c[l - i - 1];

c[l - i - 1] = t;

return new string(c);

reversebycharbuffer使用了乙個新的陣列,而且遍歷了字元陣列的所有元素,因此時間和空間的開銷都要大於reversebycharbuffer2。

在array.reverse內部,呼叫了非託管方法tryszreverse,如果tryszreverse不成功,實際上也是呼叫了類似reversebycharbuffer2的方法。

if (!tryszreverse(array, index, length))

int num = index;

int num2 = (index + length) - 1;

object objarray = array as object;

if (objarray == null)

while (num < num2)

object obj3 = array.getvalue(num);

array.setvalue(array.getvalue(num2), num);

array.setvalue(obj3, num2);

num++;

num2--;

else

while (num < num2)

object obj2 = objarray[num];

objarray[num] = objarray[num2];

objarray[num2] = obj2;

num++;

num2--;

大致上我能想到的演算法就是這麼多了,但是我無意間發現了stackoverflow上的一篇帖子,才發現這麼乙個看似簡單的反轉演算法實現起來真可謂花樣繁多。

3. 使用stringbuilder

使用stringbuilder方法大致和reversebycharbuffer一樣,只不過不使用字元陣列做快取,而是使用stringbuilder。

public static string reversebystringbuilder(this string original)

stringbuilder sb = new stringbuilder(original.length);

for (int i = original.length - 1; i >= 0; i--)

return sb.tostring();

當然,你可以預見,這種演算法的效率不會比reversebycharbuffer要高。

我們可以像使用字元快取那樣,對使用stringbuilder方法進行優化,使其遍歷過程也減少一半

public static string reversebystringbuilder2(this string original)

stringbuilder sb = new stringbuilder(original);

for (int i = 0, j = original.length - 1; i <= j; i++, j--)

sb[i] = original[j];

sb[j] = original[i];

return sb.tostring();

以上這幾種方法按演算法角度來說,其實可以歸結為一類。然而下面的幾種演算法就完全不是同一型別的了。

使用棧4. 棧是乙個很神奇的資料結構。我們可以使用它後進先出的特性來對陣列進行反轉。先將陣列所有元素壓入棧,然後再取出,順序很自然地就與原先相反了。

public static string reversebystack(this string original)

stack stack = new stack();

foreach (char ch in original)

stack.push(ch);

char c = new char[original.length];

for (int i = 0; i < original.length; i++)

c[i] = stack.pop();

return new string(c);

兩次迴圈和棧的開銷無疑使這種方法成為目前為止開銷最大的方法。但使用棧這個資料結構的想法還是非常有價值的。

使用xor

5. 使用邏輯異或也可以進行反轉

public static string reversebyxor(string original)

char chararray = original.tochararray();

int l = original.length - 1;

for (int i = 0; i < l; i++, l--)

chararray[i] ^= chararray[l];

chararray[l] ^= chararray[i];

chararray[i] ^= chararray[l];

return new string(chararray);

6. 使用指標

使用指標可以達到最快的速度,但是unsafe**不是微軟所推薦的,在這裡我們就不多做討論了

public static unsafe string reversebypointer(this string original)

fixed (char* ptext = original)

char* pstart = ptext;

char* pend = ptext + original.length - 1;

for (int i = original.length / 2; i >= 0; i--)

char temp = *pstart;

*pstart++ = *pend;

*pend-- = temp;

return original;

7. 使用遞迴

對於反轉這類演算法,都可以使用遞迴方法

public static string reversebyrecursive(string original)

if (original.length == 1)

return original;

else

return original.substring(1).reversebyrecursive() + original[0];

8. 使用委託,還可以使**變得更加簡潔

public static string reversebyrecursive2(this string original)

func f = null;

f = s => s.length > 0 ? f(s.substring(1)) + s[0] : string.empty;

return f(original);

但是委託開銷大的弊病在這裡一點也沒有減少,以至於我做效能測試的時候導致系統假死甚至記憶體益處。

使用linq

9. system.enumerable裡提供了預設的reverse擴充套件方法,我們可以基於該方法來對string型別進行擴充套件

public static string reversebylinq(this string original)

return new string(original.reverse().toarray());

10.通過char陣列的方式遍歷反**

package string;

public class stringtest3 {

public static void main(string args)

string s="abcdefg";

string s2="";

char cs=s.tochararray();

for(int i=cs.length-1;i>=0;i--)

s2=s2+cs[i];

system.out.println("對字串進行反轉操作後為:"+s2);

stringbuffer sb=new stringbuffer("abcdefg");

stringbuffer sb2=sb.reverse();

system.out.println("對stringbuffer進行反轉操作後為:"+sb2);

字串反轉

據說一道微軟的面試題,要求考慮時間和空間的優化,下面給出幾種通常字串反轉的方法 1 直接陣列操作 char strreverse char str return str 這種做法原來的str沒有儲存,原來的str也改變了 2 指標操作 char strreverse char str return ...

字串反轉

include include include 方法一 將第乙個字元和最後乙個互換,第二個和倒數第二個互換,如此依次迴圈下去 char strrev1 const char str return tmp free tmp 方法二 不額外申請一片儲存字串的記憶體空間,通過中間變數來改變傳遞進來的字串裡...

字串反轉

解法一 第一次看到這題目,想到最簡單 最直覺的解法就是 遍歷字串,將第乙個字元和最後乙個交換,第二個和倒數第二個交換,依次迴圈,即可,於是有了第乙個解法 const char str return tmp 這裡是通過陣列的下標方式訪問字串的字元,實際上用指標直接操作即可。解法二正是基於此,實現 為 ...