add more approaches
add doc
easier to understand
save space
more neat