【发布时间】: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 => Convert.ToInt32(q)).ToArray()) -
@Plutonix 肯定 OP 并没有要求框架内的解决方案,而是他们在算法上的尝试有什么问题。
-
是的,这就是为什么它是一个评论。作为一个自称为“编程初学者”的人,他们可能不知道还有其他方式
-
很确定他们希望您提出一个新问题,而不是修改这个问题。您最初的“为什么不打印此列表”的问题已得到解答。至于你的新问题,我觉得
num = sb.ToString();没有按照你的想法做。我现在实际上并不完全理解它,因为你不能修改你正在迭代的变量,所以因为字符串是不可变的,我很确定foreach正在迭代原始字符串。因此,您不会从foreach的num副本中删除任何值,这就是它只打印最大数字的原因。
标签: c# arrays string loops for-loop