枯燥的编程中总得有些乐趣,今天我们不谈论那些高深的技能,教你几个在编程中的奇技淫巧,说不定在某些时候还能炫耀一番呢。

1、找到最大值和最小值

不使用 if else switch 和三元运算符,在给定的三元组中找到最大值和最小值:比如给定 3,14,8,在不使用 if else switch 和三元运算符的情况下找到最大值和最小值。

话不多说,我们先看代码

public static int findMax(int a, int b, int c) {
int max = a;
boolean b1 = (max < b) && ((max = b) > 0);
b1 = (max < c) && ((max = c) > 0);
return max;
} public static int findMin(int a, int b, int c) {
int min = a;
boolean b1 = (min > b) && ((min = b) > 0);
b1 = (min > c) && ((min = c) > 0);
return min;
}

这里我们主要使用了&& 运算符的短路特性,短路特性是指当 && 前一个表达式为 true 的时候才会继续执行下一个表达式,当前一个表达式为 false 则不会执行下一个表达式。所以在这里只有当前一个表达式为 true 的时候,后面的赋值语句才会被执行到。

我们运行一下结果如下

上面的这种方式入参适合正数和负数,如果当我们的入参能确定为正数的时候,我们还可以使用下面的这种方式来实现

  public static int findPositiveMax(int a, int b, int c) {
int max = 0;
while (a > 0 || b > 0 || c > 0) {
a--;
b--;
c--;
max++;
}
return max;
} public static int findPositiveMin(int a, int b, int c) {
int min = 0;
while (a > 0 && b > 0 && c > 0) {
a--;
b--;
c--;
min++;
}
return min;
}

上面的这种写法相信大家都能看懂,阿粉就不过的解释了,同样的这里也利用了&& || 运算的短路特性,不过要注意这种形式只能在都是正数的情况下才可以。

2、不使用临时变量交换变量

swap(x, y) 操作大家都知道,就是交互 x 和 y 的值,比如 x = 3, y = 4; 在经过 swap 操作过后,x = 4,y = 3;我们这里的问题时如何在不使用临时变量的情况下,只有一行代码来实现这个方法。

首先大家肯定知道这里我们要使用异或运算^,没错,话不多说我们看代码

public static void swapByXor(int x, int y) {
System.out.println(x + ":" + y);
x = x ^ y ^ (y = x);
System.out.println(x + ":" + y);
}

运行过后,可以看到,xy 的值已经被交换了, 这里我们要知道两个知识点,那就是 n ^ n = 0; n ^ 0 = n,另外a ^ bb ^ a 是等价的。

当然除了上面的异或之外,我们还可以通过下面这种方法来实现

public static void swapByAddAndSub(int x, int y) {
System.out.println(x + ":" + y);
x = x + y - (y = x);
System.out.println(x + ":" + y);
} public static void swapByMulAndDiv(int x, int y) {
System.out.println(x + ":" + y);
x = (x * y) / (y = x);
System.out.println(x + ":" + y);
}

这两种方式都是同样的逻辑,先求和在减去其中一个值和先求积再除以一个值,就可以得到两个替换后的值。

3、两个数相乘

接下来我们再看一个,求两个数的积,但是不能用乘号*。在看代码之前,我们先分析一下,比如说我们要求积 3 * 5 可以将 3 * 5 看成 3 * 4 + 3,也就是 (3 * 3 + 3) + 3,看到这个可能有的小伙伴已经知道我们要怎么计算了,没错,那就是我们可以用递归。

public static int mulWithoutMul(int x, int y) {
if (y == 0)
return 0;
if (y > 0)
return (x + mulWithoutMul(x, y - 1));
return -mulWithoutMul(x, -y);
}

通过上面的递归,我们就可以实现两个数相乘但是没有使用乘号了。

4、不使用乘号计算乘以 15

如果我们要计算一个数乘以 15 的时候,我们可以通过下面这种方式来计算,(n << 4) - n, 因 n * 15 = n * 16 - n = (n << 4) - n;同样的如果我们某些时候要计算乘以 2 或者除以 2 的时候,我们也可以换成移位操作,n * 2 = n << 1;n / 2 = n >> 1,如果是 4 的话就可以左移 2 位或者右移 2 位,即 n * 4 = n << 2;n / 4 = n >> 2;一次类推。

使用移位的方式,在某些极端的场景可以提升性能。

程序员必读书单



更多优质内容欢迎关注公众号【Java 极客技术】,我准备了一份面试资料,回复【bbbb07】免费领取。希望能在这寒冷的日子里,帮助到大家。

教你几个 Java 编程中的奇技淫巧的更多相关文章

  1. Java编程中“为了性能”尽量要做到的一些地方

    最近的机器内存又爆满了,除了新增机器内存外,还应该好好review一下我们的代码,有很多代码编写过于随意化,这些不好的习惯或对程序语言的不了解是应该好好打压打压了. 下面是参考网络资源总结的一些在Ja ...

  2. 深入剖析Java编程中的中文问题及建议最优解决方法

    摘录自:http://fafeng.blogbus.com/logs/3062998.html http://www.blogbus.com/fafeng-logs/3063006.html 深入剖析 ...

  3. Java 编程中关于异常处理的 10 个最佳实践

    异常处理是Java 开发中的一个重要部分.它是关乎每个应用的一个非功能性需求,是为了处理任何错误状况,比如资源不可访问,非法输入,空输入等等.Java提供了几个异常处理特性,以try,catch 和 ...

  4. Java编程中获取键盘输入实现方法及注意事项

    Java编程中获取键盘输入实现方法及注意事项 1. 键盘输入一个数组 package com.wen201807.sort; import java.util.Scanner; public clas ...

  5. java编程中'为了性能'一些尽量做到的地方

    原文地址:http://blog.csdn.NET/m13666368773/article/details/7796924 最近的机器内存又爆满了,出了新增机器内存外,还应该好好review一下我们 ...

  6. 请问在JAVA编程中什么叫耦合?什么又叫解藕? 悬赏分:0 - 解决时间:2008-3-8 12:55

    模块一的实现依赖于模块二,更改模块二后,模块一也得更改,那么二者就有耦合.修改程序,使得更改模块二后,模块一不受影响,那么就叫解藕 请问<java编程思想>中的“完全解藕”如何理解,和实现 ...

  7. Java编程中的一些常见问题汇总

    转载自  http://macrochen.iteye.com/blog/1393502 每天在写Java程序,其实里面有一些细节大家可能没怎么注意,这不,有人总结了一个我们编程中常见的问题.虽然一般 ...

  8. JAVA编程中你一定要掌握的“快捷键”

    JAVA编程常用快捷键 相信很多编程小白刚开始的时候,看向大神的时候都是双膝跪地满眼泪水的膜拜之情~不因为别的,就是因为他们可以随随便便敲出很多行代码,而且他们没有动鼠标!这时候就有人问了:“怎么才能 ...

  9. JAVA编程中button按钮,actionlistener和mouseClicked区别

    在java的编程中,对于按钮button 有两个事件: 1.actionPerformed 2.mouseClicked 区别: actionPerformed:一般事件,仅侦听鼠标左键的单击事件,右 ...

  10. Java编程中“为了性能”需做的26件事

    1.尽量在合适的场合使用单例 使用单例可以减轻加载的负担,缩短加载的时间,提高加载的效率,但并不是所有地方都适用于单例,简单来说,单例主要适用于以下三个方面: (1)控制资源的使用,通过线程同步来控制 ...

随机推荐

  1. 常见Content-Type(MIME)列表

    Content-Type(MIME)用于标识发送或接收数据的类型,浏览器根据该参数来决定数据的打开方式.多用于指定一些客户端自定义的文件,以及一些媒体文件的打开方式. 文件扩展名 Content-Ty ...

  2. prometheus设置使用密码nginx反向代理访问

    注意: 1.设置访问密码的方式 2.ngixn反向代理的配置 # 安装 Apache工具包 apt install apache2-utils htpasswd -bc /etc/nginx/.pro ...

  3. Redash中文版安装问题大全

    Redash的安装比较复杂,由于系统环境组件版本不同,可能会出现这样那样的问题,我们把安装过程中常见问题记录如下: 1.git clone 经常提示:RPC失败,远端意外挂断.过早的文件结束符.ind ...

  4. SpringBoot课程学习(二)

    一.断言 (1).@assertTrue,@assertFalse assertTrue与assertFalse用来判断条件是否为true或false,assertTrue表示如果值为true则通过, ...

  5. 一个C#开发者学习SpringCloud搭建微服务的心路历程

    前言 Spring Cloud很火,很多文章都有介绍如何使用,但对于我这种初学者,我需要从创建项目开始学起,所以这些文章对于我的启蒙,帮助不大,所以只好自己写一篇文章,用于备忘. SpringClou ...

  6. 洛谷P2827 [NOIP2016 提高组] 蚯蚓 (二叉堆/队列)

    容易想到的是用二叉堆来解决,切断一条蚯蚓,其他的都要加上一个值,不妨用一个表示偏移量的delta. 1.取出最大的x,x+=delta: 2.算出切断后的两个新长度,都减去delta和q: 3.del ...

  7. 插入排序算法(Java代码实现)

    其它经典排序算法:https://blog.csdn.net/weixin_43304253/article/details/121209905 插入排序算法: 思路:将数据分为已经排序好的数据和未排 ...

  8. Java实现7种常见密码算法

    原创:扣钉日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处. 简介 前面在密码学入门一文中讲解了各种常见的密码学概念.算法与运用场景,但没有介绍过代码,因此,为作补充,这一篇将会介绍 ...

  9. 记一次 .NET 某娱乐聊天流平台 CPU 爆高分析

    一:背景 1.讲故事 前段时间有位朋友加微信,说他的程序直接 CPU=100%,每次只能手工介入重启,让我帮忙看下到底怎么回事,哈哈,这种CPU打满的事故,程序员压力会非常大, 我让朋友在 CPU 高 ...

  10. Codeforces Round #805 (Div. 3)E.Split Into Two Sets

    题目链接:https://codeforces.ml/contest/1702/problem/E 题目大意: 每张牌上面有两个数字,现在有n张牌(n为偶数),问能否将这n张牌分成两堆,使得每堆牌中的 ...