Cbdy
V2EX  ›  Java

今天出了一个 Java 笔试题(语法题),有兴趣的同学来做做😄

  •  
  •   Cbdy · May 8, 2018 · 8429 views
    This topic created in 2925 days ago, the information mentioned may be changed or developed.

    第一问

    写一个 Java 类,满足以下条件

    assert new F().apply(1).get() == 1;
    assert new F().apply(1).apply(2).get() == 5;
    assert new F().apply(1).apply(2).apply(3).get() == 14;
    

    第二问

    写一个 Java 类,满足以下条件

    var f = new F();
    assert f.apply(1).get() == 1;
    var c = f.apply(1);
    assert c.apply(2).get() == 5;
    assert c.apply(2).apply(3).get() == 14;
    

    第三问

    写一个 Java 类,不使用 Java 类的成员变量( Field ),满足第二问条件


    答案

    46 replies    2018-05-11 19:24:36 +08:00
    vjnjc
        1
    vjnjc  
       May 9, 2018 via Android   ❤️ 1
    Java 选手看不懂。。。这是 Java10 么?
    huhu3312
        2
    huhu3312  
       May 9, 2018
    看到 var 类型的类型推断,果断是 java10 没错了
    Citrus
        3
    Citrus  
       May 9, 2018 via iPhone
    没太懂,为啥是语法题?感觉这是数学题啊。。。
    Bryan0Z
        4
    Bryan0Z  
       May 9, 2018 via Android
    第一个简单

    private int value;

    public F(int i){
    this.value = i;
    }

    public F apply(int i){
    return new F(i^2+value)
    }

    手机码字,就不发全了
    glacer
        5
    glacer  
       May 9, 2018 via iPhone
    如果使用 Java 成员的话,不是很懂第一问和第二问在实现上有什么区别。。
    不使用类成员的话,用内部类实现闭包?
    88250
        6
    88250  
       May 9, 2018
    Bryan0Z
        7
    Bryan0Z  
       May 9, 2018 via Android
    @88250 中间插了个链接为啥不报错
    119
        8
    119  
       May 9, 2018
    119
        9
    119  
       May 9, 2018
    ayanamist
        10
    ayanamist  
       May 9, 2018 via Android
    这和语法有啥关系,明明是打着编程笔试题的智力小测验。在国内最大的 java workshop 表示要是有团队出这种题,你们还是别去了,去了估摸着也要去猜产品的心思。
    hsuan
        11
    hsuan  
       May 9, 2018 via Android
    第一问和第二问难道不是一样的吗
    lihongming
        12
    lihongming  
       May 9, 2018 via Android
    Java 已经过了炫技的时代了
    Cbdy
        13
    Cbdy  
    OP
       May 9, 2018
    @glacer @hsuan 第二问比第一问条件更强一点,第一问每个类的实例保持一个状态,第二问每次调用 apply 产生一次新的状态。能通过第一问测试的用例不一定能通过第二问。这两问都是为第三问做铺垫

    @ayanamist 考 Java 闭包的语法,怎么变智力小测验了呢?链式调用求平方和谁都能看出来吧
    cout2013mr
        14
    cout2013mr  
       May 9, 2018 via Android
    看来我是第一个不认识断言关键字的
    sagaxu
        15
    sagaxu  
       May 9, 2018 via Android
    考语法跟考打字速度效果差不多
    wenzhoou
        16
    wenzhoou  
       May 9, 2018 via Android   ❤️ 2
    完全通过测试 注:非完整代码
    if ( i= 1 ) return 1;
    if ( i= 2 ) return 5;
    if ( i= 3 ) return 14;
    好了。
    wenzhoou
        17
    wenzhoou  
       May 9, 2018 via Android
    别批判我。我是来搞个笑的。
    darklowly
        18
    darklowly  
       May 9, 2018
    其实一个闭包可以搞定全部
    另外算法是 平方和
    moximo
        19
    moximo  
       May 9, 2018
    class f{
    88250
        20
    88250  
       May 9, 2018
    @Bryan0Z label
    micean
        21
    micean  
       May 9, 2018
    第三题
    不用成员变量,我用 System.setProperty 可以吧
    dychenyi
        22
    dychenyi  
       May 9, 2018
    不懂 java。
    c++的 apply ()里面肯定要有 return *this;这种写法就符合 lz 语法了。
    zhazi
        23
    zhazi  
       May 9, 2018 via Android
    笔试题?
    DRcoding
        24
    DRcoding  
       May 9, 2018
    然而 java 10 的语法有何意义,就问贵司敢不敢在生产环境上 jdk10 吧,哈哈哈哈
    Tiakon
        25
    Tiakon  
       May 9, 2018
    怎么感觉更像 scala
    Cbdy
        26
    Cbdy  
    OP
       May 9, 2018
    @cout2013mr assert 是 Java1.4 加进来的特性
    @darklowly 对的,闭包。题目条件是递次增强的,做出第三问,前两问的用例也能通过
    @micean 很机智啊,也是一种方法😄
    @dychenyi 我也不是很懂 C++,不过 C++似乎没有词法闭包
    Cbdy
        27
    Cbdy  
    OP
       May 9, 2018
    @DRcoding 我只是测试用例用了 Java10 的语法,题目可以用任何版本 Java 语法做
    yuyueMJ
        28
    yuyueMJ  
       May 9, 2018 via iPhone
    js 题?
    yuchting
        29
    yuchting  
       May 9, 2018
    @wenzhoou 正解
    smdbh
        30
    smdbh  
       May 9, 2018
    py 里有 yield,java 里不知道
    scmod
        31
    scmod  
       May 9, 2018
    ```java
    public class F {

    public F apply(final int i) {
    return new F() {
    public int get() {
    return i * (i + 1) * (2 * i + 1) / 6;
    }
    };
    }

    public int get() {
    return 0;
    }

    }
    ```
    重载?闭包怎么写...java 不是没闭包么..
    holmesabc
        32
    holmesabc  
       May 9, 2018
    国考 智力题吧
    oswuhan
        33
    oswuhan  
       May 9, 2018
    6 楼是大佬,鉴定完毕。

    https://hacpai.com/member/88250
    alamaya
        34
    alamaya  
       May 9, 2018 via Android
    @scmod java 有闭包,不过是残疾的那种,要求变量是 final or effective final
    sonicthedgehog
        35
    sonicthedgehog  
       May 9, 2018
    class F {

    public F() { }

    public F apply(int i) {
    return new F() {
    @Override
    public int get() {
    return F.this.get() + i * i;
    }
    };
    }

    public int get() {
    return 0;
    }
    }
    已测试,通过
    sonicthedgehog
        36
    sonicthedgehog  
       May 9, 2018 via Android
    @sonicthedgehog 不过这不是惰性计算,难受
    Terry05
        37
    Terry05  
       May 9, 2018
    这年头要是找工作还让我做笔试,尤其是这种没事找事的题目,就给老子滚粗,爱招谁招谁去

    应届生也许很会做这种题,招应届生去吧
    wdlth
        38
    wdlth  
       May 9, 2018
    这一定是 clojure 的阴谋
    kiddult
        39
    kiddult  
       May 10, 2018
    @Cbdy 版本上实际上还是限定了只能用 invokedynamic 来实现;内部匿名类不能用,底层会引入 final Field
    Cbdy
        40
    Cbdy  
    OP
       May 10, 2018
    @kiddult 不需要 invokedynamic,我给出了参考答案,你可以在用早期 java 平台试试
    unlimitedsola
        41
    unlimitedsola  
       May 10, 2018
    爱招谁招谁去+1
    CRVV
        42
    CRVV  
       May 10, 2018
    真看不出来是求平方和

    满足 0 0 1->1, 0 1 2 -> 5, 1 2 3 -> 14 的还可以是
    5 * x1 + 3 * x2 + x3
    3 * x1 + x2 + x3 ** 2
    -7 * x1 - 3 * x2 + x3 ** 3

    看到这种题目,我的第一反应都是
    public_class_F_{
    ____private_int_v;
    ____public_F_apply(int_x)_{
    ________if_(x_==_1)_{
    ____________v_=_1;
    ________}
    ________if_(x_==_2)_{
    ____________v_=_5;
    ________}
    ________if_(x_==_3)_{
    ____________v_=_14;
    ________}
    ________return_this;
    ____}
    ____public_int_get()_{
    ________return_v;
    ____}
    }
    hubin0203
        43
    hubin0203  
       May 10, 2018
    public class F {

    int result;

    static int preResult;

    class InnerClass{

    int temp;

    public InnerClass(int temp) {
    this.temp = temp;
    }

    InnerClass apply(int a){
    result = a * a;
    return new InnerClass(result);
    }

    int get(){
    result += preResult;
    preResult = result;
    return result;
    }
    }

    InnerClass apply(int a){
    result = a * a;
    return new InnerClass(result);
    }
    }

    这些题是招几年 JAVA 的哦==
    kiddult
        44
    kiddult  
       May 10, 2018
    @Cbdy 你答案也是用了内部匿名类,只不过变量 v 没有显式放到 Field 而已
    Cbdy
        45
    Cbdy  
    OP
       May 11, 2018 via Android
    @kiddult 对呀😄
    kiddult
        46
    kiddult  
       May 11, 2018
    @Cbdy 内部匿名类在实现的时候,是吧局部变量当构造器的参数传进去了,然后在里面维护了一套 Field,本质上只是少写了一些字
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   5683 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 224ms · UTC 07:57 · PVG 15:57 · LAX 00:57 · JFK 03:57
    ♥ Do have faith in what you're doing.