Golang每日一练(leetDay0096) 添加运算符、移动零

简介: Golang每日一练(leetDay0096) 添加运算符、移动零

282. 给表达式添加运算符 Expression Add Operators

给定一个仅包含数字 0-9 的字符串 num 和一个目标值整数 target ,在 num 的数字之间添加 二元 运算符(不是一元)+-* ,返回 所有 能够得到 target 的表达式。

注意,返回表达式中的操作数 不应该 包含前导零。

示例 1:

输入: num = "123", target = 6

输出: ["1+2+3", "1*2*3"]

解释: “1*2*3” 和 “1+2+3” 的值都是6。


示例 2:

输入: num = "232", target = 8

输出: ["2*3+2", "2+3*2"]

解释: “2*3+2” 和 “2+3*2” 的值都是8。


示例 3:

输入: num = "3456237490", target = 9191

输出: []

解释: 表达式 “3456237490” 无法得到 9191 。


提示:

  • 1 <= num.length <= 10
  • num 仅含数字
  • -2^31 <= target <= 2^31 - 1

代码:

package main
import (
  "fmt"
  "strconv"
)
func addOperators(num string, target int) []string {
  res := []string{}
  var dfs func(expr string, cur, prev, sum int)
  dfs = func(expr string, cur, prev, sum int) {
    if cur == len(num) {
      if sum == target {
        res = append(res, expr)
      }
      return
    }
    for i := cur; i < len(num); i++ {
      if i != cur && num[cur] == '0' {
        break
      }
      val, _ := strconv.Atoi(num[cur : i+1])
      if cur == 0 {
        dfs(num[:i+1], i+1, val, val)
        continue
      }
      dfs(expr+"+"+num[cur:i+1], i+1, val, sum+val)
      dfs(expr+"-"+num[cur:i+1], i+1, -val, sum-val)
      dfs(expr+"*"+num[cur:i+1], i+1, prev*val, sum-prev+prev*val)
    }
  }
  dfs("", 0, 0, 0)
  return res
}
func main() {
  fmt.Println(addOperators("123", 6))           // ["1+2+3" "1*2*3"]
  fmt.Println(addOperators("232", 8))           // ["2+3*2" "2*3+2"]
  fmt.Println(addOperators("3456237490", 9191)) // []
}

输出:

[1+2+3 1*2*3]

[2+3*2 2*3+2]

[]


283. 移动零 Move Zeroes

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

请注意 ,必须在不复制数组的情况下原地对数组进行操作。

示例 1:

输入: nums = [0,1,0,3,12]

输出: [1,3,12,0,0]


示例 2:

输入: nums = [0]

输出: [0]

提示:

  • 1 <= nums.length <= 10^4
  • -2^31 <= nums[i] <= 2^31 - 1

进阶:你能尽量减少完成的操作次数吗?

代码:

package main
import "fmt"
func moveZeroes(nums []int) {
  n := len(nums)
  j := 0 // 非零元素应该插入的位置
  for i := 0; i < n; i++ {
    if nums[i] != 0 {
      nums[j], nums[i] = nums[i], nums[j] // 交换位置
      j++
    }
  }
}
func moveZeroes2(nums []int) {
  n := len(nums)
  j := 0 // 非零元素的个数
  for i := 0; i < n; i++ {
    if nums[i] != 0 {
      nums[j] = nums[i]
      if i != j {
        nums[i] = 0
      }
      j++
    }
  }
}
func main() {
  nums := []int{0, 1, 0, 3, 12}
  moveZeroes(nums)
  fmt.Println(nums) // [1 3 12 0 0]
  nums = []int{0, 1, 0, 3, 12}
  moveZeroes2(nums)
  fmt.Println(nums) // [1 3 12 0 0]
  nums2 := []int{0}
  moveZeroes2(nums2)
  fmt.Println(nums2) // [0]
}

输出:

[1 3 12 0 0]

[1 3 12 0 0]

[0]


🌟 每日一练刷题专栏 🌟

持续,努力奋斗做强刷题搬运工!

👍 点赞,你的认可是我坚持的动力!

🌟 收藏,你的青睐是我努力的方向!

评论,你的意见是我进步的财富!  

主页:https://hannyang.blog.csdn.net/

Rust每日一练 专栏

(2023.5.16~)更新中...

Golang每日一练 专栏

(2023.3.11~)更新中...

Python每日一练 专栏

(2023.2.18~2023.5.18)暂停更

C/C++每日一练 专栏

(2023.2.18~2023.5.18)暂停更

Java每日一练 专栏

(2023.3.11~2023.5.18)暂停更


目录
相关文章
|
1月前
|
算法
【❤️算法笔记❤️】-每日一刷-23、合并 K 个升序链表
【❤️算法笔记❤️】-每日一刷-23、合并 K 个升序链表
32 0
|
1月前
LeetCode第二十四题(两两交换链表中的节点)
这篇文章介绍了LeetCode第24题的解法,即如何通过使用三个指针(preNode, curNode, curNextNode)来两两交换链表中的节点,并提供了详细的代码实现。
18 0
LeetCode第二十四题(两两交换链表中的节点)
|
1月前
Leetcode第十九题(删除链表的倒数第N个节点)
LeetCode第19题要求删除链表的倒数第N个节点,可以通过快慢指针法在一次遍历中实现。
44 0
Leetcode第十九题(删除链表的倒数第N个节点)
|
1月前
(剑指offer)18、删除链表的节点—22、链表中倒数第K个节点—25、合并两个排序的链表—52、两个链表的第一个公共节点(2021.12.07)
(剑指offer)18、删除链表的节点—22、链表中倒数第K个节点—25、合并两个排序的链表—52、两个链表的第一个公共节点(2021.12.07)
49 0
|
3月前
|
算法
LeetCode第24题两两交换链表中的节点
这篇文章介绍了LeetCode第24题"两两交换链表中的节点"的解题方法,通过使用虚拟节点和前驱节点技巧,实现了链表中相邻节点的交换。
LeetCode第24题两两交换链表中的节点
|
3月前
|
算法
LeetCode第23题合并 K 个升序链表
这篇文章介绍了LeetCode第23题"合并K个升序链表"的解题方法,使用分而治之的思想,通过递归合并链表的方式解决了这个难题。
LeetCode第23题合并 K 个升序链表
05_删除链表的倒数第N个节点
05_删除链表的倒数第N个节点
04_两两交换链表中的节点
04_两两交换链表中的节点
|
3月前
|
Python
【Leetcode刷题Python】剑指 Offer 22. 链表中倒数第k个节点
Leetcode题目"剑指 Offer 22. 链表中倒数第k个节点"的Python解决方案,使用双指针法找到并返回链表中倒数第k个节点。
54 5
|
3月前
|
Python
【Leetcode刷题Python】剑指 Offer 18. 删除链表的节点
Leetcode题目"剑指 Offer 18. 删除链表的节点"的Python解决方案,通过使用双指针法找到并删除链表中值为特定数值的节点,然后返回更新后的链表头节点。
41 4