【问题标题】:Count number of positive numbers [closed]计算正数的数量[关闭]
【发布时间】:2021-07-06 03:36:49
【问题描述】:

我有一个自然数数组 A。即A[i] >=0 我需要计算阳性的数量而不进行任何比较 如何实现?

【问题讨论】:

  • 什么算作比较? (n & 0x80000000) 检查是否设置了最左边的位,即二进制补码中的符号位。如果设置了该位,则为负数。
  • 一个简单的解决方案是找到数字的平方根,如果结果是可能的,它将是一个正整数,或者如果它抛出异常,它是一个负整数(当然没有平方根负数)。
  • 为什么不做比较就要做呢?不做比较是什么意思?如果你调用一个比较的库函数,但你的代码没有,可以吗?
  • @Raildex - 数组中没有负数
  • @YeshwinVermaTheProgrammer - 数组没有负数

标签: java


【解决方案1】:

我假设它是一个面试问题或其他东西,或者可能是某种学习练习。因此,不需要对 Java API 有“深入”的了解。 我还假设您不能使用任何“如果”条件。

一种相当“愚蠢”的方式来做到这一点(技术上回答了这个问题,但它太垃圾了,我发布它是为了好玩)所以不要在任何“真实”代码中使用它

        int numOfPositives = 0;
        int[] array = {0, 5, 7, 0, 4, 0, 9, 8};
        for (int elem : array) {
            try {
                int test = 1 / elem;
                numOfPositives++;
            } catch (ArithmeticException e) {
                // nah, this is 0, won't count it
            }
        }
        System.out.println(numOfPositives);

没有比较:)

更严肃的答案可能包括让您实现“isPositive”方法的位移。

我找到了this answer in SO,所以我猜不需要复制。

【讨论】:

  • 如果测试变量是 1/-5 那么我们也将其计为正数呢?
  • 在问题中出现“我有一个自然数数组 A. 即 A[i] >=0”所以我假设这个条件适用于数组的每个元素”。当然是自然数不能是负数。好吧,从技术上讲,“自然”数字也不包括零,所以我真的认为这是一个小错误(否则这个问题没有意义)。
  • 是的,但是一个简单的负数解决方案是找到数字的平方根,如果结果是可行的,它将是一个正整数,或者如果它抛出异常,它是一个负整数 (肯定没有负数的平方根)。
  • 在数学中,是的,它是一个复数,但是在 Java 中你可以写 System.out.println(Math.sqrt(-3)) 你会得到 NaN 而不是例外。无论如何,正如我所说,我的基本假设是没有负数。我还强调了这个解决方案更多的是“为了好玩”而不是真正的工作。因此,即使您可以提出基于 sqrt 的解决方案(真的可以随意发布)- 它或多或少和我的一样糟糕 :) 同样,回答此类问题的正确方法是像我一样使用位掩码我在回答的最后一句话中提到了。
【解决方案2】:

您可以简单地使用 java.lang.Math signum() 函数,它返回方法参数的 signum 函数,即如果参数为零则返回零,如果参数是 1.0如果参数小于零,则大于零和 -1.0

static boolean isPositive(int N)
{
    return Math.signum(N) == 1;
}
System.out.println(isPositive(0)); // false
System.out.println(isPositive(1)); // true
System.out.println(isPositive(5)); // true

【讨论】:

  • 我不确定这是否可以算作一个解决方案,因为您将 signum 调用的结果与 1 进行比较,这是变相的旧比较 :)
  • 如果== 被算作比较,那么位掩码方法(您的建议)也是不可接受的。但是可以通过使用大小为 2 的数组并为数组中的每个整数递增 arr[Math.signum(N)] 来轻松避免这种情况。正数的计数为 = arr[ 1 ]
【解决方案3】:

使用库方法:

int count(int[] input) {
    List<Integer> list = Arrays.stream(input).boxed().collect(Collectors.toList());
    list.removeAll(Collections.singletonList(0));
    return list.size();
}
System.out.println(count(new int[]{0, 5, 7, 0, 4, 0, 9, 8}));

5

【讨论】:

    【解决方案4】:

    希望这个解决方案没有任何可比性。

    import java.util.Objects;
    import java.util.stream.Collectors;
    import java.util.stream.Stream;
    
    public class CountPositiveNumbers {
    
        public static void main(String[] args) {
            Integer arr[] = { -1, 1, 0, 2, 3, 4, 5, -2, 4, -100, null };
            String[] responses = {"Negative", "Zero", "Positive"};
    
            long positiveNumberCount = Stream.of(arr)
                    .filter(num -> (Objects.nonNull(num) && "Positive".equals(responses[1 + (num >> 31) - (-num >> 31)])))
                    .collect(Collectors.toList()).stream().count();
    
            System.out.println("Positive Numbers Count ==> " + positiveNumberCount);
        }
    }
    

    【讨论】:

      【解决方案5】:

      希望此解决方案通过比较对您有用。

      import java.util.Objects;
      import java.util.stream.Collectors;
      import java.util.stream.Stream;
      
      public class CountPositiveNumbers {
      
          public static void main(String[] args) {
              Integer arr[] = { -1, 1, 0, 2, 3, 4, 5, -2, 4, -100, null };
      
              long positiveNumberCount = Stream.of(arr).filter(num -> (Objects.nonNull(num) && num > 0))
                      .collect(Collectors.toList()).stream().count();
      
              System.out.println("Positive Numbers Count ==> " + positiveNumberCount);
          }
      }
      

      【讨论】:

      • num &gt; 0 是 OP 想要避免的比较
      猜你喜欢
      • 2019-10-20
      • 2018-10-27
      • 2013-11-14
      • 1970-01-01
      • 2017-12-30
      • 1970-01-01
      • 1970-01-01
      • 2015-10-31
      • 2021-03-23
      相关资源
      最近更新 更多