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

使用算法生成器进行基于属性的测试:“查找给定序列中未出现的最小正整数”

封鸿雪
2023-03-14

我在堆栈溢出上偶然发现了这个挑战,同时学习了使用 ScalaCheck 在 scala 中进行基于属性的测试。

求给定序列中不出现的最小正整数

我想尝试为这个问题编写一个基于生成器驱动属性的测试来检查我的程序的有效性,但似乎想不出如何编写相关的测试用例。我知道我可以为这个用例编写一个基于表驱动属性的测试,但这限制了我可以测试这个算法的属性数量。

import scala.annotation.tailrec

object Solution extends App {
  def solution(a: Array[Int]): Int = {
    val posNums = a.toSet.filter(_ > 0)

    @tailrec
    def checkForSmallestNum(ls: Set[Int], nextMin: Int): Int = {
      if (ls.contains(nextMin)) checkForSmallestNum(ls, nextMin + 1)
      else nextMin
    }

    checkForSmallestNum(posNums, 1)
  }
}

共有1个答案

席兴平
2023-03-14

使用 Scalatest 的(因为您确实标记了最新)Scalacheck 集成和 Sca 最新匹配器,例如

forAll(Gen.listOf(Gen.posNum[Int]) -> "ints") { ints =>
  val asSet = ints.toSet
  val smallestNI = Solution.solution(ints.toArray)
  asSet shouldNot contain(smallestNI)

  // verify that adding non-positive ints doesn't change the result
  forAll(
    Gen.frequency(
      1 -> Gen.const(0),
      10 -> Gen.negNum[Int]
    ) -> "nonPos"
  ) { nonPos =>
    // Adding a non-positive integer to the input shouldn't affect the result
    Solution.solution((nonPos :: ints).toArray) shouldBe smallestNI
  }

  // More of a property-based approach
  if (smallestNI > 1) {
    forAll(Gen.oneOf(1 until smallestNI) -> "x") { x =>
      asSet should contain(x)
    }
  } else succeed  // vacuous

  // Alternatively, but perhaps in a less property-based way
  (1 until smallestNI).foreach { x =>
    asSet should contain(x)
  }
}

请注意,如果scalatest设置为尝试< code > for all 100次,嵌套属性检查将检查值10k次。因为< code>smallestNI几乎总是小于试验次数(因为< code>listOf很少生成长列表),所以穷举检查实际上会比嵌套属性检查更快。

总的来说,如果某个东西是某个谓词适用的最小正整数,这就等于说,对于所有小于这个数的正整数,这个谓词不适用。

 类似资料:
  • 我试图解决下面提供的Codness中的一个问题, 编写一个函数: 给定一个由N个整数组成的数组A,返回A中不出现的最小正整数(大于0)。 例如,给定A=[1,3,6,4,1,2],函数应该返回5。 假定: N是范围[1...100,000]内的整数;数组A的每个元素都是范围[−1,000,000..1,000,000]内的整数。 预期最坏情况时间复杂度为O(N);预计最坏情况下的空间复杂度为O(N

  • 我正在尝试解决一个leetcode类型问题,这是一个实践问题,它伴随着即将到来的代码测试,我需要为工作做一个,我遇到了麻烦。任何人都可以帮助我了解出了什么问题? 我基本上是在寻找暴力选项,因为我不知道algos/DS。 编写一个函数: 功能溶液(A); 给定一个包含 N 个整数的数组 A,返回 A 中未出现的最小正整数(大于 0)。 例如,给定A = [1,3,6,4,1,2],函数应该返回5。

  • 例如:2520是被1到10的每个数字除以的最小正数。 请帮助我使用SQL逻辑查找1到20之间的最小正数

  • 我有以下问题 写一个函数: 给定一个包含N个整数的数组A,返回A中没有出现的最小正整数(大于0)。 例如,给定 A = [1, 3, 6, 4, 1, 2],函数应返回 5。 给定A = [1,2,3],函数应该返回4。 给定A =[1,3],该函数应返回1。 为以下假设编写有效的算法: N是[1..100000]范围内的整数 数组A的每个元素都是范围内的整数[−1000000..1000000]

  • 我试图解决类似于这个问题,但有一些修改: “给定一个值V,如果我们想换V美分,并且我们有无限量的C={C1,C2,…,Cm}值硬币,那么换硬币的最小数量是多少?” 输入:硬币[]={25,10,5},V=30 输出:至少需要2个硬币 我们可以用一枚25美分的硬币和一枚5美分的硬币 在我的例子中,我有一个对象数组,而不仅仅是一个数字数组。每件物品都有数量和价格。我想打印构成给定数量的最小数量的对象,

  • 我需要一个带有System_id、name、description等的Registered_Systems表。现在,每个系统可以有n个属性,我计划将它们存储在子表Registered_System_Attributes(System_id、Attribute_name、Attribute_Value)中,外键为Registered_Systems.System_id 由于属性必须与系统相关联,所以