c#从高到低重新排列一串数字
本文关键字:一串 数字 排列 新排列 | 更新日期: 2023-09-27 18:12:34
我要做的是创建一个函数,该函数将重新排列一串数字,如"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',这是最高的数字,然后删除下一个最高的数字/
你的问题是你循环中的if
语句。
if (prevnumber == LargestNumber(num).ToString()
{
rearranged.Add(Convert.ToInt32(prevnumber));
//...
}
只有当prevnumber
的值是最大值时,你才会将rearranged
添加到你的列表中,这对于除5
以外的所有数字都是假的,所以唯一添加到列表中的值是5
。
这就是为什么它只返回5
的答案,但我不认为这会使你的方法正常工作。你正在做一件非常危险的事情,从循环本身改变你正在迭代的集合的值(num
中的字符)。其他答案已经为你写好了,其中包含了一个方法,可以按照你所描述的重新排列数字。
你的Rearrange方法是返回List<int>
当你试图写到控制台,它能做的最好的是写System.Collections.Generic.List1[System.Int32]
(它的类型)
与其尝试写入列表,不如先将其转换为可写入的数据类型(例如字符串)
,
var myList = Rearrange("3250");
string concat = String.Join(" ", myList.ToArray());
Console.WriteLine(concat);
基于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。
您的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');
}
开始读你的第一句话
不测试整数
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)));
}
因为Rearrange方法中的foreach循环只遍历原来的num,在删除最大的数字后,算法不会继续遍历新的num字符串。您可以通过调试找到问题,如果输入字符串为"3250",Rearrange中的foreach循环只运行4次。