如何从我生成的随机数组中删除重复元素?

时间:2017-04-19 13:56:38

标签: c arrays

所以我有这段代码:

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

int main() {

    char a[200], b = 0;
    int x;
    x = 100 + rand() % 200;
    for (int i = 0; i < x; i++) {
        a[i] = 'a' + rand() % 26;
    }

    for (int i = 0; i < x; i++) {
        if (b % 10 == 0) { 
            printf("\n%c ", a[i]); 
            b = 0;
        }
        else {
            printf("%c ", a[i]);
        }
        b++;
    }
    printf("\n");

    return 0;

}

目的是我应该从&#39; a&#39;生成随机数组的字母。到&#39; z&#39; (我已经设法做到了)之后打印出没有在第一个数组中重复的元素的新数组。我尝试使用here中的代码来删除重复的元素,但它在我的代码中没有起作用。

3 个答案:

答案 0 :(得分:1)

一个简单的解决方案是循环遍历数组并将每个元素复制到一个新数组但是首先检查新数组中是否已经存在该值。

答案 1 :(得分:0)

O(n)解决方案,假设您的数组只包含 a z 的字母,包括创建另一个初始化为零的26个整数的小数组,{{ 1}},然后是主数组中的每个字母,

  • 如果exist[26]不打印
  • 否则打印并增加exist[letter - 'a'] > 0

例如,

exist[letter - 'a']

答案 2 :(得分:0)

对于初学者来说,由于语句

,程序具有未定义的行为
x = 100 + rand() % 200;

因为变量x的计算值可能超过数组的大小。

我认为你的意思是

x = 1 + rand() % 200;
   ^^^

当程序运行时,还需要调用标准函数srand来获得不同的随机序列。

程序可以按以下方式查看。

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

#define N   200

int main(void) 
{
    char s[N];
    size_t n;

    srand( ( unsigned int )time( NULL ) );

    n = 1 + rand() % N;

    for ( size_t i = 0; i < n; i++ )
    {
        s[i] = 'a' + rand() % ( 'z' - 'a'  + 1 ); 
    }

    for ( size_t i = 0; i < n; i++ )
    {
        putchar( s[i] );
        if ( ( i + 1 ) % 10 == 0 || i + 1 == n ) putchar( '\n' );
    }

    putchar( '\n');

    size_t m = 0;

    for ( size_t i = 0; i < n; i++ )
    {
        size_t j = 0;
        while ( j < m && s[j] != s[i] ) j++;

        if ( j == m )
        {
            if ( m != i ) s[m] = s[i];
            ++m;
        }
    }

    n = m;

    for ( size_t i = 0; i < n; i++ )
    {
        putchar( s[i] );
        if ( ( i + 1 ) % 10 == 0 || i + 1 == n ) putchar( '\n' );
    }

    putchar( '\n');

    return 0;
}

它的输出可能就像

bimiwgnkew
tphzfidwmn
yqoyoxbbxd
kalxljfyvj
upzdoglrez
edsubgsfjr
kvrvscgadb
lxsmdhuoaz

bimwgnketp
hzfdyqoxal
jvursc