Golang每日一练(leetDay0021)

简介: Golang每日一练(leetDay0021)

61. 旋转链表 Rotate List


给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置。


示例 1:

1a58e182efdb52cd290cd7649404d2eb.jpeg



输入:head = [1,2,3,4,5], k = 2

输出:[4,5,1,2,3]


示例 2:

2ac211616e064d07b0c963ec4fd0534a.jpeg



输入:head = [0,1,2], k = 4

输出:[2,0,1]


提示:

  • 链表中节点的数目在范围 [0, 500]
  • -100 <= Node.val <= 100
  • 0 <= k <= 2 * 10^9

代码:

package main
import (
  "fmt"
)
type ListNode struct {
  Val  int
  Next *ListNode
}
func rotateRight(head *ListNode, k int) *ListNode {
  if head == nil || head.Next == nil || k == 0 {
    return head
  }
  n := 1
  cur := head
  for cur.Next != nil {
    cur = cur.Next
    n++
  }
  cur.Next = head
  k = n - k%n
  for i := 0; i < k; i++ {
    cur = cur.Next
  }
  head = cur.Next
  cur.Next = nil
  return head
}
func build(nums []int) *ListNode {
  if len(nums) == 0 {
    return nil
  }
  head := &ListNode{Val: nums[0]}
  p := head
  for i := 1; i < len(nums); i++ {
    node := &ListNode{Val: nums[i]}
    p.Next = node
    p = p.Next
  }
  return head
}
func (head *ListNode) travel() {
  for p := head; p != nil; p = p.Next {
    fmt.Print(p.Val)
    if p.Next != nil {
      fmt.Print("->")
    }
  }
  fmt.Println("<nil>")
}
func main() {
  nums := []int{1, 2, 3, 4, 5}
  head := build(nums)
  head.travel()
  rotateRight(head, 2).travel()
}

输出:

1->2->3->4->5<nil>

4->5->1->2->3<nil>


62. 不同路径 Unique Paths


一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。

问总共有多少条不同的路径?


示例 1:

29b9f6142bca0f5ef31c1b38c38b4aae.png



输入:m = 3, n = 7

输出:28


示例 2:

输入:m = 3, n = 2

输出:3

解释:

从左上角开始,总共有 3 条路径可以到达右下角。

1. 向右 -> 向下 -> 向下

2. 向下 -> 向下 -> 向右

3. 向下 -> 向右 -> 向下


示例 3:

输入:m = 7, n = 3

输出:28

示例 4:

输入:m = 3, n = 3

输出:6


提示:

   1 <= m, n <= 100

   题目数据保证答案小于等于 2 * 109


代码:

package main
import (
  "fmt"
)
func uniquePaths(m int, n int) int {
  dp := make([][]int, m)
  for i := range dp {
    dp[i] = make([]int, n)
    dp[i][0] = 1
  }
  for j := 0; j < n; j++ {
    dp[0][j] = 1
  }
  for i := 1; i < m; i++ {
    for j := 1; j < n; j++ {
      dp[i][j] = dp[i-1][j] + dp[i][j-1]
    }
  }
  return dp[m-1][n-1]
}
func main() {
  fmt.Println(uniquePaths(3, 7))
  fmt.Println(uniquePaths(3, 2))
}


输出:

28

3


63. 不同路径 II Unique Paths


一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。

机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish”)。


现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?

网格中的障碍物和空位置分别用 1 和 0 来表示。



示例 1:

7e0af6dd7db65712857a5275a7cdcd9e.jpeg


输入:obstacleGrid = [[0,0,0],[0,1,0],[0,0,0]]

输出:2

解释:3x3 网格的正中间有一个障碍物。

从左上角到右下角一共有 2 条不同的路径:

1. 向右 -> 向右 -> 向下 -> 向下

2. 向下 -> 向下 -> 向右 -> 向右


示例 2:


59c86633affbc79c5ed6688919e55329.jpeg


输入:obstacleGrid = [[0,1],[0,0]]

输出:1

提示:

   m == obstacleGrid.length

   n == obstacleGrid[i].length

   1 <= m, n <= 100

   obstacleGrid[i][j] 为 0 或 1


代码:


package main
import (
  "fmt"
)
func uniquePathsWithObstacles(obstacleGrid [][]int) int {
  m, n := len(obstacleGrid), len(obstacleGrid[0])
  if obstacleGrid[0][0] == 1 || obstacleGrid[m-1][n-1] == 1 {
    return 0
  }
  dp := make([][]int, m)
  for i := range dp {
    dp[i] = make([]int, n)
  }
  dp[0][0] = 1
  for i := 1; i < m; i++ {
    if obstacleGrid[i][0] == 0 {
      dp[i][0] = dp[i-1][0]
    }
  }
  for j := 1; j < n; j++ {
    if obstacleGrid[0][j] == 0 {
      dp[0][j] = dp[0][j-1]
    }
  }
  for i := 1; i < m; i++ {
    for j := 1; j < n; j++ {
      if obstacleGrid[i][j] == 0 {
        dp[i][j] = dp[i-1][j] + dp[i][j-1]
      }
    }
  }
  return dp[m-1][n-1]
}
func main() {
  obstacleGrid := [][]int{{0, 0, 0}, {0, 1, 0}, {0, 0, 0}}
  fmt.Println(uniquePathsWithObstacles(obstacleGrid))
}



输出:

2


目录
相关文章
|
7月前
|
Shell Linux 算法
Shell编程——弱数据类型的脚本语言快速入门指南
Shell编程——弱数据类型的脚本语言快速入门指南
95 0
Shell编程——弱数据类型的脚本语言快速入门指南
|
7月前
|
Go Linux Shell
Linux 终端命令之文件浏览(2) more
Linux 终端命令之文件浏览(2) more
67 0
Linux 终端命令之文件浏览(2) more
|
7月前
|
Shell 机器学习/深度学习 Linux
Linux 终端操作命令(2)内部命令
Linux 终端操作命令(2)内部命令
73 0
Linux 终端操作命令(2)内部命令
|
7月前
|
C++ 算法 存储
力扣 C++|一题多解之动态规划专题(2)
力扣 C++|一题多解之动态规划专题(2)
66 0
力扣 C++|一题多解之动态规划专题(2)
|
7月前
|
Python 索引
Python Numpy入门基础(一)创建数组
Python Numpy入门基础(一)创建数组
76 0
Python Numpy入门基础(一)创建数组
|
7月前
|
Java 容器 程序员
Java语言程序设计试卷6套
Java语言程序设计试卷6套
817 0
Java语言程序设计试卷6套
|
7月前
|
Java Go C++
Golang每日一练(leetDay0120) 反转字符串中的元音字母、前K个高频元素
Golang每日一练(leetDay0120) 反转字符串中的元音字母、前K个高频元素
74 0
Golang每日一练(leetDay0120) 反转字符串中的元音字母、前K个高频元素
|
7月前
|
Go 机器学习/深度学习 Rust
Golang每日一练(leetDay0119) 反转字符串I\II Reverse String
Golang每日一练(leetDay0119) 反转字符串I\II Reverse String
92 0
Golang每日一练(leetDay0119) 反转字符串I\II Reverse String
|
7月前
|
Java Go C++
Golang每日一练(leetDay0118) 扁平化嵌套列表迭代器、整数拆分
Golang每日一练(leetDay0118) 扁平化嵌套列表迭代器、整数拆分
60 0
Golang每日一练(leetDay0118) 扁平化嵌套列表迭代器、整数拆分
|
7月前
|
Java Go C++
Golang每日一练(leetDay0117) 打家劫舍III、比特位计数
Golang每日一练(leetDay0117) 打家劫舍III、比特位计数
56 0
Golang每日一练(leetDay0117) 打家劫舍III、比特位计数