代码之家  ›  专栏  ›  技术社区  ›  DogCoffee

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

  •  -1
  • DogCoffee  · 技术社区  · 5 年前

    问题概述

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

    出席可以是-免费/付费/重置

    付费计数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 回复  |  直到 5 年前
        1
  •  2
  •   Chris Shaw    5 年前

    它的工作原理是 答:

    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
  •  2
  •   Alain T.    5 年前

    这应该有效:

    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]
    

    [编辑]我刚刚意识到这是一个快速的问题(不是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]
    
        3
  •  0
  •   DogCoffee    5 年前

    最后我还是这么做了-只是想知道是否有更优雅的东西

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