[LeetCode/Scala] 第6场双周赛解题报告

本文深入探讨了算法竞赛中各类问题的解决策略,包括字符串映射、模式匹配、区间选择及多数元素判断等核心算法,提供了具体实现代码,帮助读者理解并掌握竞赛中常见算法题目的解题思路。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

p1: 略
p2: 考虑最终状态一定是所有1连在一起,所以只需要找这样的区间,使得区间内1的个数最多。
在这里插入图片描述
P3: 没什么技巧,按题意直接写。 竞赛时,我看题没仔细,忽略了非连续,忽略每个用户只算一次。所以WA了几次。
P4: 从str1映射到str2,必须是单射,再考虑str2可能包含全字符,这种情况必须是自映射才行。
在这里插入图片描述

object B6 {
  object P4 {
    def canConvert(str1: String, str2: String): Boolean = {
      val table = scala.collection.mutable.HashMap[Char, Set[Char]]()
      (str1 zip str2) foreach {case (x, y) => table.put(y,table.getOrElse(y, Set.empty[Char]) + x)}
      for{
        x <- 'a' to 'z'
        y <- 'a' to 'z'
        if x != y
        if table.contains(x)
        if table.contains(y)
        if (table(x) & table(y)).nonEmpty
      } return false

      if(table.keySet.size == 26) table.keySet.forall(key => table(key).size == 1 && table(key).head == key)
      else true
    }
  }
  object P3 {
    case class Pattern(l:List[String]){
      def min(that:Pattern):Pattern = {
        l zip that.l dropWhile {case (a, b) => a == b} match {
          case Nil => this
          case (a,b)::t => if(a < b) this else that
        }
      }
    }
    def mostVisitedPattern(u: Array[String], time: Array[Int], site: Array[String]): List[String] = {
      val fre = scala.collection.mutable.HashMap[Pattern, Int]()
      def f(l:List[String]):Unit = {
        val seq = l.toArray
        var xs = List.empty[Pattern]
        for{
          i <- 0 until seq.length
          j <- i+1 until seq.length
          k <- j+1 until seq.length
          pattern = Pattern(seq(i)::seq(j)::seq(k)::Nil)
        } if(!xs.contains(pattern)){
          fre.put(pattern, 1 + fre.getOrElse(pattern, 0))
          xs ::= pattern
        }
      }

      val n = u.length
      val log = (0 until n).toArray.map{i => (u(i), time(i), site(i))}
      log
        .groupBy{case (x,y,z) => x}.values.toList
        .map{x => x.sortBy{case (x,y,z) => y}}
        .map{x => x.map{case (x,y,z) => z}.toList} foreach f

      def findMaxPattern(l:List[Pattern], n:Int = 0, p:Pattern = Pattern(Nil)):Pattern = l match {
        case Nil => p
        case h::t =>
          if(fre(h) > n) findMaxPattern(t, fre(h), h)
          else if(fre(h) == n) findMaxPattern(t, fre(h), h min p)
          else findMaxPattern(t, n, p)
      }

      findMaxPattern(fre.keySet.toList).l
    }
  }

  object P2 {
    def cum(A:Array[Int]):Array[Int] = {
      val B = Array.fill(A.length)(0)
      for{i <- B.indices} if(i == 0) B(i) = A(i) else B(i) = B(i-1) + A(i)
      B
    }
    def minSwaps(A: Array[Int]): Int = {
      val n = A.length
      val m = A.sum
      if(m == 0) return 0
      val B = cum(A)
      def f(i:Int, acc:Int):Int = {
        if(i + m >= n) acc
        else f(i+1, acc max (B(i+m) - B(i)))
      }
      m - f(0,B(m-1))
    }
  }

  object P1 {
    def isMajorityElement(A: Array[Int], x: Int): Boolean = {
      A.count(_==x) > (A.length / 2)
    }
  }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值