c - 在 C 中打印数组的唯一值

标签 c arrays unique counting

我编写了一个函数,创建一个随机值的动态数组,另一个函数创建一个由前一个数组的唯一值组成的新数组。使用的算法正确计算唯一值。但是,我在打印所有值时遇到了问题。在下面的示例中,程序打印了 7 2 12714320 4 5 而不是 7 2 4 5 6

这是可以测试的程序:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int *delduplicate(int *v, int size_old, int *size_new);

main()
{
    int n;
    int *norepeat;
    float *results;
    int dim, size_norepeat, i;
    
    int a[7] = {7,2,2,4,5,6,7};
    
    norepeat = delduplicate(a, 7, &size_norepeat);
    
    for (int i = 0; i < size_norepeat; i++)
        printf("%d ", norepeat[i]);
}



// delduplicate function
int *delduplicate(int *v, int size_old, int *size_new)
{
    int i, j, k = 1, uniques = 1, repeats, *new_v, temp;
    
    // count the number of unique elements
    for (i = 1; i < size_old; i++)
    {
        int is_unique = 1;
        
        for (j = 0; is_unique && j < i; j++)
        {
            if (v[i] == v[j])
                is_unique = 0;          
        }
        
        if (is_unique)
            uniques++;
    }
    
    *size_new = uniques;
    
    // create new array of unique elements
    new_v = (int*) malloc(*size_new * sizeof(int));
    
    // fill new array with unique elements
    new_v[0] = v[0];
    
    for (i = 1; i < size_old; i++)
    {
        int is_unique = 1;
            
        for (j = 0; j < i; j++)
        {
            if (v[i] == v[j])
                is_unique = 0;
        }
    
        if (is_unique)
            new_v[k] = v[i];
            k++;
            
    }
    return new_v;
}

问题应该发生在这里:

// fill new array with unique elements
new_v[0] = v[0];

for (i = 1; i < size_old; i++)
{
    int is_unique = 1;
        
    for (j = 0; j < i; j++)
    {
        if (v[i] == v[j])
            is_unique = 0;
    }

    if (is_unique)
        new_v[k] = v[i];
        k++;       
}

最佳答案

您的问题可能出现在以下部分 -

if (is_unique)
    new_v[k] = v[i];
    k++;

在这里,您在每次迭代时递增 k。但是,您只想在找到唯一元素时增加它。不带括号的 if() 仅考虑第一个语句。所以改成这样 -

if (is_unique){
    new_v[k] = v[i];
    k++;
}

此更改应该会使您的程序运行良好。


旁注:如果您不想对 if()for() 等使用括号,则可以将其分开语句用逗号分隔,并使用不带方括号的语句。像这样 -

if (is_unique)
    new_v[k] = v[i],
    k++;

关于c - 在 C 中打印数组的唯一值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62488392/

相关文章:

iphone - 如何在Window中创建c/c++库,并在iPhone项目中使用?

javascript - JavaScript 中的持久数组

sql - 将表字段更改为 UNIQUE

c - 具有必须在 C 中的 .h 文件中公开的属性的私有(private)结构

c - 交换单向链表中的节点

java - 将字符串数组转换为 double 组

Java ArrayList如何在开头添加元素

algorithm - 如何计算列表中的唯一项?

PostgreSQL 从三个不同的列中选择唯一值

c - C 中的竞争条件