杂项算法

 

一些算法举例

杂项

产生不重复的随机数

  • 思路

设想一下,有n个苹果,有不同的编号,从1-n,每次拿一个出来。来产生不同的随机数

  • 实现
func randomNumberWithoutDuplication(_ number: Int) -> [Int] {
  var resultArr = Array(repeating: 0, count: number)
  var startArr = Array(1...number)

  for i in 0..<startArr.count {
    let currentCount = UInt32(startArr.count-i)
    let index = Int(arc4random_uniform(currentCount))
    resultArr[i] = startArr[index]
    startArr[index] = startArr[Int(currentCount) - 1]
  }

  return resultArr
}
  • 测试

let aaa = solution.randomNumberWithoutDuplication(10)

[1, 5, 8, 9, 4, 3, 10, 2, 6, 7]

求解n!的结果中有多少个0

  • 思路

    首先我们知道10=25,所以有多少个0取决于有多少个25。而n!中包含5的因子的个数,可以用下面的表达式来计算

    k= n/5+n/5^2+n/5^3+…

    同样的n!包含2的因子的个数可以用下面的表达式来计算

    m= n/2+n/2^2+n/2^3+…

    很显然m>k。所以末尾0的个数是min(m,k)也就是k了。

  • 实现

    func trailing_zero_num(number: Int) -> Int {
      var num = 0
      var n = number
      while Bool(truncating: n as NSNumber) {
        num += n/5
        n = n/5
      }
      return num
    }
    

多线程交替打印A,B分别10次

  • 实现
func outABWithGCD() {
  let queue1 = DispatchQueue(label: "com.queue1.a", qos: .utility)
  let queue2 = DispatchQueue(label: "com.queue2.b", qos: .utility)

  var change: Bool = true

  queue1.async {
    var count1 = 0
    while true {
      if change {
        print("queue1:A")
        change = false
        count1+=1
      }

      if count1 == 10 {
        break
      }
    }
  }

  queue2.async {
    var count2 = 0
    while true {
      if !change {
        print("queue2:B")
        change = true
        count2+=1
      }

      if count2 == 10 {
        break
      }
    }
  }
}
  • 示例
solution.outABWithGCD()
  • 结果

queue1:A

queue2:B

queue1:A

queue2:B

queue1:A

queue2:B

queue1:A

queue2:B

queue1:A

queue2:B

queue1:A

queue2:B

queue1:A

queue2:B

queue1:A

queue2:B

queue1:A

queue2:B

queue1:A

queue2:B