日月换新天。为有牺牲多壮志,敢教

[Swift-2019力扣杯春季初赛]3. 最小化舍入误差以满足目标

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

热烈欢迎,请直接点击!!!

进入博主App Store主页,下载使用各个作品!!!

注:博主将坚持每月上线一个新app!!!

给定一系列价格 [p1,p2...,pn] 和一个目标 target,将每个价格 pi 舍入为 Roundi(pi) 以使得舍入数组 [Round1(p1),Round2(p2)...,Roundn(pn)] 之和达到给定的目标值 target。每次舍入操作 Roundi(pi) 可以是向下舍 Floor(pi) 也可以是向上入 Ceil(pi)

如果舍入数组之和无论如何都无法达到目标值 target,就返回 -1。否则,以保留到小数点后三位的字符串格式返回最小的舍入误差,其定义为 Σ |Roundi(pi) - (pi)|( i 从 1 到 n )。

示例 1:

输入:prices = ["0.700","2.800","4.900"], target = 8
输出:"1.000"
解释: 
使用 Floor,Ceil 和 Ceil 操作得到 (0.7 - 0) + (3 - 2.8) + (5 - 4.9) = 0.7 + 0.2 + 0.1 = 1.0 。

示例 2:

输入:prices = ["1.500","2.500","3.500"], target = 10
输出:"-1"
解释:
达到目标是不可能的。

提示:

  1. 1 <= prices.length <= 500
  2. 表示价格的每个字符串 prices[i] 都代表一个介于 0 和 1000 之间的实数,并且正好有 3 个小数位。
  3. target 介于 0 和 1000000 之间。

44 ms

复制代码
 1 class Solution {
 2     func minimizeError(_ prices: [String], _ target: Int) -> String {
 3         var prices:[Double] = prices.map{Double($0)!}
 4         var numMin:Int = 0
 5         var numMax:Int = 0
 6         var arrFloor:[Double] = [Double]()
 7         var arrCeil:[Double] = [Double]()
 8         for price in prices
 9         {
10             let numFloor:Double = floor(price)
11             let numCeil:Double = ceil(price)
12             arrFloor.append(price - numFloor)
13             arrCeil.append(numCeil - price)
14             numMin += Int(numFloor)
15             numMax += Int(numCeil)    
16         }
17         guard target >= numMin && target <= numMax else
18         {
19             return "-1"
20         }
21         let ceilCount:Int = target - numMin
22         let floorCount:Int = prices.count - ceilCount
23         let arrFloorSort:[Double] = arrFloor.sorted(by:<)
24         var res:Double = 0.0
25         for i in 0..<floorCount
26         {
27             res += arrFloorSort[i]
28             let index:Int = arrFloor.index(of:arrFloorSort[i])!
29             arrCeil[index] = 1.0
30         }
31         arrCeil.sort()
32         res += [Double](arrCeil[0..<ceilCount]).reduce(0,+)
33         return String(format:"%.3f",res)
34     }
35 }
复制代码

 

posted @   为敢技术  阅读(318)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示
哥伦布
09:09发布
哥伦布
09:09发布
2°
西南风
2级
空气质量
相对湿度
62%
今天
2°/16°
周二
7°/19°
周三
多云
7°/19°