开发者

interview question - how to loop through an array with a different starting point?

Let's say you have the string "This is a test"

I pass it to method zee, like ("This is a test", 1) and want "test This is a";

I pass it to method zee, like ("This is a test", 2) and want "a test This is";

the number can exceed the total words in variable. If it does it should loop a开发者_运维问答round.

I started with....

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();
}


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

Mostly like Brent Arias's solution, but I think a for loop is more readable, less likely to go infinite.

    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();
    }


This is how I'd solve it.

    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);
    }

I tried writing a one liner with linq but I don't see how to combine 2 lists. Union and Join aren't what I need.


This is how I'd solve it using strings.

    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;
    }


Here's an abomination trying to cram as much into one line as possible:

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());
}


I havn't tried it, but I think this would do it:

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


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);
}


Sounds like a homework question to me, but here is an efficient use of the .Net framework:

    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();
    }

There is absolutely no error checking in this function so you will have to modify it for production code but you get the idea.


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

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜