问题概述
我有一个项目清单-基本上是一个人员出勤的运行清单
参加者可以是-免费/付费/重置
付费计数为1,重设从1开始下一个付费会话
例如
1月1日(付费)>> 2
1月2日(付费)>> 1
1月7日(免费)>> 0
1月8日(免费)>> 0
1月12日(重置)>> 0
1月20日(付费)>> 4
1月21日(付费)>> 3
1月26日(付费)>> 2
2月6日(免费)>> 0
2月8日(付费)>> 1
2月12日(免费)>> 0
示例
enum AttendanceType {
case paid, free, reset
}
let c: [AttendanceType] = [.paid, .paid, .paid]
// [3,2,1]
let d: [AttendanceType] = [.paid, .free, .paid, .paid, .paid]
// [1,0,3,2,1]
let a: [AttendanceType] = [.free, .paid, .free, .reset, .paid, .paid, .paid, .paid]
// [0, 1, 0, 0, 4, 3, 2, 1]
let b: [AttendanceType] = [.reset, .paid, .free, .paid, .reset, .paid, .paid]
// [0, 2, 0, 1, 0, 2, 1]
答案 0 :(得分:2)
这应该有效:
def subReverse(arr):
result = []
position = 0
for index,item in enumerate(arr):
if item == 0: position = index+1
result.insert(position,item)
return result
subReverse([0, 1, 0, 0, 1, 2, 3, 4]) # [0, 1, 0, 0, 4, 3, 2, 1]
[EDIT]我刚刚意识到这是一个Swift问题(不是Python)。这是Swift中的相同功能:
func subReverse(_ array:[Int]) -> [Int]
{
var result = [Int]()
var position = 0
for (index,item) in array.enumerated()
{
if item == 0 { position = index+1 }
result.insert(item, at:min(position,result.count))
}
return result
}
subReverse([0, 1, 0, 0, 1, 2, 3, 4]) // [0, 1, 0, 0, 4, 3, 2, 1]
答案 1 :(得分:2)
这是 an 答案:
func portionReverse(_ input: [Int]) -> [Int]
{
var output: [Int] = []
var subArray: [Int] = []
input.forEach
{
if $0 == 0
{
output.append(contentsOf: subArray.reversed())
output.append(0)
subArray = []
}
else
{
subArray.append($0)
}
}
output.append(contentsOf: subArray.reversed())
return output
}
答案 2 :(得分:0)
最后我选择了这个-只想知道是否还有更优雅的东西
extension Collection where Element == AttendanceType {
var itemSort: [Int] {
var output = [Int]()
var current = 0
self.reversed().forEach { item in
switch item {
case .free:
output.append(0)
case .paid:
current += 1
output.append(current)
case .reset:
current = 0
output.append(current)
}
}
return output.reversed()
}
}