zoukankan      html  css  js  c++  java
  • [Swift]LeetCode964. 表示数字的最少运算符 | Least Operators to Express Number

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
    ➤微信公众号:山青咏芝(shanqingyongzhi)
    ➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/
    ➤GitHub地址:https://github.com/strengthen/LeetCode
    ➤原文地址:https://www.cnblogs.com/strengthen/p/10165397.html 
    ➤如果链接不是山青咏芝的博客园地址,则可能是爬取作者的文章。
    ➤原文已修改更新!强烈建议点击原文地址阅读!支持作者!支持原创!
    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

    Given a single positive integer x, we will write an expression of the form x (op1) x (op2) x (op3) x ... where each operator op1op2, etc. is either addition, subtraction, multiplication, or division (+-*, or /).  For example, with x = 3, we might write 3 * 3 / 3 + 3 - 3 which is a value of 3.

    When writing such an expression, we adhere to the following conventions:

    1. The division operator (/) returns rational numbers.
    2. There are no parentheses placed anywhere.
    3. We use the usual order of operations: multiplication and division happens before addition and subtraction.
    4. It's not allowed to use the unary negation operator (-).  For example, "x - x" is a valid expression as it only uses subtraction, but "-x + x" is not because it uses negation.

    We would like to write an expression with the least number of operators such that the expression equals the given target.  Return the least number of expressions used.

    Example 1:

    Input: x = 3, target = 19
    Output: 5
    Explanation: 3 * 3 + 3 * 3 + 3 / 3.  The expression contains 5 operations.
    

    Example 2:

    Input: x = 5, target = 501
    Output: 8
    Explanation: 5 * 5 * 5 * 5 - 5 * 5 * 5 + 5 / 5.  The expression contains 8 operations.
    

    Example 3:

    Input: x = 100, target = 100000000
    Output: 3
    Explanation: 100 * 100 * 100 * 100.  The expression contains 3 operations.

    Note:

    • 2 <= x <= 100
    • 1 <= target <= 2 * 10^8

    给定一个正整数 x,我们将会写出一个形如 x (op1) x (op2) x (op3) x ... 的表达式,其中每个运算符 op1op2,… 可以是加、减、乘、除(+-*,或是 /)之一。例如,对于 x = 3,我们可以写出表达式 3 * 3 / 3 + 3 - 3,该式的值为 3 。

    在写这样的表达式时,我们需要遵守下面的惯例:

    1. 除运算符(/)返回有理数。
    2. 任何地方都没有括号。
    3. 我们使用通常的操作顺序:乘法和除法发生在加法和减法之前。
    4. 不允许使用一元否定运算符(-)。例如,“x - x” 是一个有效的表达式,因为它只使用减法,但是 “-x + x” 不是,因为它使用了否定运算符。 

    我们希望编写一个能使表达式等于给定的目标值 target 且运算符最少的表达式。返回所用运算符的最少数量。

    示例 1:

    输入:x = 3, target = 19
    输出:5
    解释:3 * 3 + 3 * 3 + 3 / 3 。表达式包含 5 个运算符。
    

    示例 2:

    输入:x = 5, target = 501
    输出:8
    解释:5 * 5 * 5 * 5 - 5 * 5 * 5 + 5 / 5 。表达式包含 8 个运算符。
    

    示例 3:

    输入:x = 100, target = 100000000
    输出:3
    解释:100 * 100 * 100 * 100 。表达式包含 3 个运算符。

    提示:

    • 2 <= x <= 100
    • 1 <= target <= 2 * 10^8

    100ms

     1 class Solution {
     2     var x:Int = 0
     3     var best:Int = 0
     4     func leastOpsExpressTarget(_ x: Int, _ target: Int) -> Int {
     5         var target  = target
     6         self.x = x
     7         var list:[Int] = [Int]()
     8         while(target != 0)
     9         {
    10             list.append(target % x)
    11             target /= x
    12         }
    13         self.best = Int.max
    14         dfs(list, 0, 0, 0)
    15         return best - 1
    16     }
    17     
    18     func dfs(_ list:[Int],_ k:Int,_ add:Int,_ count:Int)
    19     {
    20         var add = add
    21         if count >= best
    22         {
    23             return
    24         }
    25         if add == 0 && k >= list.count
    26         {
    27             best = min(best, count)
    28             return
    29         }
    30         
    31         if k < list.count
    32         {
    33             add += list[k]
    34         }
    35         var cost:Int = k == 0 ? 2 : k
    36         var cur:Int = add % x
    37         add /= x
    38         dfs(list, k + 1, add, count + cost * cur)
    39         if cur != 0 && k <= list.count + 2
    40         {
    41             dfs(list, k + 1, 1, count + cost * (x - cur))
    42         }
    43     }
    44 }
  • 相关阅读:
    [转]protobuf的编译安装
    [转]OpenMP中几个容易混淆的函数(线程数量/线程ID/线程最大数)以及并行区域线程数量的确定
    C++类中静态数据成员MAP如何初始化
    [转]gcc -ffunction-sections -fdata-sections -Wl,–gc-sections 参数详解
    的机器学习开源工具分享
    机器学习常见的采样方法
    图像配准与深度学习方法
    卷积网络中的几何学你了解多少?
    云计算、虚拟化和容器
    在数据科学领域,你掌握这个24个python库就够了!
  • 原文地址:https://www.cnblogs.com/strengthen/p/10165397.html
Copyright © 2011-2022 走看看