刷了 100 道 LeetCode,我也出两题回馈大家,难度适中,绝对不水 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
请不要在回答技术问题时复制粘贴 AI 生成的内容
begeekmyfriend

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

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

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

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

    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
        25
    baka  
       Nov 12, 2017   2
    斐波那契校招面试一般这么问
    1. 斐波那契知道吧,递推式写一下,顺便最简单的递归来写一个
    2. O(n)行不行,迭代来写一个
    3. 能不能再快点,矩阵快速幂推导一下,快速幂写一个
    4. O(1)办得到吗?特征根求一下,通项解出来。特征根原理?
    jedihy
        26
    jedihy  
       Nov 12, 2017
    1. fib 用 DP 就行,递归都不用。
    2. 两次二分即可,两次二分只有等号情况处理不同。
    skadi
        27
    skadi  
       Nov 12, 2017
    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
        28
    skadi  
       Nov 12, 2017
    第一题,快速幂
    第二题 2 个二分
    midasplus
        29
    midasplus  
       Nov 12, 2017
    @xiang578 1E9+7 还行
    longaiwp
        30
    longaiwp  
       Nov 13, 2017
    @xiang578 取模其实还有更好玩的东西,那就是你算的量还可以减少,取模我记得是有一个循环节的
    xiang578
        31
    xiang578  
       Nov 13, 2017
    @longaiwp #30 对,取模之后这个序列是有循环节的,之前做一个学校的校赛遇到过
    About     Help     Advertise     Blog     API     FAQ     Solana     4429 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 82ms UTC 10:14 PVG 18:14 LAX 03:14 JFK 06:14
    Do have faith in what you're doing
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86