我想要做的是创建一个功能,重新排列一串数字,如" 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;之后似乎没有回头。我是最高的数字然后删除下一个最高的数字/
答案 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次。