golang力扣leetcode 第 289 场周赛

简介: golang力扣leetcode 第 289 场周赛

前言

四题A两题。。。。菜。。

第一题

2243.计算字符串的数字和

2243.计算字符串的数字和

题解

对着题目模拟即可,简单题,练习如何写的更加优雅

代码

func digitSum(s string, k int) string {
  if len(s) <= k {
    return s
  }
  str := ""
  for i := 0; i < len(s); i += k {
    cur := 0
    for j := i; j < i+k && j < len(s); j++ {
      cur += int(s[j] - '0')
    }
    str += strconv.Itoa(cur)
  }
  fmt.Println(str)
  return digitSum(str, k)
}

第二题

2244.完成所有任务需要的最少轮数

2244.完成所有任务需要的最少轮数

题解

题目:每一轮只能完成相同等级的任务,并且只能完成2个或者3个,求完成所有任务要多少轮

思路:统计同等级的任务有多少个,贪心,优先每一轮完成3个,3个不行则2个,发现规律,设任务为v,则需要(v + 2) / 3轮

任务数量: 1 2 3 4 5 6 7 8 9 10 11 12 13
完成轮数:-1 1 1 2 2 2 3 3 3 4  4  4  4

代码

func minimumRounds(tasks []int) int {
  mp := make(map[int]int)
  for _, v := range tasks {
    mp[v]++
  }
  ans := 0
  for _, v := range mp {
    if v == 1 {
      return -1
    } else {
      ans += (v + 2) / 3
    }
  }
  return ans
}

第三题

2245.转角路径的乘积中最多能有几个尾随零

2245.转角路径的乘积中最多能有几个尾随零

题解

题目:只能转一次,求路径中每个元素相乘的结果有几个零

思路:

  1. 正数的乘积结果中尾 0 的个数由乘数中 因子 2,5 的个数中较小的决定,即 尾随零=min(num2,num5)
  2. 路径要么是横,竖,要么是UL,UR,DL,DR
  3. 用前缀和维护每一行和每一列因子 22 与因子 55 的数量
  4. 枚举拐点(i,j)计算答案

代码

func maxTrailingZeros(grid [][]int) int {
  //初始化
  n := len(grid)
  m := len(grid[0])
  factor := make([][]pair, n+1) //2和5的数量
  x := make([][]pair, n+1)      //列 x
  y := make([][]pair, n+1)      //行 y
  for i := 0; i <= len(grid); i++ {
    factor[i] = make([]pair, m+1)
    x[i] = make([]pair, m+1)
    y[i] = make([]pair, m+1)
  }
  //计算前缀和
  for i := 1; i <= n; i++ {
    for j := 1; j <= m; j++ {
      factor[i][j] = getRes(grid[i-1][j-1])
      x[i][j].two = x[i-1][j].two + factor[i][j].two
      x[i][j].five = x[i-1][j].five + factor[i][j].five
      y[i][j].two = y[i][j-1].two + factor[i][j].two
      y[i][j].five = y[i][j-1].five + factor[i][j].five
    }
  }
  //计算答案
  ans := 0
  for i := 1; i <= n; i++ {
    for j := 1; j <= m; j++ {
      upAndLeft := min(x[i][j].two+y[i][j].two-factor[i][j].two, x[i][j].five+y[i][j].five-factor[i][j].five)
      upAndRight := min(x[i][j].two+y[i][m].two-y[i][j].two, x[i][j].five+y[i][m].five-y[i][j].five)
      downAndLeft := min(x[n][j].two+y[i][j].two-x[i][j].two, x[n][j].five+y[i][j].five-x[i][j].five)
      downAndRight := min(x[n][j].two+y[i][m].two-x[i-1][j].two-y[i][j].two, x[n][j].five+y[i][m].five-x[i-1][j].five-y[i][j].five)
      ans = max(ans, upAndLeft)
      ans = max(ans, upAndRight)
      ans = max(ans, downAndLeft)
      ans = max(ans, downAndRight)
    }
  }
  return ans
}
func getRes(val int) pair {
  two, five := 0, 0
  a, b := val, val
  for a%2 == 0 && a != 0 {
    a /= 2
    two++
  }
  for b%5 == 0 && b != 0 {
    b /= 5
    five++
  }
  return pair{two: two, five: five}
}
func min(i, j int) int {
  if i > j {
    return j
  }
  return i
}
func max(i, j int) int {
  if i > j {
    return i
  }
  return j
}

第四题

2246.相邻字符不同的最长路径

2246.相邻字符不同的最长路径

题解

题目:给一棵树的每个节点赋一个字符,求一个最长路径,相邻节点的字符不能一样

思路:

  1. 路径为 t1 <- target -> t2
  2. t1和t2可以为零
  3. 枚举target
  4. 用dfs枚举所有情况

代码

func longestPath(parent []int, s string) (ans int) {
  n := len(parent)
  //key 父节点 val 子节点,存图
  g := make(map[int][]int)
  for i := 1; i < n; i++ {
    fa := parent[i]
    g[fa] = append(g[fa], i)
  }
  var dfs func(x int) (tLen int)
  dfs = func(x int) (maxLen int) {
    //最长,次长
    fstLong, scdLong := 0, 0
    //遍历所有子节点
    for _, y := range g[x] {
      subLong := dfs(y)
      //相邻节点字符不相等
      if s[x] != s[y] {
        if subLong > fstLong {
          scdLong = fstLong
          fstLong = subLong
        } else if subLong > scdLong {
          scdLong = subLong
        }
      }
    }
    //更新答案,路径长=最长+次长+本节点1
    ans = max(ans, fstLong+scdLong+1)
    //返回当前节点下的最长路径+本身这个节点1
    return fstLong + 1
  }
  dfs(0)
  return ans
}
func max(a, b int) int {
  if b > a {
    return b
  }
  return a
}


目录
相关文章
|
2天前
|
Java
【LeetCode力扣】面试题 17.14. 最小K个数(top-k问题)
【LeetCode力扣】面试题 17.14. 最小K个数(top-k问题)
11 1
|
2天前
|
存储 算法
【LeetCode力扣】单调栈解决Next Greater Number(下一个更大值)问题
【LeetCode力扣】单调栈解决Next Greater Number(下一个更大值)问题
6 0
|
2天前
|
存储
Leetcode第382场周赛
```markdown 给定字符串`s`,计算按键变更次数,即使用不同键的次数,不考虑大小写差异。例如,`&quot;aAbBcC&quot;`变更了2次。函数`countKeyChanges`实现此功能。另外,求满足特定模式子集最大元素数,`maximumLength`函数使用`TreeMap`统计次数,枚举并构建子集,返回最大长度。最后,Alice和Bob玩鲜花游戏,Alice要赢需满足鲜花总数奇数、顺时针在[1,n]、逆时针在[1,m],返回满足条件的(x, y)对数,可通过奇偶性分类讨论求解。 ```
13 1
|
2天前
|
存储
Leetcode第383场周赛
在LeetCode第383场周赛中,选手完成了3道题目。第一题是关于边界上的蚂蚁,蚂蚁根据非零整数数组nums的值移动,返回蚂蚁返回边界上的次数。解题方法是计算数组累加和为0的次数。第二题涉及计算网格的区域平均强度,给定一个灰度图像和阈值,返回每个像素所属区域的平均强度。解题关键在于理解相邻像素和区域定义,并计算平均强度。第三题是恢复单词初始状态的最短时间问题,通过移除前k个字符并添加k个字符,求恢复原词所需的最短时间。解题策略是检查去除前k个字符后的子串是否能作为原词的前缀。
12 1
Leetcode第383场周赛
|
2天前
|
Go 容器 SQL
【Golang Leetcode】总目录(Day1~100)
【Golang Leetcode】总目录(Day1~100)
477 1
【Golang Leetcode】总目录(Day1~100)
|
2天前
|
Go
golang力扣leetcode 494.目标和
golang力扣leetcode 494.目标和
32 0
|
2天前
|
Go
golang力扣leetcode 剑指Offer II 114. 外星文字典
golang力扣leetcode 剑指Offer II 114. 外星文字典
21 0
|
2天前
|
Go
golang力扣leetcode 第 295 场周赛
golang力扣leetcode 第 295 场周赛
37 0
|
2天前
|
监控 算法 Go
Golang深入浅出之-Go语言中的服务熔断、降级与限流策略
【5月更文挑战第4天】本文探讨了分布式系统中保障稳定性的重要策略:服务熔断、降级和限流。服务熔断通过快速失败和暂停故障服务调用来保护系统;服务降级在压力大时提供有限功能以保持整体可用性;限流控制访问频率,防止过载。文中列举了常见问题、解决方案,并提供了Go语言实现示例。合理应用这些策略能增强系统韧性和可用性。
52 0
|
2天前
|
分布式计算 Java Go
Golang深入浅出之-Go语言中的分布式计算框架Apache Beam
【5月更文挑战第6天】Apache Beam是一个统一的编程模型,适用于批处理和流处理,主要支持Java和Python,但也提供实验性的Go SDK。Go SDK的基本概念包括`PTransform`、`PCollection`和`Pipeline`。在使用中,需注意类型转换、窗口和触发器配置、资源管理和错误处理。尽管Go SDK文档有限,生态系统尚不成熟,且性能可能不高,但它仍为分布式计算提供了可移植的解决方案。通过理解和掌握Beam模型,开发者能编写高效的数据处理程序。
140 1