招标系统
/*
请你设计一个招标系统,需要实现以下几个功能:
AddTender(int userId, int projectId, int price) - 将投标方 userId 对项目 projectId 的投标金额 price 录入系统;
若系统中已存在 userId 对项目 projectId 的投标金额,则不作处理。
UpdateTender(int userId, int projectId, int price) - 若系统中存在投标方 userId 对项目 projectId 的投标金额,
则将该金额更新为 price,并返回更新前的投标金额;否则请返回 -1。
RemoveTender(int userId, int projectId) - 若系统中存在投标方 userId 对项目 projectId 的投标金额,删除该投标记录,返回被删除的投标金额;否则返回 -1
QueryTender(int projectId, int price) - 查询并返回系统中项目 projectId 的投标记录中,投标金额大于 price 且最接近 price 的投标方 userId;
o 若有多个投标方投标金额相同,比较投标方最后一次投标时间,返回投标时间最早的投标方 userId;(AddTender 和 UpdateTender 都是投标)
o 若不存在符合要求的投标记录,请返回 -1;
示例:
输入:
["TenderSystem","addTender","addTender","addTender","updateTender","updateTender","removeTender",
"removeTender","addTender","addTender","addTender","queryTender","queryTender"]
[[],[1,1,10],[2,2,20],[2,2,30],[1,1,40],[1,3,40],[1,1],[1,3],[1,2,20],[3,2,10],[4,2,40],[2,15],[5,10]]
输出:[null,null,null,null,10,-1,40,-1,null,null,null,2,-1]
示例 2:
输入:["TenderSystem","addTender","addTender","updateTender","queryTender"]
[[],[1,1,10],[2,1,20],[1,1,20],[1,10]]
输出:[null,null,null,10,2]
解释:
TenderSystem t = TenderSystem()
t.AddTender(1,1,10) // 在系统中添加 userId 为 1,projectId 为 1 的投标金额 10
t.AddTender(2,1,20) // 在系统中添加 userId 为 2,projectId 为 1 的投标金额 20
t.UpdateTender(1,1,20) // 在系统中将 userId 为 1,projectId 为 1 的投标金额更新为 20,并返回更新前的金额 10
t.QueryTender(1,10) // 查询系统中 projectId 为 1,投标金额大于 10 且最接近 10 的 userId,1 与 2 均符合条件,
由于 userId 1 更新时间晚(虽然 userId 1先做了首次投标,但是取其最后一次更新投标的时间来进行比较),因此返回最早录入系统的 userId 2
提示:
· 1 <= userId <= 10^4
· 1 <= projectId <= 10^6
· 1 <= price <= 10^8
· addTender、updateTender、removeTender、queryTender 累计操作数 <= 1000
*/
package main
import "fmt"
func main() {
obj := Constructor()
obj.addTender(1, 1, 10)
fmt.Println(obj)
obj.addTender(2, 1, 20)
fmt.Println(obj)
obj.updateTender(1, 1, 20)
fmt.Println(obj)
obj.removeTender(1, 1)
fmt.Println(obj)
obj.queryTender(1, 10)
}
type TenderSystem struct {
data map[int]map[int]tenderData
}
var currentTime = 0
const dataCap = 10000
type tenderData struct {
price int
time int
}
func Constructor() TenderSystem {
return TenderSystem{make(map[int]map[int]tenderData, dataCap)}
}
func (tenderSystem *TenderSystem) addTender(userId int, projectId int, price int) {
if _, ok := tenderSystem.data[projectId]; !ok {
tenderSystem.data[projectId] = map[int]tenderData{}
}
if _, ok := tenderSystem.data[projectId][userId]; !ok {
tenderSystem.data[projectId][userId] = tenderData{price, currentTime}
currentTime++
}
}
func (tenderSystem *TenderSystem) updateTender(userId int, projectId int, price int) int {
if _, ok := tenderSystem.data[projectId][userId]; ok {
var lastPrice = tenderSystem.data[projectId][userId].price
tenderSystem.data[projectId][userId] = tenderData{price, currentTime}
currentTime++
return lastPrice
}
return -1
}
func (tenderSystem *TenderSystem) removeTender(userId int, projectId int) int {
if _, ok := tenderSystem.data[projectId][userId]; ok {
var lastPrice = tenderSystem.data[projectId][userId].price
delete(tenderSystem.data[projectId], userId)
return lastPrice
}
return -1
}
func (tenderSystem *TenderSystem) queryTender(projectId int, price int) int {
var record = tenderSystem.data[projectId]
var minPrice = 100000000
var minTime = 0
var ans = -1
for u, m := range record {
if m.price <= price {
continue
}
if m.price < minPrice {
minPrice = m.price
minTime = m.time
ans = u
} else if m.price == minPrice && m.time < minTime {
minTime = m.time
ans = u
}
}
return ans
}
网友评论