V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Cbdy
V2EX  ›  Java

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

  •  
  •   Cbdy · 2018-05-08 23:50:00 +08:00 · 7490 次点击
    这是一个创建于 2400 天前的主题,其中的信息可能已经有所发展或是发生改变。

    第一问

    写一个 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 条回复    2018-05-11 19:24:36 +08:00
    vjnjc
        1
    vjnjc  
       2018-05-09 00:10:42 +08:00 via Android   ❤️ 1
    Java 选手看不懂。。。这是 Java10 么?
    huhu3312
        2
    huhu3312  
       2018-05-09 00:12:34 +08:00
    看到 var 类型的类型推断,果断是 java10 没错了
    Citrus
        3
    Citrus  
       2018-05-09 01:01:28 +08:00 via iPhone
    没太懂,为啥是语法题?感觉这是数学题啊。。。
    Bryan0Z
        4
    Bryan0Z  
       2018-05-09 01:03:12 +08:00 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  
       2018-05-09 02:34:34 +08:00 via iPhone
    如果使用 Java 成员的话,不是很懂第一问和第二问在实现上有什么区别。。
    不使用类成员的话,用内部类实现闭包?
    88250
        6
    88250  
       2018-05-09 02:44:34 +08:00
    Bryan0Z
        7
    Bryan0Z  
       2018-05-09 03:22:43 +08:00 via Android
    @88250 中间插了个链接为啥不报错
    shiyidi
        8
    shiyidi  
       2018-05-09 05:44:05 +08:00
    shiyidi
        9
    shiyidi  
       2018-05-09 05:50:55 +08:00
    ayanamist
        10
    ayanamist  
       2018-05-09 07:22:51 +08:00 via Android
    这和语法有啥关系,明明是打着编程笔试题的智力小测验。在国内最大的 java workshop 表示要是有团队出这种题,你们还是别去了,去了估摸着也要去猜产品的心思。
    hsuan
        11
    hsuan  
       2018-05-09 07:25:51 +08:00 via Android
    第一问和第二问难道不是一样的吗
    lihongming
        12
    lihongming  
       2018-05-09 07:32:08 +08:00 via Android
    Java 已经过了炫技的时代了
    Cbdy
        13
    Cbdy  
    OP
       2018-05-09 07:39:26 +08:00
    @glacer @hsuan 第二问比第一问条件更强一点,第一问每个类的实例保持一个状态,第二问每次调用 apply 产生一次新的状态。能通过第一问测试的用例不一定能通过第二问。这两问都是为第三问做铺垫

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

    https://hacpai.com/member/88250
    alamaya
        34
    alamaya  
       2018-05-09 16:32:48 +08:00 via Android
    @scmod java 有闭包,不过是残疾的那种,要求变量是 final or effective final
    sonicthedgehog
        35
    sonicthedgehog  
       2018-05-09 16:46:43 +08:00
    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  
       2018-05-09 16:59:10 +08:00 via Android
    @sonicthedgehog 不过这不是惰性计算,难受
    Terry05
        37
    Terry05  
       2018-05-09 17:00:02 +08:00
    这年头要是找工作还让我做笔试,尤其是这种没事找事的题目,就给老子滚粗,爱招谁招谁去

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

    满足 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  
       2018-05-10 16:18:55 +08:00
    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  
       2018-05-10 19:56:05 +08:00
    @Cbdy 你答案也是用了内部匿名类,只不过变量 v 没有显式放到 Field 而已
    Cbdy
        45
    Cbdy  
    OP
       2018-05-11 10:47:03 +08:00 via Android
    @kiddult 对呀😄
    kiddult
        46
    kiddult  
       2018-05-11 19:24:36 +08:00
    @Cbdy 内部匿名类在实现的时候,是吧局部变量当构造器的参数传进去了,然后在里面维护了一套 Field,本质上只是少写了一些字
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3536 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 04:55 · PVG 12:55 · LAX 20:55 · JFK 23:55
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.