前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >一道在知乎很火的 Java 题——如何输出 ab

一道在知乎很火的 Java 题——如何输出 ab

作者头像
零式的天空
发布2022-03-28 20:14:43
2640
发布2022-03-28 20:14:43
举报
文章被收录于专栏:零域Blog

这是一个源自知乎的话题,原贴链接:一道百度的面试题,有大神会嘛?

虽然我不是大神,但我也点进去看了一下,思考了一会之后有了一些思路,然后去看其它人的答案的时候果然全都已经被各路大神们先想到并贴出来了,所以我就不去凑热闹写重复答案了,整理一下网友们的智慧在这里自娱自乐好了。

题目

思路一

作为一个多年前也见过不少笔试题的少年,看到这个题目的第一想法是脑筋急转弯——注入一段逻辑直接改变原 if 结构。

解法一

填入内容 true){System.out.print("a");}if(false

代码语言:javascript
复制
public void print() {
    if (true) {
        System.out.print("a");
    }

    if (false) {
        System.out.print("a");
    } else {
        System.out.print("b");
    }
}

类似地也可以填入 true){System.out.print("ab");return;}if(false 等。

当初大学时单纯的少年可是很难想出这样的套路的,时间改变了我们啊。

思路二

如果正经遵从题目的原代码结构,那就得想办法构造一段代码,既能输出 a,又能返回 false

解法二

我也想到能否使用 System.out.print 的返回值来做文章,但奈何并不记得它返回什么,首先让我们复习一下 PrintStreamprintprintlnprintf 方法的区别:

方法

功能

返回值

print

打印一个值或者对象

void

println

打印并换行

void

printf

格式化打印

PrintStream

所以适用的是 printf,它的返回值是 PrintStream 类型的 System.out,判它是否为空即可。

填入内容 System.out.printf("a") == null

代码语言:javascript
复制
public void print() {
    if (System.out.printf("a") == null) {
        System.out.print("a");
    } else {
        System.out.print("b");
    }
}

经测试填入 System.out.append("a") == null 也是可以达到效果的。

解法三

仍然是思路二,但从匿名内部类来作文章。

实现代码:

代码语言:javascript
复制
public void print() {
    if (new Object() {
        boolean print() {
            System.out.print("a");
            return false;
        }
    }.print()) {
        System.out.print("a");
    } else {
        System.out.print("b");
    }
}

这里利用的知识点是匿名内部类可以声明基类没有的新方法并且马上调用。

解法四

使用 Java 8 里的 lambda 来实现思路二。

代码语言:javascript
复制
public void print() {
    if (((BooleanSupplier)(() -> {System.out.print("a");return false;})).getAsBoolean()) {
        System.out.print("a");
    } else {
        System.out.print("b");
    }
}

严格来讲这个不一定能算作正确答案,因为要增加 import java.util.function.BooleanSupplier;

脑洞大开

讲完严肃的解法,来看看网友 穷小子 开脑洞的思路:

代码语言:javascript
复制
public void print() {
//    if ( ) {
        System.out.print("a");
//    } else {
        System.out.print("b");
//    }
}

如果没有特意说明只能在括号里加东西,倒真是个妙计!

参考

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-03-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 题目
  • 思路一
    • 解法一
    • 思路二
      • 解法二
        • 解法三
          • 解法四
          • 脑洞大开
          • 参考
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档