2013-02-24 27 views
8
static void Main(string[] args) 
    { 
    string s = "ABCDEFGH"; 
    string newS = ShiftString(s); 
    Console.WriteLine(newS); 
    } 
    public static string ShiftString(string t) 
    { 
    char[] c = t.ToCharArray(); 
    char save = c[0]; 
    for (int i = 0; i < c.Length; i++) 
    { 
     if (c[i] != c[0]) 
     c[i] = c[i - 1]; 
    } 
    Console.WriteLine(c); 
    String s = new string(c); 
    return s; 
    } 

muszę przesunąć łańcuch s jedno miejsce w lewo, więc skończyć z napisu: „BCDEFGHA” więc pomyślałem o zmianie ciąg do tablicy char i pracę mojego stamtąd, ale nie jestem pewien, jak z powodzeniem sprawić, żeby to działało. Jestem prawie pewien, że potrzebuję pętli for, ale potrzebuję pomocy, jak przesunąć sekwencję znaków o jedno pole w lewo.Shifting ciąg w C#

+0

jak wygląda? – spajce

+0

Powiedziałeś, że skończysz z "BCDEFGHA". Czy tego nie oczekujesz? Jakiego wyniku oczekujesz po wprowadzeniu danych wejściowych "ABCDEFGH"? – zsong

+0

Przepraszam, mogłem wypróbować go niepoprawnie. Spodziewam się wyniku "BCDEFGHA", ale to nie jest to, co mam obecnie. – user2104751

Odpowiedz

8

co z tym?

public static string ShiftString(string t) 
{ 
    return t.Substring(1, t.Length - 1) + t.Substring(0, 1); 
} 
+0

Dzięki, że wydawało się, że działa, ale nie jestem w 100% pewien, jak to działa. Czy byłoby miło wyjaśnić, dlaczego tak się dzieje? – user2104751

+0

Wyobraź sobie, że masz ten ciąg 'ABC'. ta część 't. Podciąganie (1, t.Length - 1) 'da' BC', podczas gdy 't.Substring (0, 1)' zwróci 'A'. –

+2

Och, czekaj, mogę wiedzieć. Tstrumienie (1, t.Length - 1) zostało przetłumaczone na "BCDEFGH", a tstring (0, 1) przetłumaczono na "A", a łącząc je otrzymujemy "BCDEFGHA"? – user2104751

7

Można spróbować to:

s = s.Remove(0, 1) + s.Substring(0, 1); 

Jako metodę rozszerzenia:

public static class MyExtensions 
{ 
    public static string Shift(this string s, int count) 
    { 
     return s.Remove(0, count) + s.Substring(0, count); 
    } 
} 

Następnie można użyć:

s = s.Shift(1); 
+0

+1 za dodanie do rozszerzenia :) –

3

Osobiście bym to zrobić:

public static string ShiftString(string t){ 
    string firstLetter = t.Substring(0, 1); 

    return t.Substring(1) + firstLetter; 
} 
+0

Niestety nie mogę dać ci +1, ponieważ ta odpowiedź była już używana. –

2

Można skorzystać z faktu, że string jest IEnumerable<char>:

public static string ShiftString(string t){ 
    return new String(t.Skip(1).Concat(t).Take(t.Length).ToArray()); 
} 
1

Klasa StringBuilder daje lepszą wydajność

static string ShiftString(string str) 
{ 
    if (str == null) throw new ArgumentNullException(); 
    int strLen = str.Length; 
    if (strLen == 0) return string.Empty; 
    StringBuilder sb = new StringBuilder(strLen); 
    sb.Append(str, 1, strLen - 1); 
    sb.Append(str[0]); 
    return sb.ToString(); 
} 
5

algorytm rozwiązywania tego typu problemu o przesunięciu n pozycje to duplikacja łańcucha, łączenie się razem i pobranie podciągu. (n < długość (string))

string s = "ABCDEFGH"; 
string ss = s + s; // "ABCDEFGHABCDEFGH" 

jeśli chcesz przesunąć n pozycję, można zrobić

var result = ss.Substring(n, s.length); 
+0

+1 dzięki temu podejście jest naprawdę pomocne –

1

Poniżej metody wziąć liczbę n, który mówi, ile razy chcesz aby przesunąć/obrócić strunę. Wziąłem MOD przez długość łańcucha, jeśli liczba jest większa niż długość struny.

public static void Rotate(ref string str, int n) 
    { 
     //if the rotation/shift number is less than or =0 throw exception 
     if (n < 1) 
      throw new Exception("Negative number for rotation"); 
     //if the String is less than 1 character no need to shift 
     if (str.Length < 1) throw new Exception("0 length string"); 

     if (n > str.Length) // If number is greater than the length of the string then take MOD of the number 
     { 
      n = n % str.Length; 
     } 

     StringBuilder s1=new StringBuilder(str.Substring(n,(str.Length - n))); 
     s1.Append(str.Substring(0,n)); 
     str=s1.ToString(); 


    } 

/// Można dokonać wykorzystanie Przejdź i Take funkcje operacji Smyczkowych

public static void Rotate1(ref string str, int n) 
    { 
     if (n < 1) 
      throw new Exception("Negative number for rotation"); ; 
     if (str.Length < 1) throw new Exception("0 length string"); 

     if (n > str.Length) 
     { 
      n = n % str.Length; 
     } 

     str = String.Concat(str.Skip(n).Concat(str.Take(n))); 

    } 
0

można również osiągnąć, że z prostego rachunku LINQ:

Uwaga: ten sam może być osiągnięty za pomocą prostej pętli i/lub pętli

string a = "ABCDEFGH"; 
a = new string(Enumerable.Range(0, a.Length).Select(i => (a[(i+1)%a.Length])).ToArray());