所以我有这段代码:
#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中的代码来删除重复的元素,但它在我的代码中没有起作用。
答案 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