Java Is>;=在这种情况下确实需要。不会';t==足够了吗?

Java Is>;=在这种情况下确实需要。不会';t==足够了吗?,java,arrays,recursion,dynamic-programming,Java,Arrays,Recursion,Dynamic Programming,这就是问题所在 给定一个整数数组,是否可以选择一组整数,以使该组与给定目标相加,并具有以下附加约束:数组中所有5的倍数必须包含在该组中。如果紧跟在5的倍数之后的值为1,则不得选择该值。(不需要循环。) 这一出色的解决方案归功于 我觉得以下几点就足够了 if(start == nums.length) if(start == nums.length) 我理解>=背后的原因可能是因为当数组中的数字可以被5整除时,我们跳了2。但我们也在做以下工作 if(start < nums.length

这就是问题所在

给定一个整数数组,是否可以选择一组整数,以使该组与给定目标相加,并具有以下附加约束:数组中所有5的倍数必须包含在该组中。如果紧跟在5的倍数之后的值为1,则不得选择该值。(不需要循环。)

这一出色的解决方案归功于

我觉得以下几点就足够了

if(start == nums.length)
if(start == nums.length)
我理解>=背后的原因可能是因为当数组中的数字可以被5整除时,我们跳了2。但我们也在做以下工作

if(start < nums.length - 1 && nums[start+1] == 1)
if(start
这意味着如果数组看起来像{2,10,5},对于最后一个元素是5,尽管它可以被5整除,我们仍然只跳1次,而不是2次。所以现在的起点是4,等于nums.length。所以,在最坏的情况下,start只能等于nums.length,但不能超过它

编辑:我有一些建议,当“开始”大于nums.length时,=是必需的。我不确定会遇到这样的情况。从main函数中,我只将start传递为0。从那时起,它只增加一个因子1,如果不是最后一个元素,则增加一个因子2。因此,从最后一个元素开始,增加的系数总是1,这意味着总是会遇到start==len。

您说过:

但我有一个问题,是否真的需要以下条件

if(start >= nums.length)
if(start >= nums.length)
我觉得以下几点就足够了

if(start == nums.length)
if(start == nums.length)
start
大于
nums.length
时,使用第二行会出现问题。第一行对于该用例具有正确的逻辑

如果函数的初始调用保证使用小于
nums.length
start
值,则使用

if(start == nums.length)

没问题。

取决于你想要什么。如果你确信你的起点永远等于nums,并且这是它唯一应该起作用的时间,那么是的,第二个就足够了。但是,如果两者都等于或大于,则使用第一个

有点离散的数学时间。在这里,我们使用的是逻辑语句。语句>=读取为大于或等于。设p=更大,q=相等

  • v是离散数学中的OR符号,^代表AND,XOR是唯一的EOR
对于处理OR逻辑运算符的语句,以下真值表适用:

p v q; p = T, q = T; True

p v q; p = T, q = F; True

p v q; p = F, q = T; True

p v q; p = F, q = F; FALSE

因此,它将适用于四个案例中的三个。希望能有帮助。对于AND(&&)运算符逻辑,它仅在p和q均为真时成立。顺便说一句| |是OR的符号。希望能有帮助

这实际上取决于用例。你应该考虑你的代码将被其他人使用,所以你需要制作我想称为哑证明的方法。当有人给出错误的用户输入时,他们永远不会知道原因

特别是在这种情况下(使用递归),我将使用两种方法:

public boolean groupSum5(int[] arr, int target) {
   // Some fool proof checking goes here
   return recursiveGroupSum5(0, arr, target);
}

private boolean recursiveGroupSum5(int start, int[] arr, int target) {
    // Logic goes here
}
当您这样处理它时,您可以控制第一个调用,这样就不必检查start>=arr.length,因为您知道它永远不会到达,因此在这种情况下可以使用==。我很喜欢@Fildor的评论,他说:


永远不要相信用户的输入


因为用户不可靠

如果我用
start=2
和空数组调用该方法会怎么样?永远不要相信用户输入。@zoltan,zoltan再次感谢您的回复。但是你能给我一个例子,其中start=2将被一个空数组调用。在main中,我将函数称为groupSum5(0,a,n)。测试用例1:假设我的数组只包含一个元素,看起来像{5},那么它仍然只会增加1,而不会进入跳转2的情况,因为nums.length-1==0,start为0,不小于0。---测试用例2:假设我们得到一个空数组,然后start==0,这是数组长度,因此它将直接返回1,这是可以的。@R Sahu,谢谢你的回答,但我还没有完全得到它。在main中,我将函数称为groupSum5(0,a,n)。测试用例1:假设我的数组只包含一个元素,看起来像{5},那么它仍然只会增加1,而不会进入跳转2的情况,因为nums.length-1==0,start为0,不小于0。---测试用例2:假设我们得到一个空数组,然后start==0,这是数组长度,因此它将直接返回1,这是可以的。问题是'if'语句后面的行。它访问nums[start],如果start大于或等于nums.length,这将是一个错误。@PepperBoy,在您到达之前,我不知道当Java中
start
大于
nums.length
时,
if(nums[start]%5==0)
行将如何运行。我对Java不够熟悉。@RSahu,我不确定会遇到这样的情况。从main函数中,我只将start传递为0。从那时起,它只增加一个因子1,如果不是最后一个元素,则增加一个因子2。因此,从最后一个元素开始,增量始终为1,这意味着,始终会遇到start==len。@PepperBoy,在这种情况下,使用
if(start==nums.length)
就可以了。谢谢。请参见编辑。我想不出一个条件,如果开始大于nums.lengthHmm,如果确实是这样,那么我想你可以用==。