首页 > 解决方案 > 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);

标签: javanumbersswap

解决方案


我不确定以下代码是否可以被接受为满足“步骤”数量的要求,因为它包含 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]

推荐阅读