2010-11-22 5 views
3

Допустим, у вас есть строка «Это тест»вопрос интервью - как пройти через массив с другой отправной точкой?

я передать его методу Zee, как («Это тест», 1) и хотите «тест Это»;

Передаю его методу zee, например («Это тест», 2) и хотите «тест Это»;

Число может превышать полные слова в переменной. Если это так, то нужно обойти.

Я начал с ....

public static string zee(string origString, int i) 
{ 
    StringBuilder sb = new StringBuilder(); 

    ArrayList list = new ArrayList(); 
    list.AddRange(origString.Split(' ')); 

    // not sure here - 
    for (int c = i; c < (list.Count + i); c++) 
    { 
     sb.AppendFormat("{0} ", list[c]); 
    } 

    return sb.ToString(); 
} 
+5

Возможно, это то, что вы должны занять некоторое время, чтобы работать самостоятельно. Это не сложный вопрос, и, вероятно, это хороший опыт для экспериментов с различными способами решения. – NotMe 2010-11-22 22:40:37

+6

Любая причина, по которой вы используете `ArrayList`, а не` List `? Это 2010 :) – 2010-11-22 22:42:25

+0

@ Jon, на самом деле это конец 2010 года. Это делает вещи еще хуже с C# 5.0, стучащими в дверь :-) – 2010-11-22 22:50:37

ответ

5
for(int j=0; j < list.length; j++){ 
    int idx = (j + i) % list.length; 
    sb.AppendFormat("{0} " , list[idx]); 
} 

В основном, как решение Brent Arias, но я думаю, что цикл for более читабельный, менее вероятно, будет бесконечным.

public static string zee(string origString, int i) 
    { 
     StringBuilder sb = new StringBuilder(); 

     List<string> list = new List<string>(); 
     list.AddRange(origString.Split(' ')); 

     for (int j = 0; j < list.Count; j++) 
     { 
      int idx = (j + i) % list.Count; 
      sb.AppendFormat("{0} ", list[idx]); 
     } 
     return sb.ToString(); 
    } 
0

Я havn't пробовал, но я думаю, что это будет сделать это:

i %= list.Length; 
int index = i; 
do { 
    index %= list.Length; 
    sb.AppendFormat("{0} ", list[index]); 
while (++index != i); 
1

Это, как я бы решить.

private static string f(string s, int start) 
    { 
     var arr=s.Split(' '); 
     start %= arr.Length; 

     var res=arr.Skip(arr.Length - start).ToList(); 
     res.AddRange(arr.Take(arr.Length - start)); 
     return string.Join(" ", res); 
    } 

Я пробовал написать один вкладыш с linq, но я не вижу, как объединить 2 списка. Union и Join - это не то, что мне нужно.

0

Вот как я могу решить это, используя строки.

public static string zee(string origString, int i) 
    { 
     string[] splitStr = origString.Split(' '); 
     string newStr = ""; 

     // Not sure what you meant by wrap around but this should 
     // do the trick. 
     i %= splitStr.Length; 

     for (int j = (splitStr.Length - i); j < splitStr.Length; j++) 
      newStr += splitStr[j] + " "; // Add spaces taken by split :(

     for (int j = 0; j < (splitStr.Length - i); j++) 
      newStr += splitStr[j] + " "; 

     return 
      newStr; 
    } 
0

Похоже, домашнее задание вопроса для меня, но здесь является эффективным использованием рамок .Net:

private static string [] SplitWords(string s, int startWord) 
    { 
     string[] words = s.Split(' '); 
     List<string> output = new List<string>(); 
     output.AddRange(words.Skip(startWord).ToArray()); 
     output.AddRange(words.Take(startWord).ToArray()); 
     return output.ToArray(); 
    } 

Существует абсолютно нет проверки в этой функции, так что вы должны изменить его ошибки для производственного кода, но вы получите эту идею.

0

Вот мерзость пытается втиснуть столько, сколько в одну строку, как это возможно:

static string zee(string sentence, int wordCount) 
{ 
    var words = sentence.Split(' '); 
    return string.Join(" ", new[] { words.Skip(words.Count() - wordCount), words.Take(words.Count() - wordCount) }.SelectMany(w => w).ToArray()); 
} 
-1
public string SetStart(int startAt) 
{ 
    const string sentence = "this is a test so it is"; 

    var words = sentence.Split(' '); 

    var x = (startAt > words.Count()) ? startAt%words.Count() : startAt; 

    return string.Join(" ", words.Skip(x).Concat(words.Take(x)));    
} 
0
static string rearrange(string phase,int index) 
{ 
    string[] words = phase.Split(' '); 
    string[] newwords = new string[words.Length]; 

    int pointer = index; 
    for (int i = 0; i < words.Length;i++) 
    { 
     if(pointer>=words.Length) 
     { 
      pointer = 0; 
     } 
     newwords[i] = words[pointer]; 
     pointer++; 
    } 

    return string.Join(" ", newwords); 
} 
Смежные вопросы