以下代码中的错误是啥?没有得到预期的输出

Posted

技术标签:

【中文标题】以下代码中的错误是啥?没有得到预期的输出【英文标题】:Whats the error in below code ? not getting expected output以下代码中的错误是什么?没有得到预期的输出 【发布时间】:2021-06-04 07:45:38 【问题描述】:

给定一个整数数组和一个整数 k,找出数组中是否有两个不同的索引 i 和 j 使得 nums[i] = nums[j] 并且 i 和 j 之间的绝对差最多为 k .

示例 1: 输入:nums = [1,2,3,1], k = 3 输出:真

示例 2: 输入:nums = [1,0,1,1], k = 1 输出:真

object Solution 
  def containsNearbyDuplicate(nums: Array[Int], k: Int): Boolean =  
    for (i <- 0 until nums.length - 2) 
       for (j <- i until nums.length - 1) 
         if (nums(i) == nums(j) && (j - i == k)) return true
       
    
    return false
  


您的意见 [1,2,3,1] 3 输出 错误的 预期的 真的

【问题讨论】:

您没有计算ji 之间的绝对差;这种差异也不需要等于k,最多k 这里是算法的功能版本:scastie.scala-lang.org/BalmungSan/hFziNk8YToS7ZgQcr0887w/1 【参考方案1】:

我不认为您正在评估内部列表的完整长度。

正如所写,j 永远不会等于 3

我认为如果你让你的内部循环读取for (j &lt;- i until nums.length) 应该可以工作。

可能也想修复外循环。否则,i 永远不会达到存储在数组中的值 3。

使用 until 将排除,因此如果您使用长度为 3 的 i &lt;- 0 until nums.length -1,则 i 的值将是 0、1、2 和 end。

如果您想减去 - 1,因为它对您来说更容易或更有意义,那么您可能想要使用 i &lt;- 0 to nums.length - 1

否则,i &lt;-0 until nums.length 将导致 i 的值在迭代 for 循环时为 0、1、2、3。

希望对您有所帮助。

【讨论】:

【参考方案2】:

这是功能性的,效率为 O(n) 而不是 O(n^2),并修复了一个错误 (i != j)。测试时你也应该总是有一个否定的情况;)

import math.min, max
def containsNearbyDuplicate(nums: Array[Int])(k: Int): Boolean = 
  val indexesToCheck = for 
    i <- 0 until nums.length
    j <- max(0, i - k) to min(nums.length - 1, i + k)
    if i != j
   yield (i, j)
  indexesToCheck.exists case (i, j) => nums(i) == nums(j)


containsNearbyDuplicate(nums = Array(1, 2, 3, 1, 5))(k = 3)
containsNearbyDuplicate(nums = Array(1, 2, 3, 1, 5))(k = 2)
containsNearbyDuplicate(nums = Array(1, 0, 1, 1, 5))(k = 1)

【讨论】:

以上是关于以下代码中的错误是啥?没有得到预期的输出的主要内容,如果未能解决你的问题,请参考以下文章

AFNetworking 错误:“(200-299)中的预期状态代码,得到 404”

运行时错误中的“值不在预期范围内”是啥意思?

SyntaxError:预期的表达式,得到'<'错误 - vue

语法错误:预期的表达式,得到 '<'

以下代码中的错误是啥

此代码中显示(“;”预期)错误的问题是啥。 PS:我是初学者[关闭]