(C)只有在满足条件时才删除for循环下的整数数组的元素

时间:2014-01-30 15:42:35

标签: c arrays loops elements

和/或使用不满足循环条件的其余元素创建一个新数组

所以我有两个数组,我将每个元素相互比较,并使用相应的下标,以便检查是否相等。

for ( i = 0; i < n; i++) {
   if ( arrayOne[i] == arrayTwo[i] ) {
       arrayOne[i] = -1 /UPDATE#1 I assinged the values to -1 since I really don't care what happens tp the "taken" ones, what I want is the statistics of how many became a couple, thus the couple++ counter
       couple++;  //frequency of same value for each respective subscript         
   }
}

我将为剩余的元素做其他事情(变量名将是 int single []

  1. 如果它与我刚删除的元素相同,我会删除(想想这个,因为另一方运气不足以与arrayTwo中相同值的确切位置相匹配)

    < / LI>
  2. 我还会删除重复的剩余元素

  3. 我将检查arrayOne中的其余元素是否存在于arrayTwo中,而不考虑相应的下标

  4. 示例:

     arrayTwo[] = {5,6,7,8};
     arrayOne[] = {5,5,8,5,4,4,4}; //comparing arrayOne to arrayTwo
    

    输出:

     couple = 1; //(since only element[0] of the two arrays are the same --> 5 == 5
     atlast = 1; //no regards to position or subscript as long as present in arrayTwo
    

    ,然后

    我应该删除arrayOne[0],即5,所以我的arrayOne(或者我将创建新数组)。 剩余的元素是5,8,5,4,4,4。

    然后嘿,5已被删除(拍摄),所以我不再需要5s了。所以剩下的元素是8,4,4,4

    到现在为止,我只有8,4,4,4。但是4个是重复的,我只需要一个4.所以我删除了duplicationg 4s。

    最后,删除拍摄后的arrayOne中只有8个和4个元素。我会在arrayTwo检查他们的合作伙伴。 (相同的价值,不考虑下标或位置)的含义,我不再关心这个位置了,只要我在arrayTwo中有相同的值,那就更重要了)

    只有8人在arrayTwo有合作伙伴。我将其设为atlast++,因此atlast = 1

    我不知道该怎么做:

    1. 删除arrayOne中的“take”元素(couple)//不需要,找到另一种方式
    2. 删除arrayOne中与刚刚删除的“take”(couple)元素具有相同值的剩余元素//我的arrayTwo包含唯一的,非重复的随机数,因此将-1分配给已采用的元素更容易不关心arrayOne中剩余的重复(意味着arrayTwo每个都是唯一的,arrayOne不是)
    3. 问题解决了。

      对于atlast计数器我从所采用的数字中减去它。 (我做了绝对值) //意外的解决方案,比你们给我的见解更多:)

      洞察

      我唯一需要的输出是couple和atlast的频率。我被我必须做的事情和实现的许多规则所震撼。但坚持不懈真的是值得的。呼。

      最后一次运行样本

      arrayTwo = {5,6,7,8,9} //唯一的随机数,非重复    arrayOne = {

3 个答案:

答案 0 :(得分:1)

要从数组中删除元素,必须将索引之后的所有元素都删除一个,然后减少数组的长度。

替代方案包括:

  1. 使用一个特殊的“空”值来表示该索引已被删除(您的循环必须跳过它,您可能必须对索引进行数学运算,但它是O(1)删除而不是O(n))
  2. 改为使用链接列表。

答案 1 :(得分:1)

另一种解决方法是创建“arrayOneBis”并从“arrayOne”中复制值,跳过要删除的元素?

答案 2 :(得分:0)

#include <stdio.h>

int main(){
    int arrayTwo[] = {5,6,7,8};
    int arrayOne[] = {5,5,8,5,4,4,4};
    int size1 = 7, size2 = 4;
    //i will initialize them randomly, 0 - 9 only
    int counting[10] = {0};
    int i;
    for(i=0;i<size1;++i)
        ++counting[arrayOne[i]];//counting

    for(i=0;i<size2;++i)
        counting[arrayTwo[i]]=0;//delete
    size1 = 0;
    for(i=0;i<10;++i){
        if(counting[i]){
            arrayOne[size1++] = i;
        }
    }
    printf("result arrayOne = { ");
    for(i=0;i<size1;++i)
        printf("%d ", arrayOne[i]);//{ 4 }
    printf("}\n");
    return 0;
}