• 请不要在回答技术问题时复制粘贴 AI 生成的内容
begeekmyfriend
V2EX  ›  程序员

刷了 100 道 LeetCode,我也出两题回馈大家,难度适中,绝对不水

  •  
  •   begeekmyfriend ·
    begeekmyfriend · Nov 11, 2017 · 6035 views
    This topic created in 3278 days ago, the information mentioned may be changed or developed.
    1、用递归求 Fibonacci,要求速度不低于迭代;
    2、排序的整型数组,有重复,求某个元素出现次数。​​​​
    31 replies  •  2017-11-13 19:20:16 +08:00
    chuaInQZ
    chuaInQZ
    Nov 11, 2017 via Android
    1
    1 尾递归
    2 二分查找+前后遍历
    geelaw
    geelaw
    Nov 11, 2017 via iPhone
    2
    ???这个真的连水都算不上

    第一个用快速幂的递归写法即可满足要求,而且比迭代要快(如果四则运算是常数)
    第二个用 upper_bound 和 lower_bound 的算法即可
    LxExExl
    LxExExl
    Nov 11, 2017 via iPhone
    3
    2 二分查找 变换下等号就行了
    geelaw
    geelaw
    Nov 11, 2017 via iPhone
    4
    哦第一个还可以更简单,只要形参和返回值都是 pair 即可
    begeekmyfriend
    begeekmyfriend
    OP
    Nov 11, 2017
    5
    @LxExExl 绝知此事要躬行
    LxExExl
    LxExExl
    Nov 11, 2017 via iPhone
    6
    @begeekmyfriend 愿闻其详
    begeekmyfriend
    begeekmyfriend
    OP
    Nov 11, 2017
    8
    @geelaw 不懂你的“快速幂”是啥意思,方便贴一下么?还是利用某种语言的黑科技?
    qiukun
    qiukun
    Nov 11, 2017❤️1
    9
    @begeekmyfriend fibonacci 是线性关系可以用矩阵表示,矩阵乘法可以用类似普通幂乘的优化
    qwlhappy
    qwlhappy
    Nov 11, 2017
    10
    这不是...C 语言课后习题的水平?虽说想做到最优可能都要仔细考虑下
    begeekmyfriend
    begeekmyfriend
    OP
    Nov 11, 2017
    11
    @qwlhappy 到不一定要最优。第一题考 memorized+递归;第二题就是考二分编程,传说中 90%的人都会写错的那种

    出面试题的原则——淘汰水货,中等水平做得出来,还能让高手闪光。
    begeekmyfriend
    begeekmyfriend
    OP
    Nov 11, 2017
    12
    说第二题很水的我有理由怀疑对方二分编程有没有真正掌握,一写都是 O(N)
    neosfung
    neosfung
    Nov 11, 2017
    13
    def foo(n, a=0, b=1):
    return foo(n-1, b, a+b) if n>0 else a+b
    neosfung
    neosfung
    Nov 11, 2017
    14
    第二题直接用二分命中一个后,线性搜索前后的数字就行了,最坏情况 O(n)
    begeekmyfriend
    begeekmyfriend
    OP
    Nov 11, 2017 via Android
    15
    @neosfung 线性就淘汰,哈哈
    neosfung
    neosfung
    Nov 11, 2017
    16
    neosfung
    neosfung
    Nov 11, 2017
    17
    @qiukun 貌似是编程之美中的方法?
    sagaxu
    sagaxu
    Nov 11, 2017 via Android
    18
    太水了,第一题递归加 cache,第二题两次二分法确定这个数的首尾位置再相减得到个数
    LxExExl
    LxExExl
    Nov 11, 2017 via iPhone
    19
    @begeekmyfriend 我去年找工作 lc 算下来刷了起码两遍 重点题三遍 基本到最后每个题都是 10 分钟一次性 ac...
    xiang578
    xiang578
    Nov 11, 2017
    20
    @neosfung #17 应该出现过,利用矩阵快速幂还可以处理比如求 Fibonacci 第 1 亿项对 1e9+7 取模的结果
    helica
    helica
    Nov 11, 2017 via iPhone
    21
    感觉有点低估 v 站的 coding 水平了:D
    zjbztianya
    zjbztianya
    Nov 11, 2017
    22
    @xiang578 1e9+7 暴露了你是 ACMer...
    xiang578
    xiang578
    Nov 11, 2017
    23
    @zjbztianya #22 你这是和我同归于尽……
    mskf
    mskf
    Nov 11, 2017❤️1
    24
    //第一题:

    public class Fibonacci {

    /**
    * /a b/
    * /c d/
    */
    private static class Matrix{
    int a;
    int b;
    int c;
    int d;

    public Matrix(int a, int b, int c, int d) {
    this.a = a;
    this.b = b;
    this.c = c;
    this.d = d;
    }
    }

    public static void main(String[] args) {
    Arrays.asList(1,2,3,4,5,6,7,8,9,10).stream().forEach(n->System.out.println(fibonacci(n)));
    }


    public static int fibonacci(int n){
    if(n==1)
    return 0;
    return Fib(n-1).b;
    }

    public static Matrix Fib(int n){
    if(n==1)
    return new Matrix(1,1,1,0);
    return (n&1)==0?multi(Fib(n/2),Fib(n/2)):multi(Fib(n/2),Fib(n/2 + 1));
    }

    private static Matrix multi(Matrix m1,Matrix m2){
    return new Matrix(
    m1.a*m2.a+m1.b*m2.c,
    m1.a*m2.b+m1.b*m2.d,
    m1.c*m2.a+m1.d*m2.c,
    m1.c*m2.b+m1.d*m2.d
    );
    }
    }
    baka
    baka
    Nov 12, 2017❤️2
    25
    斐波那契校招面试一般这么问
    1. 斐波那契知道吧,递推式写一下,顺便最简单的递归来写一个
    2. O(n)行不行,迭代来写一个
    3. 能不能再快点,矩阵快速幂推导一下,快速幂写一个
    4. O(1)办得到吗?特征根求一下,通项解出来。特征根原理?
    jedihy
    jedihy
    Nov 12, 2017
    26
    1. fib 用 DP 就行,递归都不用。
    2. 两次二分即可,两次二分只有等号情况处理不同。
    skadi
    skadi
    Nov 12, 2017
    27
    namespace dd {
    using ll = long long;
    template <ll n> struct Fib {
    enum { value = Fib<n - 1>::value + Fib<n - 2>::value };
    };
    template <> struct Fib<0> {
    enum { value = 0 };
    };
    template <> struct Fib<1> {
    enum { value = 1 };
    };
    }

    int main(){
    std::cout<<dd::Fib<10>::value<<std::endl;
    }

    斐波那契用模版元编译期计算算不算作弊? :huaji:
    PS:虽然文不对题
    PPS:炸出了很多 acmer 啊
    skadi
    skadi
    Nov 12, 2017
    28
    第一题,快速幂
    第二题 2 个二分
    midasplus
    midasplus
    Nov 12, 2017
    29
    @xiang578 1E9+7 还行
    longaiwp
    longaiwp
    Nov 13, 2017
    30
    @xiang578 取模其实还有更好玩的东西,那就是你算的量还可以减少,取模我记得是有一个循环节的
    xiang578
    xiang578
    Nov 13, 2017
    31
    @longaiwp #30 对,取模之后这个序列是有循环节的,之前做一个学校的校赛遇到过
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   4362 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 52ms · UTC 01:09 · PVG 09:09 · LAX 17:09 · JFK 20:09
    ♥ Do have faith in what you're doing.