实现按指定规则分配退款金额的客户折扣计算函数
退款金额分配函数实现
问题描述
给定表示总超额可退款金额的字符串S,以及由K个字符串组成的数组B(每个元素对应客户的未折扣账单金额),返回与B顺序一致的字符串数组R,其中每个元素为对应客户的折扣金额。
示例说明
示例1
给定S="300.01",B=["300.00", "200.00", "100.00"]
R[0]="150.00"(计算方式:300.01*300.00/600.00)R[1]="100.00"(计算方式:150.01*200.00/300.00)R[2]="50.01"(计算方式:50.01*100.00/100.00)
示例2(重点关注)
给定S="1.00",B=["0.05","1.00"]
- 优先处理金额最大的
1.00:
a. 计算1.00*1.00/1.05≈0.95238...
b. 向下舍入到最接近的0.01,得到"0.95",将零碎便士转至账单金额更小的客户
c. 设置R[1]="0.95"(对应B中1.00的位置,为结果数组的第2个元素) - 剩余可退款金额为
0.05 - 处理金额较小的
B[0]=0.05:
a. 计算0.05*0.05/0.05=0.05
b. 无需舍入
c. 设置R[0]="0.05",最终R=["0.05", "0.95"]
函数定义(Java)
class Solution { public String[] solution(String S, String[] B); }
注意事项
- 总金额
S需完全退还,不得多退或少退,精确到便士 - 禁止使用浮点数进行精确货币计算,避免精度丢失
- 计算出的折扣金额需向下舍入至最接近的0.01,零碎便士转至账单金额更小的客户
- 结果需以保留两位小数的字符串形式表示,例如
"100.00" - 输入均合法,可退款总金额不会超过未折扣账单总额
- 返回的折扣金额顺序必须与输入账单顺序一致
附:提供的示例代码(注:该代码与当前退款问题不匹配,疑似粘贴错误)
def solution(A): answer = 0 current_sum = 0 #Currently there is one empty subarray with sum 0 prefixSumCount = {0:1} for list_element in A: current_sum = current_sum + list_element if current_sum in prefixSumCount: answer = answer + prefixSumCount[current_sum] if current_sum not in prefixSumCount: prefixSumCount[current_sum] = 1 else: prefixSumCount[current_sum] = prefixSumCount[current_sum] + 1 if answer > 1000000000: return -1 else: return answer
示例运行
A = [2,-2,3,0,4,-7] print(solution(A))
内容的提问来源于stack exchange,提问作者Muhammad Ali Sufiyan
相关产品推荐
相关产品推荐

