【问题标题】:count no. of 1s and 0s without comparing数数没有比较的 1 和 0
【发布时间】:2015-04-17 08:11:06
【问题描述】:

在只有 1 和 0 的数组中,你怎么算不。 1 和 0 不进行比较,然后将其修改为 3 和 5 的数组。
我的方法是使用累积数组,使得累积[i]=数组[i]+累积[i-1]。一个数=累积[n] 零个数=n-累积[n]; 这种方法正确吗?或者建议一些其他的方法? 我们可以将其转换为 3 和 5 的数组而不进行比较吗?

【问题讨论】:

  • 使用关联字典,只使用数字作为键,对于新元素,字典中的值默认为 0。
  • 数组会包含 3 和5 吗?还是只有 0 和一个非 0 数字? IE。 0 和 3,或 0 和 5,还是...?
  • 添加所有值并从元素的长度/数量中减去呢?应该不难看出,对于一开始就知道的任意一对值,该方法不需要进行太多更改。

标签: arrays algorithm data-structures


【解决方案1】:

我认为您可以在不使用比较的情况下做到这一点,因为在大多数语言中0 被视为False1 被视为True。 示例:C、Python。

所以,与其比较值是0还是1,直接用它作为条件,应该可以不用比较就行了。您可以使用它来计算10 的出现次数。

在 Python 中,这将转换为以下代码

>>> original_list = [0, 1, 1, 1, 0, 1, 0]
>>> altered_list = [3 if item else 5 for item in original_list]
>>> print altered_list
[5, 3, 3, 3, 5, 3, 5]

【讨论】:

  • 这些仍然是比较 - 即使它们使用隐式转换
【解决方案2】:

你的方法是正确的。我也不认为它可以改进太多 - 毕竟你需要遍历所有数组元素。

【讨论】:

  • 我们可以将其转换为 3 和 5 的数组而不进行比较吗?
  • 好吧,你可以做一些new_array[i] = old_array[i] * 2 + 3 之类的事情。请注意,这种方法只对实践有意义 - 它不会优化任何东西并且会降低可读性
【解决方案3】:

您必须使用这样一个事实,即您只有有 1 和 0,而且对于任何项目,item 加上“一个减项目”会产生“one”。所以要计算每个你可以使用的数量:

numOfOnes += item[i];
numOfZeroes += (1 - item[i]);

那么你的下一个问题是你必须以某种方式将 0 转换为 5,将 1 转换为 3。使用与上述相同的技巧 - number负数 的加权和,使其分别产生 3s 和 5s。您必须找出正确的重量值。

肯定没有比较。作为奖励,您可以一次完成所有这些 - 转换值并即时计算它们。

【讨论】:

    【解决方案4】:

    您可以使用计数排序方法技术:创建另一个大小为 2 的数组,例如 b[2]。然后这样做:

    for(int i=0; i < n; i++) {
    b[a[i]]++;
    }
    

    最后,b[0] 将得到零的个数,b[1] 将得到 1 的个数。

    【讨论】:

      【解决方案5】:

      要转换 0->3 和 1->5,您可以使用查找表

      const int lookup[]={3,5};
      
      forloop {
         array[i] = lookup[array[i]];
      }
      

      【讨论】:

        【解决方案6】:
        //To find the count of 0 & 1 we can do below 
        public void findZeroOneCount(int [] arr){
                int len=arr.length;
                System.out.println(len);
                int sum=0;
                for(int i=0;i<len;i++){
                    sum=sum+arr[i];
                }
        
                System.out.println("Count of Zero:"+(len-sum%len));
                System.out.println("Count of One:"+sum%len);
        }
        

        【讨论】:

        • 请在代码块之外稍微解释一下您的解决方案
        猜你喜欢
        • 1970-01-01
        • 2020-02-23
        • 2015-03-19
        • 1970-01-01
        • 1970-01-01
        • 2021-11-21
        • 1970-01-01
        • 2020-10-29
        • 1970-01-01
        相关资源
        最近更新 更多