C#版本的“;字符串中的最后一个单词不是“反转”;

本文关键字:反转 单词不 字符串 版本 最后一个 | 更新日期: 2023-09-27 18:26:13

这是原始问题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#字符串不是以null结尾的。

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终止符结尾。那么,如果可能的话,我该如何进行第二次实现呢?

C#版本的“;字符串中的最后一个单词不是“反转”;

您错过了最后一个单词,因为wordEnd == input.Length永远不会变为true,因为在此之前已经退出了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++;
                    }
                }

我已经修改了您的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);
}