我在 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;
}
Run Code Online (Sandbox Code Playgroud)
因为我不知道我必须多久计算一次
(例如,序列长度为 3 的 6-Length-Array 有 4 个序列 (1,2,3 | 2,3,4 | 3,4,5 | 4,5,6)),当索引超出范围时,
我将停止while循环。但我不确定这个解决方案是否合适。不仅与程序速度有关,而且与代码的清洁度有关。这段代码是否可以接受,还是使用for循环更好,例如,对于具有 3 长度序列的 6 长度数组,该循环恰好循环 4 次?
不推荐,不。异常应该保留给不应该发生的事情,而不是流控制或验证。
您想要的是使用条件逻辑(if 语句)和break关键字。
此外,codereview.stackexchange.com 更适合解决此类问题。
| 归档时间: |
|
| 查看次数: |
173 次 |
| 最近记录: |