设整数n>1,n是目标数指的是:n没有2、3、5之外的素因子。
例如:2、3、5、6、1024、27、125都是目标数;14不是目标数(有素因子7),93不是目标数(有素因子31),101不是目标数(有素因子101)。
找到所有目标数中最小的10000个,并按照从小到大的顺序打印出来。
第 1 条附言 ·
本题目的背景是:面试考官发现候选人的简历上写`熟悉数据结构和基本算法`,故而出此题目。
这个最好使用一个动态遍历的、有序的、插入耗时短的结构,来保存候选数字。
然后我们就可以一边生成候选数字,存入这个结构,一边从这个结构里按从小到大的顺序取出数字就行了。
个人觉得最合适的数据结构,就是跳表。插入时间Nlog(N),遍历时更是log(1)的复杂度。
双向链表和平衡二叉查找树的复合数据结构也很合适。
不知道python里有没有。
我自己的库里倒是有两个。只要采用了合适的数据结构,代码反而很简单。
跳表版本(这个跳表采用int64+string作为键,值为interface{})
package main
import (
"fmt"
"github.com/hydra13142/container/skiplist"
"os"
)
type Void = struct{}
func main() {
t := skiplist.New()
for i := 2; i < 6; i++ {
t.Insert(int64(i), "", Void{})
}
p := t.SearchByIndex(0)
xs := [10000]int64{}
for i := 0; i < 10000; i++ {
k, _ := p.Key()
xs[i] = k
t.Insert(k*2, "", Void{})
t.Insert(k*3, "", Void{})
t.Insert(k*5, "", Void{})
p.Next()
}
file, _ := os.Create("output2.txt")
defer file.Close()
fmt.Fprintln(file, xs)
}
二叉树版本(SBT树采用int64作为键,值为interface{})
package main
import (
"fmt"
"github.com/hydar13142/container/sbt"
"os"
)
type Void = struct{}
func main() {
t := sbt.NewSBT()
for i := 2; i < 6; i++ {
t.Insert(int64(i), Void{})
}
p := t.Index(0)
xs := [10000]int64{}
for i := 0; i < 10000; i++ {
k := p.Key()
xs[i] = k
t.Insert(k*2, Void{})
t.Insert(k*3, Void{})
t.Insert(k*5, Void{})
// t.DeleteNode(p) 删不删节点都不影响结果
p = p.Next()
}
file, _ := os.Create("output.txt")
defer file.Close()
fmt.Fprintln(file, xs)
}
#21
更多评论
```python
#! /usr/bin/env python
def mul_nums(nums,size):
curnums = []
retnums = []
minnum = nums[0]
for c in nums:
curnums.append(c)
retnums.append(c)
if c < minnum:
minnum = c
i = len(retnums)
while i < size:
minnum = curnums[0]
minidx = 0
idx = 0
for c in curnums:
if c < minnum:
minnum = c
minidx = idx
idx += 1
minmulnum = curnums[0] * nums[0]
for c in curnums:
for d in nums:
if (c * d) < minmulnum:
minmulnum = (c * d)
retnums.append(curnums[minidx])
curnums[minidx] = minmulnum
i += 1
return retnums
def main():
retnums = mul_nums([2,3,5],10000)
for c in retnums:
print('[%d]\n'%(c))
main()
```
#1
```
#!/usr/bin/env python
# -*- coding:utf-8 -*-
"""
10000以内 素因子只有2,3,5的数
只需要log2(10000) * log3(10000)*log5(10000)次循环 520次 最终的数据个数小于这个数
"""
import math
def findOnly235():
max = 10000
maxL2 = int(math.log(max, 2))
maxL3 = int(math.log(max, 3))
maxL5 = int(math.log(max, 5))
print maxL2, maxL3, maxL5
L = []
for i in range(maxL2):
for j in range(maxL3):
for k in range(maxL5):
number = pow(2, i) * pow(3, j) * pow(5, k)
if number <= max and number > 1:
L.append(number)
return L
if __name__ == '__main__':
l = findOnly235()
l.sort()
print l
```
#2