1

string[] myString = {"a","b","c","d"}
//Reverse string algorithm here
myString = {"d","c","b","a"}
在一次采访中,我被要求在没有任何临时变量或 .NET 类、字符串方法等的帮助的情况下这样做,以反转同一字符串数组的元素。我被告知要使用基本的编程结构,比如循环。因为,我今天准备进行另一次面试,所以我急于知道这是否真的可行,因为我找不到解决方案。

4

14 回答 14

6

在这里,没有支持变量,没有 .net 函数 :) 但它假设数组中的所有字符串的长度都为 1 (就像它们在您发布的代码中所做的那样)。

string[] myString = {"a","b","c","d", "e"};
for(int i = 0; i < myString.Length/2; i++)
{
   myString[i] += myString[myString.Length -1 -i];
   myString[myString.Length -1 -i] = ""+myString[i][0];
   myString[i] = "" + myString[i][1];
}
于 2013-09-06T09:29:47.713 回答
2

由于您不能使用临时变量,所以我能想到的最好的方法是先附加字符串,然后再次删除附加的部分:

// append last strings to first strings
for(int i = 0; i < myString.Length / 2; i++)
{
    myString[i] = myString[i] + myString[myString.Length - i - 1];
}

// copy first half to last half
for(int i = myString.Length / 2 + 1; i < myString.Length; i++)
{
    myString[i] = myString[myString.Length - i - 1]
                      .SubString(0, 
                              myString[myString.Length - i - 1].Length 
                               - myString[i].Length);
}

// remove useless part from first half
for(int i = 0; i < myString.Length / 2; i++)
{
    myString[i] = myString[i].SubString(
                                  myString[myString.Length - i - 1].Length 
                                   - myString[i].Length);
}

愚蠢的做法?是的。但不涉及其他变量。

于 2013-09-06T09:28:29.843 回答
2
string[] myString = {"a","b","c","d"}

for(int = (myString.Length - 1); int >= 0; i--) {
    string rev =  myString[i];
    Console.Write(rev);
}
于 2017-07-27T12:07:03.243 回答
1

抱歉,我发布了一个错误的答案...这是经过验证的答案:

     int k = len - 1;
    for(int i = 0; i<len/2; i++)
    {
        myString[i] = myString[i]+"."+myString[k--];
    }
    for(int i = len/2; i<len; i++)
    {
        myString[i] = myString[k].substring(0, 1);
        myString[k] = myString[k--].substring(2,3);
    }

但是,只需将其视为伪代码...我没有检查 .NET 语法。

于 2013-09-06T09:27:13.040 回答
1

面试中的正确答案是“为什么不使用类库?” 但是然后说,“好吧,如果我需要编写自定义方法,因为库不支持需要......”。然后我会展示这两种方法并争论何时使用每种方法。如果他们对这个解释有疑问,那么我无论如何都不想在那里工作。

与图书馆:

string[] myString = {"a","b","c","d"};
List<string> list = myString.ToList();
list.Reverse();
myString = list.ToArray();

没有:

string[] myString = {"a","b","c","d"};
string[] newString = new string[myString.Length];
for (int i = 0, j = myString.Length - 1; i < myString.Length && j >= 0; i++, j--)
{
    newString[j] = myString[i];
}
myString = newString;
于 2018-08-16T00:40:26.007 回答
0

你试过这个

        string[] myString = { "a", "b", "c", "d","e","f" };

        int _firstcounter = 0;
        int _lastcounter = myString.Length-1;

        while (_firstcounter<=_lastcounter)
        {
            myString[_firstcounter] += myString[_lastcounter];
            myString[_lastcounter] = "" + myString[_firstcounter][0];
            myString[_firstcounter] = "" + myString[_firstcounter][1];

            _firstcounter++;
            _lastcounter--;
        }
于 2013-09-06T09:23:48.700 回答
0

这不是一个完整的答案,也许是一个想法..

可以通过数学交换两个数字

swap(a,b)
   a = a + b
   b = a - b
   a = a - b

最初我打算建议这可以用字符 ascii 值来完成。然后我注意到了字符串。

那么是否可以接受

swap(str1, str2)
    str1 = str1+str2
    str2 = str1[0]
    str1 = str1[1]

我希望你能明白

于 2013-09-06T09:25:56.177 回答
0

如果数组的最大字符串长度小于 10,那么这可能会有所帮助....

string[] myString = { "aaaa", "bbb", "ccccccc", "dddddd", "e", "fffffffff" };
for (int i = 0; i < myString.Length; i++)
{
    myString[i] = myString[i].Length.ToString() + myString[i]; 
}
for (int i = 0; i < myString.Length/2; i++)
{
    myString[i] = myString[i] + myString[myString.Length-1-i];
    myString[myString.Length - 1 - i] = myString[i];
}
for (int i = 0; i < myString.Length/2; i++)
{
     myString[i] = myString[i].Substring(int.Parse(myString[i][0].ToString())+2,int.Parse(myString[i][int.Parse(myString[i][0].ToString())+1].ToString()));                       
}
for (int i = myString.Length / 2; i < myString.Length; i++)
{
     myString[i] = myString[i].Substring(1, int.Parse(myString[i][0].ToString()));
}
于 2013-09-06T11:13:14.003 回答
0

试试这个。

public static class ExtensionMethods
{
    public static IEnumerable<T>  ReverseArray<T>(this T[] source)
    {
        for (int i = source.Length - 1; i >= 0; i--)
        {
            yield return source[i];
        }
    }

    public static T[] EnumerableToArray<T>(this IEnumerable<T> source)
    {
        var array = new T[source.Count()];

        int k = 0;
        foreach (var n in source)
        {
            array[k++] = n;
        }

        return array;
    }
}

示例用法

    public static void Main(string[] args)
    {
        string[] myString = {"a", "b", "c", "d"};

        myString = myString.ReverseArray().EnumerableToArray();
    }
于 2014-01-22T16:03:19.260 回答
0
static void ReverseMyString(string[] myString)
        {
        int start=0, end= myString.Length-1;
        string temp = "";

        while (start < end)
        {
            temp = myString[start];
            myString[start] = myString[end];
            myString[end] = temp;
            start++;
            end--;
        }
    }
于 2019-06-20T17:54:01.053 回答
-1

是的,你可以做到——

string[] myString = { "a", "b", "c", "d" };
myString  = (from a in myString orderby a descending select a).ToArray();
于 2013-09-06T09:25:22.360 回答
-1

您至少需要一个变量来交换值。

在伪代码中:

for(i : 0..n/2) {  
    // swap s[i] and s[n-i]
    String tmp = s[i];
    s[i] = s[n-i];
    s[n-i] = tmp;
}
于 2013-09-06T09:25:22.517 回答
-2

我们可以用 Array.Reverse(UrArray);

于 2014-01-10T05:18:16.283 回答
-3

查看MSDN 上的Array.Reverse方法。

于 2013-09-06T09:16:54.060 回答