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

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

题目

思路一

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

解法一

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

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 的返回值来做文章,但奈何并不记得它返回什么,首先让我们复习一下 PrintStream 的 printprintln和 printf 方法的区别:

方法 功能 返回值
print 打印一个值或者对象 void
println 打印并换行 void
printf 格式化打印 PrintStream

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

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

public void print() {
if (System.out.printf("a") == null) {
System.out.print("a");
} else {
System.out.print("b");
}
}

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

解法三

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

实现代码:

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 来实现思路二。

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;

脑洞大开

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

public void print() {
// if ( ) {
System.out.print("a");
// } else {
System.out.print("b");
// }
}

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

同样看得我一愣一愣的还有 caiwei 同学的答案,他和朋友们发现题目里少写了个大括号(真的),于是我们看到他的朋友老方的解决方案:

真是防不胜防啊~不过我喜欢!

一道在知乎很火的 Java 题——如何输出 ab【转】的更多相关文章

  1. 很火的Java题——判断一个整数是否是奇数

    完成以下代码,判断一个整数是否是奇数: public boolean isOdd(int i) 看过<编程珠玑>的人都知道这道题的答案和其中极为简单的道理. 最普遍的风格,如下: 这个函数 ...

  2. 每天一道Java题[3]

    问题 为什么在重写equals()方法的同时,必须重写hashCode()方法? 解答 在<每天一道Java题[2]>中,已经对hashCode()能否判断两个对象是否相等做出了解释.eq ...

  3. 每天一道Java题[11]

    题目 synchronized怎么实现线程同步?请修改<每天一道Java题[10]>中的MyRunnableThread类以解决三个线程都获取到10的问题. 解答 方法一: 采用synch ...

  4. 一道很经典的 BFS 题

    一道很经典的 BFS 题 想认真的写篇题解. 题目来自:https://www.luogu.org/problemnew/show/P1126 题目描述 机器人移动学会(RMI)现在正尝试用机器人搬运 ...

  5. Java知多少(5) Java开发环境的搭建

    要进行Java开发,首先要安装JDK(Java Development Kit,Java开发工具箱). JDK 是一系列工具的集合,这些工具是编译Java源码.运行Java程序所必需的,例如JVM.基 ...

  6. Java知多少(50)Java throws子句

    如果一个方法可以导致一个异常但不处理它,它必须指定这种行为以使方法的调用者可以保护它们自己而不发生异常.做到这点你可以在方法声明中包含一个throws子句.一个 throws 子句列举了一个方法可能抛 ...

  7. Java知多少(78)Java向量(Vector)及其应用

    Vector(向量)是 java.util 包中的一个类,该类实现了类似动态数组的功能. 向量和数组相似,都可以保存一组数据(数据列表).但是数组的大小是固定的,一旦指定,就不能改变,而向量却提供了一 ...

  8. 安利一个很火的 Github 滤镜项目

    安利一个很火的 Github 滤镜项目 园长 1 个月前 简评:通过深度学习,一秒钟让你的照片高大上,这是康奈尔大学和 Adobe 的工程师合作的一个新项目,通过卷积神经网络把图片进行风格迁移.项目已 ...

  9. wpf 模拟抖音很火的罗盘时钟,附源码,下载就能跑

    wpf 模拟抖音很火的罗盘时钟,附源码 前端时间突然发现,抖音火了个壁纸,就是黑底蕾丝~~~  错错错,黑底白字的罗盘时钟! 作为程序员的我,也觉得很新颖,所以想空了研究下,这不,空下来了就用wpf, ...

随机推荐

  1. virtualbox 安装 android 经验总结

    装了好多个版本,最终总结一下遇到的问题, 1.直接下载的镜像文件没有找到如何设置分辨率的方法,因此放弃使用 2.在安装过程中,首先创建虚拟机,在virtualbox中创建硬盘的时候一定要选HDD格式, ...

  2. python【第二篇】列表、元组、字典及文件操作

    本节内容 列表 元组操作 字符串操作 字典操作 集合操作 文件操作 字符编码与转码 1.列表 列表是我们最以后最常用的数据类型之一,通过列表可以对数据实现最方便的存储.修改等操作:列表有序.可变.元素 ...

  3. Web NFC API

    W3C Editor's Draft 29 December 2014 This version: http://www.w3.org/2012/nfc/web-api/ Latest publish ...

  4. BAT互联网公司是如何内部推荐的?

    中国十大互联网公司 注:以上按照目前市值排序整理出来,当然还有更多未上市的潜力股.如:美团.豆瓣.豌豆荚.美图秀秀等等 各大互联网公司招聘官网 阿里招聘:https://job.alibaba.com ...

  5. SQL Server 中的嵌套事务与@@TranCount(转)

    在处理事务的时候,一般都用RollBack Transaction来回滚,但是如果在嵌套事务中这样使用的话,就会出现错误. 在SqlServer里,嵌套事务的层次是由@@TranCount全局变量反映 ...

  6. 设计模式 Mixin (混入类)

    混入(mix-in)类代表类之间的另一种关系.在C++中,混入类的语法类似于多重继承,但是语义完全不同.混入类回答"这个类还可以做什么"这个问题,答案经常以"-able& ...

  7. 日志式文件系统:SGI的xfs, Reiserfs, IBM的jfs, ext3fs

    日志文件(Log files)是包含系统消息的文件,包括内核.服务.在系统上运行的应用程序等.不同的日志文件记载不同的信息.日志文件系统比传统的文件系统安全,因为它用独立的日志文件跟踪磁盘内容的变化. ...

  8. Linux kernel ‘fib6_add_rt2node’函数安全漏洞

    漏洞名称: Linux kernel ‘fib6_add_rt2node’函数安全漏洞 CNNVD编号: CNNVD-201307-265 发布时间: 2013-07-16 更新时间: 2013-07 ...

  9. Introduction to Glide, Image Loader Library for Android, recommended by Google

    In the passed Google Developer Summit Thailand, Google introduced us an Image Loader Library for And ...

  10. 【索引】用PS3手柄在安卓设备上玩游戏系列

    谈安卓游戏对手柄的支持:http://www.cnblogs.com/duxiuxing/p/3729802.html 连接手柄和设备:http://www.cnblogs.com/duxiuxing ...