【问题标题】:Rearranging a string of numbers from highest to lowest C#将一串数字从最高到最低重新排列 C#
【发布时间】:2017-02-20 14:44:57
【问题描述】:

我想做的是创建一个函数,它将重新排列一串数字,如“1234”到“4321”。我确信有很多比我的方法更有效的方法,但我只是想看看我所做的事情出了什么问题,因为我是编程的初学者,可以利用这些知识变得更好。
我对代码的思考过程是:

  • 在输入的字符串中找出最大的数
  • 将最大的数字添加到列表中
  • 从输入的字符串中删除最大的数字
  • 再次从(现在更短的)字符串中找到最大的数字

所以我做了一个函数,它找到了字符串中的最大数字,它工作正常:

static int LargestNumber(string num)
    {
        int largestnumber = 0;
        char[] numbers = num.ToCharArray();
        foreach (var number in numbers)
        {
            int prevNumber = (int) char.GetNumericValue(number);
            if (prevNumber >= largestnumber)
            {
                largestnumber = prevNumber;
            }

        }
        return largestnumber;
    }

现在重新排列功能是我遇到的问题:

static List<int> Rearrange(string num)
    {
        List<int> rearranged = new List<int>(); // to store rearranged numbers
        foreach (var number in num) //for every number in the number string
        {
            string prevnumber = number.ToString(); // the previous number in the loop
            if (prevnumber == LargestNumber(num).ToString()) // if the previous number is the larges number in the inputted string (num)
            {
                rearranged.Add(Convert.ToInt32(prevnumber)); // put the previous number into the list

                // removing the previous number (largest) from the inputted string and update the inputted string (which should be now smaller)
                StringBuilder sb = new StringBuilder(num);
                sb.Remove(num.IndexOf(number), 1); 
                num = sb.ToString();
            }
        }
        return rearranged; // return the final rearranged list of numbers
    }

当我运行这段代码时(固定为连接):

var rearranged = Rearrange("3250");
string concat = String.Join(" ", rearranged.ToArray());

Console.WriteLine(concat); 

我得到的是:

5

我不确定自己遗漏了什么或做错了什么 - 删除最高数字“5”然后删除下一个最高数字后,代码似乎不会返回/

【问题讨论】:

  • 这和Kaprekar's Routine有关系吗?如果是这样,你可以检查the way I did it :)
  • var ordered = New String(nums.AsEnumerable().OrderByDescending(q =&gt; Convert.ToInt32(q)).ToArray())
  • @Plutonix 肯定 OP 并没有要求框架内的解决方案,而是他们在算法上的尝试有什么问题。
  • 是的,这就是为什么它是一个评论。作为一个自称为“编程初学者”的人,他们可能不知道还有其他方式
  • 很确定他们希望您提出一个新问题,而不是修改这个问题。您最初的“为什么不打印此列表”的问题已得到解答。至于你的新问题,我觉得num = sb.ToString(); 没有按照你的想法做。我现在实际上并不完全理解它,因为你不能修改你正在迭代的变量,所以因为字符串是不可变的,我很确定 foreach 正在迭代原始字符串。因此,您不会从foreachnum 副本中删除任何值,这就是它只打印最大数字的原因。

标签: c# arrays string loops for-loop


【解决方案1】:

您的问题是循环中的 if 语句。

if (prevnumber == LargestNumber(num).ToString()
{
    rearranged.Add(Convert.ToInt32(prevnumber));
    //...
}

只有当prevnumber 的值是最大值时,您才会将rearranged 添加到您的列表中,除了5 之外的每个数字都是错误的,因此唯一添加到列表中的值是@987654326 @。

这就是为什么它只返回5 的答案,但我认为这不一定会使您的方法正常工作。通过从循环本身更改您正在迭代的集合的值(num 中的字符),您正在做一件非常危险的事情。已经为您编写了其他答案,其中包含一种按照您的描述重新排列数字的方法。

【讨论】:

  • 所以在循环遍历集合时不可能更新集合?
  • @user3124306 这是可能的,你正在这样做,但这是不明智的(我认为它实际上在迭代 IEnumerable 时会引发异常)。当您在迭代期间修改要迭代的集合时,您可能会更改后续迭代的行为。这只是一般性建议。
【解决方案2】:

当您尝试将其写入控制台时,您的 Rearrange 方法正在返回 List&lt;int&gt;,它所能做的最好的事情就是写入 System.Collections.Generic.List1[System.Int32](它的类型)

与其尝试写列表,不如先将其转换成可写的数据类型(例如字符串)

例如:

var myList = Rearrange("3250");
string concat = String.Join(" ", myList.ToArray());

Console.WriteLine(concat); 

【讨论】:

  • 噢!是的,我忘记了。但是,我的代码不起作用,只输出 5:/ 我认为我没有正确实现我的方法/算法
【解决方案3】:

在 pats 评论的基础上,您可以遍历您的列表并将它们写入控制台。

例如

foreach(var i in  Rearrange(3250))
{
    console.writeline(i.ToString());
}

或者如果您想查看 linq 示例。

using system.linq;
Rearrange(3250).foreach(i => console.writeline(i.ToString()));

--看到你只得到 '5' 输出后编辑 这是因为如果它们是列表中最大的数字,您的函数只会将数字添加到列表中,这就是仅添加和返回 5 的原因。

【讨论】:

    【解决方案4】:

    您的Rearrange 方法可以使用Array.Sort 轻松编写(或类似的(List&lt;T&gt;

    int[] Rearrange(int num)
    {
        var arr = num.ToString ().ToCharArray ();
        Array.Sort (arr, (d1, d2) => d2 - d1);
        return Array.ConvertAll (arr, ch => ch - '0');
    }
    

    【讨论】:

      【解决方案5】:

      只看你的第一句话
      不测试整数

          static int ReversedNumber(string num)
          {
              char[] numbers = num.ToCharArray();
              Array.Sort(numbers);
              Array.Reverse(numbers);
              Debug.WriteLine(String.Concat(numbers));
              return (int.Parse(String.Concat(numbers)));
          }
      

      【讨论】:

        【解决方案6】:

        因为您在 Rearrange 方法中的 foreach 循环仅循环通过原始 num。删除最大数字后,该算法不会继续遍历新的 num 字符串。 你可以通过调试找到问题,如果你输入的字符串是“3250”,这个rearrange中的foreach循环只会执行4次。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-04-14
          • 1970-01-01
          • 2018-12-21
          • 1970-01-01
          • 2017-08-27
          • 1970-01-01
          • 2017-01-03
          • 2019-05-29
          相关资源
          最近更新 更多