【问题标题】:Reverse elements of a string array字符串数组的反转元素
【发布时间】:2013-09-06 09:13:20
【问题描述】:

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

【问题讨论】:

  • 我们不是来帮你面试的。至少展示一些你尝试过的东西。
  • 您被要求反向存储值或更新数组?
  • 我敢肯定,如果 OP 从未提及工作面试,就不会有反对票...
  • @MagnusGrindalBakken 我们不会在他的采访中解决这个问题。这将是为了我们的知识,或者如果我们有,那么我们可以与他分享
  • @S_F 在这种情况下,每个人都可能认为这是家庭作业,并且会被更多人否决。 StackOverflow 指南规定,您应该在提出问题之前充分尝试自己解决问题,缺乏这一点可能是它被否决的唯一原因。

标签: c# algorithm reverse arrays


【解决方案1】:

在这里,没有支持变量,没有 .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];
}

【讨论】:

  • 这似乎是一个荒谬的假设。如果它们的长度都是 1,那么合乎逻辑的做法是使用 char[]
  • @Dukeling 如果我们在逻辑域中,则不会要求您不要使用 .net 函数或附属变量。我试着按照他提出的问题解决。
  • 例子就是这样,一个例子。描述中没有提到我们被限制为长度为 1 的字符串,而且在字符串上放置似乎是一个非常奇怪的约束,所以我的逻辑假设是该示例仅使用长度为 1 的字符串,因为与较长的字符串相比,它的输入更少。是的,我会更喜欢基于通配符的方法。
  • 谢谢@Save 我被问到,因此,被问到字符串数组中长度为 1 的元素。所以它有效并回答了我的问题。
【解决方案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);
}

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

【讨论】:

  • 如前所述:没有任何临时变量或 .NET 类的帮助,字符串方法.. -> SubString 用法 ;-(
  • @Heslacher 这不是 .NET,这是我自己隐式实现但没有显示的SubString ;)
  • @Heuster 我不认为SubString 在没有临时变量的情况下是可以实现的:-)
  • @xanatos 恐怕也是如此。但是字符串连接也不是,因为字符串是不可变的。对于整数数组,这个问题对我来说更有意义(因此可以使用 XOR 技巧)。
  • 您没有将所有 3 个语句放在一个循环中是否有特定原因?
【解决方案3】:
string[] myString = {"a","b","c","d"}

for(int = (myString.Length - 1); int >= 0; i--) {
    string rev =  myString[i];
    Console.Write(rev);
}

【讨论】:

  • 请提供不需要提问者澄清的答案。
  • 虽然您的帖子可能会回答这个问题,但也请简要说明您的代码实际做了什么以及它如何解决最初的问题。不要只删除几行格式不正确的代码。
  • 我同意你的看法。我不知道为什么每个人都这么难
【解决方案4】:

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

     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 语法。

【讨论】:

    【解决方案5】:

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

    使用库:

    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;
    

    【讨论】:

    • 这是有原因的。问题表明你不能使用临时变量,我认为你的就是这样。
    • 之所以说“不使用库”是因为必须有人编写那个库。如果您正在面试涉及编写库的工作,假设库已经编写完毕是不可能的。
    • @EricLippert 正确,没有竞争。但是,具体任务涉及不使用高度优化的可用库。除非您要删除依赖项,否则使用库是正确的方法,否则为什么要使用库,对吧?
    【解决方案6】:

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

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

    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]
    

    希望你能理解

    【讨论】:

      【解决方案7】:

      你试过了吗

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

      【讨论】:

        【解决方案8】:

        如果数组的最大字符串长度小于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()));
        }
        

        【讨论】:

          【解决方案9】:

          试试这个。

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

          【讨论】:

            【解决方案10】:
            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--;
                    }
                }
            

            【讨论】:

              【解决方案11】:

              是的,你可以做到-

              string[] myString = { "a", "b", "c", "d" };
              myString  = (from a in myString orderby a descending select a).ToArray();
              

              【讨论】:

              • 这是 linq 也是 .net 的做法
              【解决方案12】:

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

              在伪代码中:

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

              【讨论】:

              • 您在解决方案中使用 tmp 变量。你只是隐藏它使代码变得丑陋和效率降低......
              【解决方案13】:

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

              【讨论】:

              • 无法从 'System.Collections.Generic.List' 转换为 'System.Array'
              【解决方案14】:

              查看 MSDN 上的Array.Reverse 方法。

              【讨论】:

              • 他想在不使用任何现有方法的情况下做到这一点
              • 毫无疑问。它来自.net
              • 啊,没有 .NET 类。嗯,我把答案留给以后参考。
              • 它不起作用并抛出:无法从'System.Collections.Generic.List'转换为'System.Array'
              猜你喜欢
              • 2021-12-01
              • 1970-01-01
              • 1970-01-01
              • 2019-02-21
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多