假设我有一个char数组,并且我想构造一个只包含唯一字符的新数组(即数组只包含每个字符的一次出现)。这是对介绍性C书中练习的响应的一部分,其中尚未引入指针等高级概念。所以,答案不应该使用指针。
int i, j, n;
char list[MAX_SIZE], unique_list[MAX_SIZE];
char curr;
n = 0;
for(i = 0; i < strlen(list) ; ++i){
curr = list[i];
for (j = 0; j <= n; ++j){
if (unique_list[j] == curr)
break;
else
unique_list[n++] = curr;
}
}
然而,当我运行它时,它似乎不起作用。显然它停留在永久循环中,unique_list[j]
总是等于curr
(从char数组中读取当前字符)。但是我没有初始化unique_list
那么为什么它总是包含与从主数组中读取的字符相同的字符?
答案 0 :(得分:2)
你需要重新思考逻辑。对于list
中的每个字符,您需要检查该字符是否在unique_list
中。如果没有,则将该字符添加到unique_list
。换句话说,添加角色需要在j
循环之后,而不是在j
循环内。像这样:
int i, j, n;
char list[MAX_SIZE], unique_list[MAX_SIZE];
char curr;
n = 0;
for(i = 0; i < strlen(list) ; ++i){
curr = list[i];
for (j = 0; j < n; ++j){
if (unique_list[j] == curr)
break;
}
if(j == n)
unique_list[n++] = curr;
}
答案 1 :(得分:1)
为了在复杂度O(n)中执行此操作,请使用标志数组 这是完整的代码
int i, j, n;
char list[MAX_SIZE], unique_list[MAX_SIZE];
int flag[128];
memset(flag,1, sizeof(flag));
char curr;
n = 0;
for(i = 0; i < strlen(list) ; ++i)
{
curr = list[i];
if(flag[curr]) {
unique_list[n++] = curr;
flag[curr] = 0;
}
}
如果您不知道什么是memset,可以查看memset function in c language