反转整数数组的某些子序列

时间:2019-02-20 02:42:00

标签: arrays swift

问题概述

我有一个项目清单-基本上是一个人员出勤的运行清单

参加者可以是-免费/付费/重置

付费计数为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]

3 个答案:

答案 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()
    }
}