一些算法举例
杂项
产生不重复的随机数
- 思路
设想一下,有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