我在Hackerrank上解决了一个任务。com,问题是这样的:
你有一个数组。这个数组包含数字。
现在输入两个数字:
最后你得到的序列的数量其总和就是你定义的数字
例如:
我为此写了这段代码:
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,4 | 3,4,5 | 4,5,6)),当索引超出范围时,我停止循环。但我不确定这个解决方案是否可行。不仅仅是程序速度,还有代码清洁度。该代码是否可以接受,或者最好使用循环,例如,对于具有3个长度序列的6个长度数组,哪些循环正好4次?
通常,除了开关/机箱外,通常没有使用break的真正原因。此外,例外必须如名称所示,因此它不能成为您逻辑的一部分。正如Jeppe所说,您可以使用框架提供的方法和属性来执行您喜欢的操作。在这里,s.Count似乎是一条可行之路。
最好修复代码,使其不会经常引发异常:
您对这些段中的每一个进行求和:
0 1 2 3 start = 0
| | summing indexes: 0, 1
+--+
0 1 2 3 start = 1
| | summing indexes: 1, 2
+--+
0 1 2 3 start = 2
| | summing indexes: 2, 3
+--+
括号从索引开始,大小为m。s的长度由s.Count给出。因此,我们希望继续进行,直到开始m==s.Count。
(我总是发现画出这些东西并输入样本编号很有用,以确保您的数学正确。在上面的示例中,您可以看到我们在start(2)m(2)==数组大小(4)
时停止)
static int GetSequences(List<int> s, int d, int m)
{
//m = segment-length
//d = sum
int count = 0;
for (int start = 0; start + m <= s.Count; start++)
{
List<int> temp = new List<int>();
for (int i = 0; i < m; i++)
{
temp.Add(s[start + i]);
}
if (temp.Sum() == d)
{
count++;
}
}
return count;
}
但是,您可以稍微改进代码:
static int GetSequences(List<int> numbers, int targetSum, int segmentLength)
{
if (numbers == null)
throw new ArgumentNullException(nameof(numbers));
if (segmentLength > numbers.Count)
throw new ArgumentException("segmentLength must be <= numbers.Count");
int count = 0;
for (int start = 0; start + segmentLength <= numbers.Count; start++)
{
int sum = 0;
for (int i = 0; i < segmentLength; i++)
{
sum += numbers[start + i];
}
if (sum == targetSum)
{
count++;
}
}
}
不建议这样做。应该为不应该发生的事情保留例外,而不是流控制或验证。
您想要的是使用条件逻辑(if语句)和关键字。
此外,codereview。stackexchange。com更适合于这类问题。
我在我的android应用程序中使用增强for循环来迭代状态对象列表。 这将生成以下IndexOutOfBoundsException:java。lang.IndexOutOfBoundsException:索引0无效,大小为0 我意识到这是因为ArrayList的大小是0,这意味着它是空的。我的问题是,为什么它一开始就进入了循环,而不是为了保证这些问题不会发生而创建的增强for,以及如何阻止它。
问题内容: 我有一个循环正在我的PHP代码中进行一些错误检查。原来看起来像这样… 这一切都很好,但是尽管有一个错误,它仍然可以循环通过。有没有办法摆脱循环? 问题答案: 您正在寻找break语句。
抛出异常的行为是否可能抛出不同的异常? 为了抛出异常,必须(可选地)分配新对象,并调用其构造函数(隐式调用fillinstacktrace)。在某些情况下,听起来像addSupressed也被称为。那么如果没有足够的内存会发生什么呢?JVM是否需要预分配内置异常?例如,(1/0)会抛出OutOfMemoryError而不是ArithmeticException吗? 此外,构造函数是一个方法调用,因
问题内容: 考虑以下代码: 无需添加方法签名即可编译该代码。(它与同样表现到位,太)。 我理解为什么 可以 安全地运行它,因为实际上不能将其引发在块中,因此不能引发已检查的异常。我有兴趣知道在何处指定此行为。 并非永远都不会达到目标:以下代码也会编译: 但是,如果抛出一个检查的异常,它不会像我期望的那样编译: 在JLS Sec 11.2.2中 ,它说: 一,其抛出的表达式语句(§14.18)具有静
编辑:该问题与fscanf的while循环没有直接关系,而是在用于包含使用fscanf加载的变量的结构的分配中出现了错误 我正在从文件中读取值,并使用它们在使用fscanf的结构中设置参数。我使用Eclipse作为编辑器,并将其调试和gcc作为编译器(从Eclipse内部)。 我下面介绍的由三部分组成:1)我从文件中读入变量的结构的声明。2)我正在读取的文件,以及3)实际从文件中读取的代码。 在所
问题内容: 我试图在Netbeans中重构一个大型程序,但我有点迷茫。我从来没有非常模块化,但是现在通过实际学习如何做到这一点来尝试纠正这种情况,并在将来纠正这种情况。不幸的是,我在将某些教程翻译成我的程序时遇到了麻烦。所以我希望这里有人可以帮忙。目前,我正在尝试分解一部分采用特定格式的文件并制成表格的代码。我知道我需要创建一个类并使用它来创建表对象,但是我不确定如何做。我有一个主文件,用于获取文