【问题标题】:Boolean method to determine consecutive numbers确定连续数字的布尔方法
【发布时间】:2016-10-14 07:26:22
【问题描述】:

编写一个名为 Continuous 的方法,它接受三个整数作为参数,如果它们是三个连续的数字,则返回 true;也就是说,如果可以将数字排列成一个顺序,使得存在某个整数 k,使得参数的值是 k、k+1 和 k+2。如果整数不连续,您的方法应该返回 false。请注意,顺序并不重要;对于以任何顺序传递的相同三个整数,您的方法应该返回相同的结果。 例如,连续调用(1, 2, 3)、连续调用(3, 2, 4) 和连续调用(-10, -8, -9) 将返回 true。连续调用(3, 5, 7)、连续调用(1, 2, 2) 和连续调用(7, 7, 9) 将返回 false。

这就是我目前所拥有的,并且不断收到无限循环错误并跳过测试

public boolean consecutive(int x, int y, int z) {
Scanner kb = new Scanner(System.in);
x = kb.nextInt();
y = kb.nextInt();
z = kb.nextInt();
if (((x < y && x < z) && (y < z && ((y - x) == 1) && ((z - x) == 2))) 
   ||((z < y && ((z - x) == 1) && ((y - x) == 2)))) 
{
    return true;
} else if (((y < x && y < z)&& (x < z && ((x - y) == 1) && ((z - y) == 2))) 
   || ((z < x && ((z - y) == 1) && ((x - y) == 2))))
{
        return true;
} else if (((z < x && z < y)&& (y < x && ((y - z) == 1) && ((x - z) == 2))) 
   ||((x < y && ((x - z) == 1) && ((y - z) == 2))))
{
    return true;
} else {
    return false;
}

【问题讨论】:

  • 啊啊啊我的眼睛 :( :-/
  • 无限循环?没有循环或递归调用......我不会评论那个算法
  • 好吧,让我们谈谈那个代码......为什么你在参数中收到x,y,z,值是什么?你永远不会关闭扫描仪,这很糟糕。对于逻辑,您应该尝试一些数学而不是 PURE 条件,或者简单地找到越来越小的数字......
  • 没有比 完全 不必要的 if ... then return else 构造更多的红色破布了 :-) 抛弃 else 行,因为如果 @ 987654325@部分或进行,它们没有效果。

标签: java boolean


【解决方案1】:

你所拥有的东西严重对于那些没有在 C 语言中度过大部分职业生涯的人来说太过分了,而且几乎看不懂 :-)

您应该始终首先争取可读性(以及因此的可维护性),只有在绝对必要时才恢复到可读性较差的代码。即使你确实恢复了,你也应该记录下你为什么和你做了什么,这样下一个必须维护你的代码的可怜人就不会诅咒你的名字。

对于这种特定情况,您可以使用更简单的代码(伪代码)来实现您的尝试:

def areConsecutive(a, b, c):
    if a > b: swap a, b
    if b > c: swap b, c
    if a > b: swap a, b
    return (b - a == 1) and (c - b == 1)

这三个if 语句只是一个展开的冒泡排序,以确保abc 按升序排列,然后您只需检查以确保它们之间的差异在两种情况下都是一个。

没有必要将它们放入列表或数组中进行排序,因为对三个项目进行排序相对容易(可以使用int t = a; a = b; b = t; 进行交换)。

就 Java 代码而言(一旦您将输入移动到它所属的函数外部),您最终会得到如下内容:

bool areConsecutive(int a, int b, int c) {
    int t;
    if (a > b) { t = a; a = b; b = t; }
    if (b > c) { t = b; b = c; c = t; }
    if (a > b) { t = a; a = b; b = t; }
    return (b - a = 1) && (c - b == 1);
}

【讨论】:

    【解决方案2】:

    当您传递价值时,为什么要使用扫描仪? 删除这些行及其工作。您可以使用其他逻辑来确定连续的数字。

    public boolean consecutive(int x, int y, int z) {
         if (((x < y && x < z) && (y < z && ((y - x) == 1) && ((z - x) == 2))) ||((z < y && ((z - x) == 1) && ((y - x) == 2)))) {
            return true;
         } else if (((y < x && y < z)&& (x < z && ((x - y) == 1) && ((z - y) == 2))) ||
                                    ((z < x && ((z - y) == 1) && ((x - y) == 2)))){
            return true;
         } else if (((z < x && z < y)&& (y < x && ((y - z) == 1) && ((x - z) == 2))) ||((x < y && ((x - z) == 1) && ((y - z) == 2)))){
            return true;
         } else
           return false;
     }
    

    【讨论】:

      【解决方案3】:

      只需删除这些代码:

      Scanner kb = new Scanner(System.in);
      x = kb.nextInt();
      y = kb.nextInt();
      z = kb.nextInt();
      

      或者像这样使用:

      public class test{
        public static void main(String[] args) {
                      Scanner kb = new Scanner(System.in);
              x = kb.nextInt();
              y = kb.nextInt();
              z = kb.nextInt();
            System.out.println("Result:" + consecutive(x, y, z));
      
          }
      
          public static boolean consecutive(int x, int y, int z) {
              if (((x < y && x < z) && (y < z && ((y - x) == 1) && ((z - x) == 2))) || ((z < y && ((z - x) == 1) && ((y - x) == 2)))) {
                  return true;
              } else if (((y < x && y < z) && (x < z && ((x - y) == 1) && ((z - y) == 2)))
                      || ((z < x && ((z - y) == 1) && ((x - y) == 2)))) {
                  return true;
              } else if (((z < x && z < y) && (y < x && ((y - z) == 1) && ((x - z) == 2))) || ((x < y && ((x - z) == 1) && ((y - z) == 2)))) {
                  return true;
              } else {
                  return false;
              }
          }
      }
      

      【讨论】:

        【解决方案4】:

        用数字创建一个列表,对其进行排序并在元素之间进行区分:

        public static boolean myConsecutive(int x, int y, int z) {
                final List<Integer> list = new ArrayList<>();
                list.add(x);
                list.add(y);
                list.add(z);
        
                Collections.sort(list);
                return (list.get(2) - list.get(1) == 1 && list.get(1) - list.get(0) == 1);
        }
        

        【讨论】:

          【解决方案5】:

          连续的方法是通过三个值传递的,那你为什么要从控制台读取。

          创建一个大小为 3 个元素的数组。

          使用Arrays.Sort方法对数组进行排序

          检查第二个和第一个数字之间的差是1,第三个和第二个数字之间的差是1。

          代码:

          public boolean consecutive(int x, int y, int z) {
          int [] numbers = new int [3];
          numbers[0] = x;
          numbers[1] = y;
          numbers[2] = z;
          Arrays.sort(numbers);
          boolean isConsecutive = (numbers[1]==numbers[0]+1)&&(numbers[2]==numbers[1]+1);
          return isConsecutive;
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-05-23
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多