从最高到最低C#重新排列一串数字

时间:2016-10-11 22:26:40

标签: c# arrays string loops for-loop

我想要做的是创建一个功能,重新排列一串数字,如" 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

我不确定我错过了什么或我做错了什么 - 代码在删除&#39; 5&#39;之后似乎没有回头。我是最高的数字然后删除下一个最高的数字/

6 个答案:

答案 0 :(得分:1)

当您尝试将其写入控制台时,您的重新排列方法返回List<int>,它能做的最好就是写System.Collections.Generic.List1[System.Int32](其类型)

不是尝试编写列表,而是先将其转换为可写入的数据类型(例如字符串)

例如:

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

Console.WriteLine(concat); 

答案 1 :(得分:1)

在pats注释的基础上,您可以遍历列表并将其写入控制台。

e.g。

def button_down(self, event):
    self.start = self.text.index('@%s,%s wordstart' % (event.x, event.y))

def button_up(self, event):
    self.end = self.text.index('@%s,%s wordend' % (event.x, event.y))

    self.text.tag_add("highlight", self.start, self.end)

或者如果你想看到linq的例子。

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

- 看到你之后的编辑只会得到&#39; 5&#39;产量 这是因为如果列表中的数字最大,您的函数只会在列表中添加数字,这就是为什么只添加和返回5的原因。

答案 2 :(得分:1)

您的问题是您的循环中的if声明。

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

如果rearranged的值是最大值,那么您只会添加到列表prevnumber,除5之外的每个数字都为false,因此唯一的值会被添加列表是5

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

答案 3 :(得分:0)

阅读你的第一句话 不测试整数

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

答案 4 :(得分:0)

您的Rearrange方法可以使用Array.Sort (或类似于(List<T>轻松编写:

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

答案 5 :(得分:0)

因为Rearrange方法中的foreach循环只循环遍历原始num。删除最大数字后,算法不会继续通过新的num字符串。 您可以通过调试找到问题,如果您的输入字符串是&#34; 3250&#34;

,则重新排列的foreach循环只会出现4次。