我在Hackerrank.com上解决了一个任务,问题是这样的:
您有一个数组。此数组包含数字。
现在,您输入两个数字:
- 第一个描述总和
- 第二个描述了您加在一起的索引数量(序列长度)
最后,您得到的序列数之和是您定义的数字
例如:
您的数组为[1,2,3,4],总和为3,序列长度为2。
现在,您获取前两个索引并输出总和:[1,2] =3。
这等于您的总和,所以现在您找到了一个序列。
下一个序列是[2,3] =5。这不等于3,因此您的序列计数器保持为1。
最后一个序列是[3,4] =7。这也不等于3,最后找到一个序列。
我为此编写了这段代码:
static int GetSequences(List<int> s, int d, int m)
{
//m = segment-length
//d = sum
int count = 0;
int j = 0;
int k = 0;
do
{
try
{
List<int> temp = new List<int>();
for (int i = 0; i < m; i++)
{
temp.Add(s[i + k]);
}
if (temp.Sum() == d)
{
count++;
}
j++;
k++;
}
catch (ArgumentOutOfRangeException)
{
break;
}
} while (true);
return count;
}
因为我不知道必须多久计数一次
(例如,序列长度为3的6长度数组有4个序列(1,2,3 | 2,3,4 | 3,4,5 | 4,5,6)),
当索引超出范围时,我正在停止while
循环。但我不确定此解决方案是否可以不仅具有程序速度,还具有代码清洁度。这段代码可以接受吗?还是最好使用for
循环,例如对于具有3个长度序列的6长度数组,该循环恰好循环了4次?
答案 0 :(得分:5)
不推荐,不。异常应该保留给不应该发生的事情,而不是流控制或验证。
您要使用条件逻辑(if语句)和break
关键字。
此外,codereview.stackexchange.com更适合此类问题。
答案 1 :(得分:0)
通常,除了开关/情况外,通常没有使用中断的真正原因。
顾名思义,必须也是例外,因此一定不能成为您逻辑的一部分。
就像Jeppe所说的,您可以使用框架提供的方法和属性。
s.Count
似乎是要解决的办法。
答案 2 :(得分:0)
<DatePicker x:Name="FinancialYear">
<DatePicker.Resources>
<Style TargetType="{x:Type DatePickerTextBox}">
<Setter Property="Control.Template">
<Setter.Value>
<ControlTemplate>
<TextBox x:Name="PART_TextBox" Text="{Binding Path=SelectedDate, StringFormat='dd MM',
RelativeSource={RelativeSource AncestorType={x:Type DatePicker}}}" />
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</DatePicker.Resources>
</DatePicker>