今天一个朋友要去一个机构面试小学老师,发来的资料中的一道题,题目是:
有一些自然数,从它的第三个数字开始,每一个数字都是前两个数字之和,如101, 235, 2022,...
,求该类数字的最大值。
分析之后结果是 10112358。
我想的两种基本思路都是通过遍历求解:
- 使用
digits()
函数得到数字的每一位,然后进行计算。 - 使用
string()
函数得到数字字符串,利用parse()
函数从Char
恢复到整型计算后进行判断。
主要代码:
julia> function test_use_digits()
max_num = 0
for num in 100:99_999_999
digit = digits(num)
len = length(digit)
for i in len:-1:3
if digit[i-2] != digit[i-1] + digit[i]
break
else
i==3 && num > max_num ? max_num = num : nothing
end
end
end
println(max_num)
end
test_use_digits (generic function with 1 method)
julia> function test_use_string()
max_num = 0
for num in 100:99_999_999
str = string(num)
len = length(str)
for i in 3:len
if parse(Int,str[i]) != parse(Int,str[i-1]) + parse(Int,str[i-2])
break
else
i == len && num > max_num ? max_num = num : nothing
end
end
end
println(max_num)
end
test_use_string (generic function with 1 method)
用BenchMarkTools
进行分析后结果如下:
julia> using BenchmarkTools
julia> @btime test_use_digits()
10112358
10112358
10112358
10112358
16.322 s (100002154 allocations: 13.40 GiB)
julia> @btime test_use_string()
10112358
10112358
10112358
10112358
7.503 s (199999809 allocations: 8.94 GiB)
两者时间和内存上都相差将近一倍,以前都是闷头写,没怎么做过测试,有没有老铁们给分析下原因,或者有什么更高效的实现思路也可以讲讲