一道在知乎很火的 Java 题——如何输出 ab【转】
这是一个源自知乎的话题,原贴链接:一道百度的面试题,有大神会嘛?
虽然我不是大神,但我也点进去看了一下,思考了一会之后有了一些思路,然后去看其它人的答案的时候果然全都已经被各路大神们先想到并贴出来了,所以我就不去凑热闹写重复答案了,整理一下网友们的智慧在这里自娱自乐好了。
题目

思路一
作为一个多年前也见过不少笔试题的少年,看到这个题目的第一想法是脑筋急转弯——注入一段逻辑直接改变原 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 的 print、println和 printf 方法的区别:
| 方法 | 功能 | 返回值 |
|---|---|---|
| 打印一个值或者对象 | 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【转】的更多相关文章
- 很火的Java题——判断一个整数是否是奇数
完成以下代码,判断一个整数是否是奇数: public boolean isOdd(int i) 看过<编程珠玑>的人都知道这道题的答案和其中极为简单的道理. 最普遍的风格,如下: 这个函数 ...
- 每天一道Java题[3]
问题 为什么在重写equals()方法的同时,必须重写hashCode()方法? 解答 在<每天一道Java题[2]>中,已经对hashCode()能否判断两个对象是否相等做出了解释.eq ...
- 每天一道Java题[11]
题目 synchronized怎么实现线程同步?请修改<每天一道Java题[10]>中的MyRunnableThread类以解决三个线程都获取到10的问题. 解答 方法一: 采用synch ...
- 一道很经典的 BFS 题
一道很经典的 BFS 题 想认真的写篇题解. 题目来自:https://www.luogu.org/problemnew/show/P1126 题目描述 机器人移动学会(RMI)现在正尝试用机器人搬运 ...
- Java知多少(5) Java开发环境的搭建
要进行Java开发,首先要安装JDK(Java Development Kit,Java开发工具箱). JDK 是一系列工具的集合,这些工具是编译Java源码.运行Java程序所必需的,例如JVM.基 ...
- Java知多少(50)Java throws子句
如果一个方法可以导致一个异常但不处理它,它必须指定这种行为以使方法的调用者可以保护它们自己而不发生异常.做到这点你可以在方法声明中包含一个throws子句.一个 throws 子句列举了一个方法可能抛 ...
- Java知多少(78)Java向量(Vector)及其应用
Vector(向量)是 java.util 包中的一个类,该类实现了类似动态数组的功能. 向量和数组相似,都可以保存一组数据(数据列表).但是数组的大小是固定的,一旦指定,就不能改变,而向量却提供了一 ...
- 安利一个很火的 Github 滤镜项目
安利一个很火的 Github 滤镜项目 园长 1 个月前 简评:通过深度学习,一秒钟让你的照片高大上,这是康奈尔大学和 Adobe 的工程师合作的一个新项目,通过卷积神经网络把图片进行风格迁移.项目已 ...
- wpf 模拟抖音很火的罗盘时钟,附源码,下载就能跑
wpf 模拟抖音很火的罗盘时钟,附源码 前端时间突然发现,抖音火了个壁纸,就是黑底蕾丝~~~ 错错错,黑底白字的罗盘时钟! 作为程序员的我,也觉得很新颖,所以想空了研究下,这不,空下来了就用wpf, ...
随机推荐
- [Android1.5]TextView跑马灯效果
from: http://www.cnblogs.com/over140/archive/2010/08/20/1804770.html 前言 这个效果在两周前搜索过,网上倒是有转载,可恨的是转载之后 ...
- launchpad bzr
在lp注册 一个 lp ID, 比如 alangwansui 然后添加 SSH keys.为自己的管理添加权限. 注册一个项目的 比如 melody. 然后就可以开始使用bzr 在这个项目下建 ...
- C#操作xml的3种方式
C#操作Xml有很多种方式,这里写出个人常使用的三种方式 XmlDocument DataSet linq to xml 首先声明本次操作使用的xml文件:books.xml:内容如下 <?x ...
- Yosemite重置Dock的命令
备忘 defaults write com.apple.dock ResetLaunchPad -bool true killall Dock
- WPF开发技术介绍
本月做了一个小讲座,主要是WPF的开发技术介绍,由于是上班时间,去听的人不多,但对于自己来说至少是又巩固了Winform的知识,抽时间写一篇文章,在此分享给大家,有什么宝贵建议大家也可以提给我,谢谢. ...
- BZOJ 2572 高速公路
Description Y901高速公路是一条重要的交通纽带,政府部门建设初期的投入以及使用期间的养护费用都不低,因此政府在这条高速公路上设立了许多收费站.Y901高速公路是一条由N-1段路以及N个收 ...
- The Child and Toy
Codeforces Round #250 (Div. 2) C:http://codeforces.com/problemset/problem/437/C 题意:给以一个无向图,每个点都有一点的权 ...
- The Child and Sequence
Codeforces Round #250 (Div. 1)D:http://codeforces.com/problemset/problem/438/D 题意:给你一个序列,然后有3种操作 1x ...
- cf D. On Sum of Fractions
http://codeforces.com/problemset/problem/397/D 题意:v(n) 表示小于等于n的最大素数,u(n)表示比n的大的第一个素数,然后求出: 思路:把分数拆分成 ...
- 【HDOJ】3325 Arithmetically Challenged
简单DFS. /* 3325 */ #include <iostream> #include <set> #include <cstdio> #include &l ...