Rosalind刷题

原题链接

Rabbits and Recurrence Relations

斐波那契数列 n=31,k=5时,兔子个数(n第几个月,k每对兔子可以生多少对兔子)

fib(n::Int, k::Int) = n < 3 ? 1 : k * fib(n-2,k)+fib(n-1,k)

fib(31,5)

每次用2个函数相加递归开销太大了,还是建议用循环

1 个赞

谢谢。是的 当n很大时,就会报错。我也刚入门Julia

欢迎分享针对特定问题的Julia实现。如果可能的话,可以考虑把你想分享的内容整合在同一个帖子下面,方便大家浏览。

1 个赞

另外一个类似的项目是 LeetCode.jl

https://github.com/JuliaCN/LeetCode.jl 和配套的问题/答案链接 Home · LeetCode

1 个赞

[Rosalind刷题-DNA反向互补序列

原题:Complementing a Strand of DNA

数据:Julia_for_Rosalind/rosalind_revc.txt at main · sajesi/Julia_for_Rosalind · GitHub

#Given: A DNA string s of length at most 1000 bp.
#Return: The reverse complement sc of s.

using Chain

function revc(DNAseq::AbstractString)
    @chain DNAseq begin
        collect
        replace('A' => 'T','C' => 'G','T' => 'A','G' => 'C')
        join
        reverse    
    end
end

seq = readchomp("data/rosalind_revc.txt")

revc(seq)

DNA中点突变个数

原题:Counting Point Mutations

data: Julia_for_Rosalind/rosalind_hamm.txt at main · filozofo/Julia_for_Rosalind · GitHub

s1,s2 = readlines("data/rosalind_hamm.txt")

map(x-> collect(s1)[x] != collect(s2)[x],1:length(s1)) |> count

从算法角度,斐波那契数列应该用动态规划,O(N) 时间,O(1) 内存。参看 LeetCode.jl-509

# Indigo
function fib(n::Int)::Int
    n <= 1 && return n
    pre, cur = 0, 1
    for _ in 2:n
        pre, cur = cur, pre + cur
    end
    return cur
end

非常欢迎分享和交流题解 :laughing:
推荐试试上边提到的 LeetCode.jl,能学到不少技巧,再回头刷 Rosalind 的题说不定事半功倍~
目前仓库题解500+,有很多补充空间(还能蹭个贡献者 :smiley:


这题 mapcollect 似乎多余了?比如直接写

hd(s1::String, s2::String) = count(i->s1[i]!=s2[i], eachindex(s1))
1 个赞

贴一道很有意思的题目,这种解法似乎只有 Julia 能这么干 :rofl:


原题链接:LeetCode-917-仅仅翻转字母
简述:将英文字母反转,非英文字母保留在原有位置。
示例: "Test1ng-Leet=code-Q!" => "Qedo1ct-eeLg=ntse-T!"

Julia 代码

function reverse_only_letters(s::String)
    chars = collect(s)
    reverse!(@view(chars[isletter.(chars)]))
    return join(chars)
end

函数第二行将英文字母原地反转,简洁无废话。。。

1 个赞

备案号:京ICP备17009874号-2