一道在知乎很火的 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, ...
 
随机推荐
- python连接mysql之pymysql模块
			
以下demo均以python2中的mysqldb模块 一.插入数据 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 import MySQLdb conn = MyS ...
 - 简述一个javascript简单继承工具的实现原理
			
背景 由于本人非常希望能够开发自己的游戏,所以业余时间一直在想着能不能自己一些好玩又有趣的东西出来,最近随着steam上众多独立游戏的爆发,感觉自己又燃烧了起来,所以又拾起了很久以前的一个2d引擎,决 ...
 - 关于html5
			
html5 是用来 将 js 和 css 结合起来 从而实现 各种功能 javascript 用来定义 html5 页面的逻辑 css 来定义 html5 中的显示样式
 - Python 更改cmd中的字色
			
没有gui的python程序是在cmd窗口中运行的,黑色背景,灰色的字,确实很复古,不符合现代人的使用习惯-同事在用我写的小工具时,清一色的字色,看起来会没有重点性,因此我就想通过更改cmd中的字色来 ...
 - mysql oracle 删除外键约束
			
mysql alter table xxx drop foreign key xxx cascade; oracle alter table drop constraint xxxxx cascade ...
 - CMD模块定义规范
			
CMD 模块定义规范 在 Sea.js 中,所有 JavaScript 模块都遵循 CMD(Common Module Definition) 模块定义规范.该规范明确了模块的基本书写格式和基本交互规 ...
 - Java Socket Example
			
1.服务端:server package com.socket; import java.io.BufferedReader; import java.io.IOException; import j ...
 - High performance web site
			
http://www.cnblogs.com/Blog-Yang/archive/2013/08/16/3261284.html http://www.kuqin.com/webpagedesign/ ...
 - TinyMCE下载及使用
			
1.TinyMCE下载 官方下载网址:http://www.tinymce.com/ 简体中文语言包下载:http://www.tinymce.com/i18n/index.php?ctrl=lang ...
 - 【转】通知 Toast详细用法(显示view)
			
原文网址:http://www.pocketdigi.com/20100904/87.html 今天学习Android通知 Toast的用法,Toast在手机屏幕上向用户显示一条信息,一段时间后信息会 ...