当前位置: 首页 > 知识库问答 >
问题:

以下两段Java for循环代码是否在每种情况下都产生相同的结果?

翟京
2023-03-14

这个问题是关于编码BAT Java节Array-2的“sameEnds”问题:

如果数组开头和结尾的数字组相同,则返回true。例如,对于{5、6、45、99、13、5、6},n=0和n=2的endpoint相同,n=1和n=3的endpoint相同。您可以假设n在0范围内。。nums。长度(含)。

CodingBat服务器在所有情况下都会传递代码#2,包括“其他测试”,但不会传递代码#1。代码#1仅在所谓的“其他测试”中失败。代码#1失败的其他测试用例是什么?这两种代码有什么区别?

代码#1:

public boolean sameEnds(int[] nums, int len) {
  for (int i = 0; i < len && len > 0; i++, len--) 
    if (nums[i] != nums[(nums.length) - len]) return false;
  return true;  
}

代码#2:

public boolean sameEnds(int[] nums, int len) { 
  for (int i = 0; i < len; ++i)
    if (nums[i] != nums[nums.length - len + i]) return false; 
  return true; 
} 

共有3个答案

仲孙温文
2023-03-14

感谢David Norris和其他立即回答问题的人。我了解到,当for循环的框架如下所示时

i < len && len > 0; i++, len-- 

根据代码1的循环在每次迭代中减小值时提前终止。因此,考虑到规范和测试用例

({1, 2, 5, 2, 1}, 5)

循环仅在三次迭代后终止,

0 < 5 && 5 >0
1 < 4 && 4 > 0
2 < 3 && 3 > 0

它应该迭代5次并检查整个子数组。这就是codingbat服务器不接受Code 1作为确切答案的原因。

我已经修复了如下所示的代码1,并且编码BAT服务器已接受该解决方案作为正确答案。

更正代码1:

public boolean sameEnds(int[] nums, int len) {
  for (int i = 0; len > 0; i++) {
    if (nums[i] != nums[(nums.length) - len]) return false;
    len--;
  }
  return true;  
}
司徒焕
2023-03-14

不,在第一段代码中,您正在递减长度。因此,如果您有10个集合中的项目,它将迭代前5个项目,而第二个则遍历所有10个项目。

代码1:

public boolean sameEnds(int[] nums, int len) {
  for (int i = 0; i < len && len > 0; i++, len--) 
    if (nums[i] != nums[(nums.length) - len]) return false;
  return true;  
}

如果len和nums为大写代码。长度相等,则无需作为参数传递,您可以从nums获取本地副本。长度,要迭代或比较所有项目,请使用:

  for (int i = 0; i < nums.length && len > 0; i++, len--)

代码2:

public boolean sameEnds(int[] nums, int len) { 
  for (int i = 0; i < len; ++i)
    if (nums[i] != nums[nums.length - len + i]) return false; 
  return true; 
} 

在上面的代码中,我假设len是nums数组的长度,

如果是

  • 然后,我认为没有必要将其作为参数传递,因为您可以通过nums在函数中获得它。长度
  • <代码>nums。length-len始终返回0,因此无需使用此减法

如果否:

  • nums[i]如果len大于nums.length
  • if(nums[i]!=nums[nums.length-len i])将始终为假
燕凯旋
2023-03-14

Code 1的问题是您每次都在递减len,但仍将其用作for循环中i的结束索引。想想看...如果len最初为10,i只会数到5,因为循环5次,i将增加到5,len将减至5。

您可以将len复制到用于索引的第二个变量,并使用len仅用于检查i以结束循环。但就我个人而言,我发现您的“Code 2”无论如何都更具可读性和清洁性,所以我会这样做。

 类似资料:
  • 问题内容: 我正在评估JOOQ是否可在仍在开发中的新系统中使用。我想避免在与应用程序一起开发数据库时生成代码,而只是为该应用程序起持久存储的作用。因此,预计数据库模式定义将由Java代码(java中的表定义)驱动。 JOOQ是否适合上述用例?是否有用于模式定义的Java DSL? 问题答案: JOOQ是否适合上述用例? 是的,许多jOOQ用户仅使用运行时库,而没有代码生成器。入门指南中提供了示例。

  • 我正在评估JOOQ在一个仍在开发中的新系统中的使用情况。当数据库与应用程序一起开发时,我希望避免代码生成,而只是在这个应用程序中扮演持久存储的角色。因此,数据库模式定义应该由Java代码(Java中的表定义)驱动。 JOOQ是否适用于上述用例?是否有用于模式定义的JavaDSL?

  • 使用SpringBoot2、SpringDataJPA和Hibernate。我试图对一些从未更新过的实体使用Hibernate的二级缓存。 在我的例子中,实体与其他实体相关,因此当查询一种文档类型时,Hibernate将进行4次sql查询。使用Hibernate二级缓存时,缓存用于某些实体,但仍有一个对数据库的sql查询。我想了解为什么在一种情况下不使用缓存。 这是我的实体的样子: 当我第一次使用

  • 我尝试编写一个小程序来演示java中只有equals被覆盖而不是hashcode()方法时的哈希冲突。这是为了证明两个不相等的对象可以具有相同哈希码的理论。这是针对询问行为的面试问题。 我创建了200000个对象,将它们存储在一个数组中,然后比较它们,看看哪些是重复的。(为此,在对象创建阶段之后,我使用嵌套For循环迭代对象数组。)对于大约200000个物体,我会遇到9次碰撞。第一个是索引196和

  • 我试图生成私钥和公钥对。我想使用私钥签署我的JWT,并将公钥发送给第三方来解码我的JWT。 在mac os终端上,我生成了如下密钥: ssh-keygen-m PEM-t rsa-b 2048 现在我有了pkey吗 rsa_private=OpenSSL::PKey::rsa。新建(File.read(“/path/to/private/key/pkey”)) 你是私人的。要\u s “----开

  • 这是代码: 如果我在我的机器()或这里()上尝试: 相反,这里(): 这是不同的。这是由于机器厄普西隆?还是编译器精度标志?还是不同的评估? 造成这种漂移的原因是什么?问题似乎出现在函数中(因为其他值似乎相同)。