【问题标题】:Get the number of elements that it has a value in array获取它在数组中具有值的元素数
【发布时间】:2013-12-05 14:48:01
【问题描述】:

我有一个类似下面的数组

int arr[32];

这个数组可以包含 32 个元素。
如果我在该数组中添加一些数据,如下所示

arr[0] = 5;
arr[1] = 10;
arr[2] = 15;
arr[3] = 20;

如您所见,我将数据添加到元素 0,1,2,3 中,而其他元素仍未初始化或为空。

现在,如何获取只有数据的元素计数?

在当前示例中将获得 4 个元素。

【问题讨论】:

  • (1) 使用已知值(通常为 0)初始化数组。然后检查有多少不是你的起始值。 (2) 保留一个“nUsed”变量并在每次写入时递增它。 (3) 创建一个包含“已使用”元素的布尔值的并行数组。 ..必须有更多的方法..
  • (4)如果你打算按in的顺序添加元素,你只需要保留“下一个”要填写的索引即可; (5) 对于无序,上述任何一种情况,或保留分配索引列表的并行有序列表(这本身就是一个有序数组)。
  • (对于(6)请参阅@NemanjaBoric 的答案中的评论)(7)您的新值都与模式n > 0 && n % 5 == 0 匹配。使用与此模式不匹配的值初始化数组。如果您需要找出使用了多少元素,请根据您的模式测试每个值。
  • (8) 列出允许的值。在arr 中,您存储允许值的index。不使用未指向allowed 数组中的有效索引或指向allowed 数组中指定为“无效”的索引的arr 成员。
  • (9) 列出允许的值。使用不在此列表中的任何值初始化您的数组。要计算“已使用”元素,请将每个值与 allowed 列表进行比较。

标签: c arrays


【解决方案1】:

您可以通过多种方式做到这一点 - 一种是保留初始化值的计数器:

arr[0] = 5;
arr[1] = 10;
arr[2] = 15;
arr[3] = 20;
n = 4;

这仅在您按顺序填充数组时才有效。

另一种方法是用一些在语义上不能是数组元素的值来初始化数组:

int arr[32] = {-1};

之后,您可以检查当前元素是否包含不同于-1 的值。

示例循环可以这样实现:

for(i = 0; i < 32 && arr[i] != -1; i++)
{
   // do things
}

另外,正如@Jongware 在评论中指出的那样——如果你不介意花费 O(n) 的额外空间——你可以有额外的标志数组:

int fill[32] = {0};
arr[0] = 5;   fill[0] = 1;
arr[1] = 10;  fill[1] = 1;
arr[2] = 15;  fill[2] = 1;
arr[3] = 20;  fill[3] = 1;

如果这对您很重要,您可以使用位集节省一些空间。

【讨论】:

  • 不幸的是C does not support operator overloading。我正在考虑添加“重载[] 运算符”...
  • 感谢您的回答,但问题是,当我编写代码循环打印仅包含数据的元素时,for(i=0; i &lt; what should I write here; i++)
  • @LionKing:“数据”——不!数组总是包含数据!
  • @AndyStowAway:Nemanja 说“哪个语义不能是数组的元素”。因此,如果 语义 允许 -1,则选择一个不允许的值。 (例如,+1。)
  • 它给了我一个关于 (6) 的想法:最初,选择一个 random “无效”值并用它填充数组。分配一个值时,检查它是否是invalidNumber——如果是,选择另一个(不在列表中)并在分配新数字之前将所有invalidNumber元素更改为这个新元素。
【解决方案2】:
int arr[32]={0};
int c=0;
arr[0] = 5;
arr[1] = 10;
arr[2] = 15;
arr[3] = 20;
for(int i=0; i<32; i++){
    if(arr[i]){
            c=c+1;
              }
printf("count is %d",c);
}

【讨论】:

    【解决方案3】:

    这就是我要保持严格列表的可能分配的元素。这将创建一个一次性写入数组。

    int arr[32];
    
    int assignedOrder[32];
    int assignedOrderIndex = 0;
    
    int assign (int index, value)
    {
       int i;
       if (index < 0 || index >= 32)
         return E_FAIL;
       if (assignedOrderIndex == 32)
         return E_FAIL;
       for (i=0; i<assignedOrderIndex; i++)
         if (assignedOrder[i] == index)
           return E_FAIL;
       arr[index] = value;
       assignedOrder[assignedOrderIndex] = index;
       assignedOrderIndex++;
       return E_SUCCESS;
    }
    

    不知何故,您可能应该转而使用 C++,因为有些标准对象恰好具有此功能。

    【讨论】:

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