C#版本为“字符串中的最后一个单词没有反转”

时间:2015-12-08 20:46:32

标签: c# string

这是原始问题Link的链接。现在我能够解决这个问题。但我想在C#中解决同样的问题。我已经用一种方式解决了它。但是当我像原始链接问题那样实现它时,我遇到了同样的问题。

以下是我的一个实现的代码,它解决了C#中的问题,

using System;

namespace CSharpStrings
{
   class MyStringManipulators
   {
       private string input;
       private string[] subStrs;

       public void GetInputString()
       {
          Console.WriteLine("Enter string:");
          input = Console.ReadLine();
          Console.WriteLine(ReverseString(input));
       }

       public string ReverseString(string input)
       {
          char[] tempStr = new char[input.Length];
          int tempIndex = 0;

          for(int i=input.Length-1;i>=0;i--)
          {
             tempStr[tempIndex] = input[i];
             tempIndex++;
          }
          String newStr = new String(tempStr);
          //Console.WriteLine(newStr);

          return newStr;
       }

       public string ReverseWordsInStr()
       {
          String newStr="";

          subStrs = input.Split(' ');
          for(int i=0;i<subStrs.Length;i++)
          {
             subStrs[i] = ReverseString(subStrs[i]);
             newStr = newStr + subStrs[i] + " ";
          }
          //Console.WriteLine(newStr);

          return newStr;
      }
  }

   class Program
   {
      static void Main(string[] args)
      {
         MyStringManipulators obj = new MyStringManipulators();
         obj.GetInputString();
         Console.WriteLine(obj.ReverseWordsInStr());
      }
   }
}

这是另一个版本。这个版本的实现实际上类似于链接实现中的版本。但是,这个版本与原始链接中的问题相同。但是,这个问题的解决方案在这里不起作用。因为我认为C#字符串不是空终止的。

using System;


namespace CSharpStringV2
{
   class MyStringMan
   {
      private string input;

      public void GetInput()
      {
         Console.WriteLine("Enter String:");
         input = Console.ReadLine();
      }

      public void ReverseWords()
      {
         int wordEnd = 0, indexS = 0, indexE = 0;
         char[] newStr=new char[input.Length];

         while (wordEnd < input.Length)
         {
            if (wordEnd<input.Length &&  input[wordEnd] != ' ')
            {
                wordEnd++;
            }
            else
            {
                if (input[wordEnd] == ' ' || wordEnd == input.Length)
                {
                    indexE = wordEnd - 1;
                    while (indexS < wordEnd)
                    {
                        newStr[indexS] = input[indexE];
                        indexS++;
                        indexE--;
                    }
                    newStr[indexS] = ' ';
                    indexS++;
                }
                wordEnd++;
            }
        }
         string nStr = new string(newStr);
         Console.WriteLine(nStr);
    }
 }

  class Program
  {
    static void Main(string[] args)
    {
        MyStringMan obj = new MyStringMan();
        obj.GetInput();
        obj.ReverseWords();
    }
  }
}

我的问题是如何让第二次实施工作?我猜它有一个问题,因为C#字符串不以\0终止符结束。所以我如何使第二个实现工作,如果可能的话?

2 个答案:

答案 0 :(得分:1)

你错过了最后一个字,因为wordEnd == input.Length因为在此之前已经退出while (wordEnd < input.Length)循环而永远不会变为真。

您需要将其更改为while (wordEnd <= input.Length),就像您链接的答案一样。

编辑: 您还需要将其他部分更改为:

                if (wordEnd == input.Length || input[wordEnd] == ' ')
                {
                    indexE = wordEnd - 1;
                    while (indexS < wordEnd)
                    {
                        newStr[indexS] = input[indexE];
                        indexS++;
                        indexE--;
                    }
                    if (wordEnd < input.Length)
                    {
                        newStr[indexS] = ' ';
                        indexS++;
                    }
                }

答案 1 :(得分:1)

我修改了您的ReverseWords方法以解决问题。

请参阅代码中的注释

public void ReverseWords()
{
    int wordEnd = 0, indexS = 0, indexE = 0;
    char[] newStr = new char[input.Length];

    while (wordEnd <= input.Length) //Needed to use <=
    {
        if (wordEnd < input.Length && input[wordEnd] != ' ')
        {
            wordEnd++;
        }
        else
        {
            //Reversed the conditional checks as the second check 
            //is an overflow with the last word
            if (wordEnd == input.Length || input[wordEnd] == ' ')
            {
                indexE = wordEnd - 1;
                while (indexS < wordEnd)
                {
                    newStr[indexS] = input[indexE];
                    indexS++;
                    indexE--;
                }
                //Added condition to not add a space after the last word
                if(wordEnd != input.Length)
                    newStr[indexS] = ' ';
                indexS++;
            }
            wordEnd++;
        }
    }
    string nStr = new string(newStr);
    Console.WriteLine(nStr);
}