Golang每日一练(leetDay0007)

简介: Golang每日一练(leetDay0007)

19. 删除链表的倒数第 N 个结点 Remove-nth-node-from-end-of-list


给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。


示例 1:

cbec4d7c2004a84857c79755594f363b.jpeg


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

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


示例 2:

输入:head = [1], n = 1

输出:[]


示例 3:

输入:head = [1,2], n = 1

输出:[1]


提示:

   链表中结点的数目为 sz

   1 <= sz <= 30

   0 <= Node.val <= 100

   1 <= n <= sz


进阶:你能尝试使用一趟扫描实现吗?


代码:

package main
import (
  "fmt"
)
type ListNode struct {
  data int
  next *ListNode
}
func (head *ListNode) build(list []int) {
  for i := len(list) - 1; i >= 0; i-- {
    p := &ListNode{data: list[i]}
    p.next = head.next
    head.next = p
  }
}
func (head *ListNode) travel() {
  for p := head.next; p != nil; p = p.next {
    fmt.Print(p.data)
    if p.next != nil {
      fmt.Print("->")
    }
  }
  fmt.Println("<nil>")
}
func removeNthFromEnd(head *ListNode, n int) *ListNode {
  var fast, slow *ListNode
  fast = head
  slow = head
  for i := 0; i < n; i++ {
    fast = fast.next
  }
  if fast == nil {
    head = head.next
    return head
  }
  for fast.next != nil {
    fast = fast.next
    slow = slow.next
  }
  slow.next = slow.next.next
  return head
}
func main() {
  nums := []int{1, 2, 3, 4, 5}
  head := &ListNode{}
  head.build(nums)
  head.travel()
  head = removeNthFromEnd(head, 2)
  head.travel()
  head = &ListNode{}
  head.build([]int{1})
  head.travel()
  head = removeNthFromEnd(head, 1)
  head.travel()
  head = &ListNode{}
  head.build([]int{1, 2})
  head.travel()
  head = removeNthFromEnd(head, 1)
  head.travel()
}


输出:

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

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

1<nil>

<nil>

1->2<nil>

1<nil>

其他解法:

package main
import (
  "fmt"
)
type ListNode struct {
  data int
  next *ListNode
}
func (head *ListNode) build(list []int) {
  for i := len(list) - 1; i >= 0; i-- {
    p := &ListNode{data: list[i]}
    p.next = head.next
    head.next = p
  }
}
func (head *ListNode) travel() {
  for p := head.next; p != nil; p = p.next {
    fmt.Print(p.data)
    if p.next != nil {
      fmt.Print("->")
    }
  }
  fmt.Println("<nil>")
}
func removeNthFromEnd(head *ListNode, n int) *ListNode {
  if head == nil {
    return nil
  }
  len := countBackwards(head, n)
  if n >= len {
    return head.next
  }
  return head
}
func countBackwards(p *ListNode, n int) int {
  if p.next == nil {
    return 1
  }
  res := countBackwards(p.next, n) + 1
  if res == n+1 {
    if n == 1 {
      p.next = nil
    } else {
      p.next = p.next.next
    }
  }
  return res
}
func main() {
  nums := []int{1, 2, 3, 4, 5}
  head := &ListNode{}
  head.build(nums)
  head.travel()
  head = removeNthFromEnd(head, 2)
  head.travel()
  head = &ListNode{}
  head.build([]int{1})
  head.travel()
  head = removeNthFromEnd(head, 1)
  head.travel()
  head = &ListNode{}
  head.build([]int{1, 2})
  head.travel()
  head = removeNthFromEnd(head, 1)
  head.travel()
}



20. 有效的括号 Valid Parentheses


给定一个只包括 '('')''{''}''['']' 的字符串 s ,判断字符串是否有效。


有效字符串需满足:


  1. 左括号必须用相同类型的右括号闭合。
  2. 左括号必须以正确的顺序闭合。


示例 1:

输入:s = "()"

输出:true


示例 2:

输入:s = "()[]{}"

输出:true


示例 3:

输入:s = "(]"

输出:false


示例 4:

输入:s = "([)]"

输出:false


示例 5:

输入:s = "{[]}"

输出:true


提示:

   1 <= s.length <= 10^4

   s 仅由括号 '()[]{}' 组成


代码:

package main
import (
  "fmt"
)
func isValid(s string) bool {
  stack := make([]byte, 0)
  for _, ch := range s {
    switch ch {
    case '(':
      fallthrough
    case '[':
      fallthrough
    case '{':
      stack = append(stack, byte(ch))
    case ')':
      if len(stack) > 0 && stack[len(stack)-1] == '(' {
        stack = stack[:len(stack)-1]
      } else {
        return false
      }
    case ']':
      if len(stack) > 0 && stack[len(stack)-1] == '[' {
        stack = stack[:len(stack)-1]
      } else {
        return false
      }
    case '}':
      if len(stack) > 0 && stack[len(stack)-1] == '{' {
        stack = stack[:len(stack)-1]
      } else {
        return false
      }
    }
  }
  return len(stack) == 0
}
func main() {
  fmt.Println(isValid("()"))
  fmt.Println(isValid("()[]{}"))
  fmt.Println(isValid("(]"))
  fmt.Println(isValid("([)]"))
  fmt.Println(isValid("{()}"))
}



输出:

true

true

false

false

true



21. 合并两个有序链表 Mmerge-two-sorted-lists


将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。

示例 1:


d661704fd7a9313cfefde8cc55ef4666.jpeg




输入:l1 = [1,2,4], l2 = [1,3,4]

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


示例 2:

输入:l1 = [], l2 = []

输出:[]


示例 3:

输入:l1 = [], l2 = [0]

输出:[0]


提示:

   两个链表的节点数目范围是 [0, 50]

   -100 <= Node.val <= 100

   l1 和 l2 均按 非递减顺序 排列



代码:

package main
import (
  "fmt"
)
type ListNode struct {
  data int
  next *ListNode
}
func (head *ListNode) build(list []int) {
  for i := len(list) - 1; i >= 0; i-- {
    p := &ListNode{data: list[i]}
    p.next = head.next
    head.next = p
  }
}
func (head *ListNode) travel() {
  for p := head.next; p != nil; p = p.next {
    fmt.Print(p.data)
    if p.next != nil {
      fmt.Print("->")
    }
  }
  fmt.Println("<nil>")
}
func mergeTwoLists(l1 *ListNode, l2 *ListNode) *ListNode {
  res := &ListNode{}
  p := res
  for l1 != nil && l2 != nil {
    if l1.data < l2.data {
      p.next = l1
      l1 = l1.next
    } else {
      p.next = l2
      l2 = l2.next
    }
    p = p.next
  }
  if l1 != nil {
    p.next = l1
  } else {
    p.next = l2
  }
  return res.next
}
func main() {
  nums1 := []int{1, 2, 4}
  nums2 := []int{1, 3, 4}
  l1 := &ListNode{}
  l2 := &ListNode{}
  l1.build(nums1)
  l2.build(nums2)
  l1.travel()
  l2.travel()
  result := mergeTwoLists(l1, l2).next
  result.travel()
}


输出:

1->2->4<nil>

1->3->4<nil>

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

递归法:

package main
import (
  "fmt"
)
type ListNode struct {
  data int
  next *ListNode
}
func (head *ListNode) build(list []int) {
  for i := len(list) - 1; i >= 0; i-- {
    p := &ListNode{data: list[i]}
    p.next = head.next
    head.next = p
  }
}
func (head *ListNode) travel() {
  for p := head.next; p != nil; p = p.next {
    fmt.Print(p.data)
    if p.next != nil {
      fmt.Print("->")
    }
  }
  fmt.Println("<nil>")
}
func mergeTwoLists(l1 *ListNode, l2 *ListNode) *ListNode {
  if l1 == nil {
    return l2
  }
  if l2 == nil {
    return l1
  }
  if l1.data < l2.data {
    l1.next = mergeTwoLists(l1.next, l2)
    return l1
  }
  l2.next = mergeTwoLists(l1, l2.next)
  return l2
}
func main() {
  n1 := []int{1, 2, 4}
  n2 := []int{1, 3, 4}
  l1 := &ListNode{}
  l2 := &ListNode{}
  l1.build(n1)
  l2.build(n2)
  l1.travel()
  l2.travel()
  result := mergeTwoLists(l1, l2).next
  result.travel()
}
目录
相关文章
|
Shell Linux 算法
Shell编程——弱数据类型的脚本语言快速入门指南
Shell编程——弱数据类型的脚本语言快速入门指南
215 0
Shell编程——弱数据类型的脚本语言快速入门指南
|
Go Linux Shell
Linux 终端命令之文件浏览(2) more
Linux 终端命令之文件浏览(2) more
200 0
Linux 终端命令之文件浏览(2) more
|
Shell 机器学习/深度学习 Linux
Linux 终端操作命令(2)内部命令
Linux 终端操作命令(2)内部命令
346 0
Linux 终端操作命令(2)内部命令
|
C++ 算法 存储
力扣 C++|一题多解之动态规划专题(2)
力扣 C++|一题多解之动态规划专题(2)
227 0
力扣 C++|一题多解之动态规划专题(2)
|
Python 索引
Python Numpy入门基础(一)创建数组
Python Numpy入门基础(一)创建数组
292 0
Python Numpy入门基础(一)创建数组
|
Java 容器 程序员
Java语言程序设计试卷6套
Java语言程序设计试卷6套
1227 0
Java语言程序设计试卷6套
|
Java Go C++
Golang每日一练(leetDay0120) 反转字符串中的元音字母、前K个高频元素
Golang每日一练(leetDay0120) 反转字符串中的元音字母、前K个高频元素
225 0
Golang每日一练(leetDay0120) 反转字符串中的元音字母、前K个高频元素
|
Go 机器学习/深度学习 Rust
Golang每日一练(leetDay0119) 反转字符串I\II Reverse String
Golang每日一练(leetDay0119) 反转字符串I\II Reverse String
348 0
Golang每日一练(leetDay0119) 反转字符串I\II Reverse String
|
Java Go C++
Golang每日一练(leetDay0118) 扁平化嵌套列表迭代器、整数拆分
Golang每日一练(leetDay0118) 扁平化嵌套列表迭代器、整数拆分
222 0
Golang每日一练(leetDay0118) 扁平化嵌套列表迭代器、整数拆分
|
Java Go C++
Golang每日一练(leetDay0117) 打家劫舍III、比特位计数
Golang每日一练(leetDay0117) 打家劫舍III、比特位计数
176 0
Golang每日一练(leetDay0117) 打家劫舍III、比特位计数