从char数组构造一个唯一字符数组

时间:2016-01-28 20:23:55

标签: c arrays char

假设我有一个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那么为什么它总是包含与从主数组中读取的字符相同的字符?

2 个答案:

答案 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