java - java代码仅使用6个步骤即可找到5个(而不是数组)中的最大和最小数字,每个步骤都需要在2个数字之间交换
问题描述
我想使用 2 个数字格式之间的交换来找到用户给出的 5 个数字中的最大和最小数字。我只想使用 6 个步骤,但我每次都达到了更多。关于如何修复我的代码的任何建议?
Scanner myScanner = new Scanner(System.in);
int a = myScanner.nextInt();
int b = myScanner.nextInt();
int c = myScanner.nextInt();
int d = myScanner.nextInt();
int e = myScanner.nextInt();
int tmp;
if (a > b) {
tmp = b;
b = a;
a = tmp;
}
if (c > d) {
tmp = c;
c = d;
d = tmp;
}
if (a > c) {
tmp = a;
a = c;
c = tmp;
}
if (b > d) {
tmp = b;
b = d;
d = tmp;
}
if (d > e) {
tmp = d;
d = e;
e = tmp;
}
if (c > e) {
tmp = c;
c = e;
e = tmp;
}
if (b > e) {
tmp = b;
b = e;
e = tmp;
}
System.out.println(a);
System.out.print(e);
解决方案
我不确定以下代码是否可以被接受为满足“步骤”数量的要求,因为它包含 7 次交换操作,但实际上只会发生 3 或 4 次交换。此外,交换是在没有基于 XOR 的单行的临时变量的情况下实现的:
Random random = new Random();
// generate random values instead of user input
int a = random.nextInt(1000);
int b = random.nextInt(1000);
int c = random.nextInt(1000);
int d = random.nextInt(1000);
int e = random.nextInt(1000);
System.out.println(Arrays.asList(a, b, c, d, e));
if (e < a) {
a = (e ^= a ^= e) ^ a;
}
if (b < a) {
a = (b ^= a ^= b) ^ a;
} else if (b > e) {
b = (e ^= b ^= e) ^ b;
}
if (c < a) {
a = (c ^= a ^= c) ^ a;
} else if (c > e) {
c = (e ^= c ^= e) ^ c;
}
if (d < a) {
a = (d ^= a ^= d) ^ a;
} else if (d > e) {
d = (e ^= d ^= e) ^ d;
}
System.out.println("min = " + a);
System.out.println("max = " + e);
System.out.println(Arrays.asList(a, b, c, d, e));
示例输出
[629, 941, 339, 496, 366]
min = 339
max = 941
[339, 629, 366, 496, 941]
推荐阅读
- angular - 无法从 Angular HTTP 拦截器获取请求标头值
- c# - 返回作为从树的根到一般树中的叶子的最长路径的一部分的项目列表
- python - 为什么 tflite 模型的准确性与 keras 模型如此不同?
- c++ - 函数参数和函数体的本地可见 typedef
- reactjs - 如何使用 AG 网格在反应中显示用户数组的数据
- python - 当 x 在 python 中介于 1 和 100 之间时,绘制 y=logx
- html - 在 Bootstrap 中设置位置而不影响响应能力
- cuda - 如何使用共享内存和全局内存,是否可以使用共享作为计算的中间阶段
- apache-flink - 如何使用 Apache Flink CEP SQL 从已经匹配的模式中获取事件?
- mybatis - 如何不使用${}从mybatis获取动态表来执行sql?