【问题标题】:Constructing an array of unique characters from a char array从 char 数组构造唯一字符数组
【发布时间】:2016-01-28 20:23:54
【问题描述】:

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

【问题讨论】:

标签: c arrays char


【解决方案1】:

您需要重新考虑逻辑。对于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;
}

【讨论】:

  • 等等,我应该再找时间。
  • 是的,当 j 获得唯一字符时,它应该变为 n+1。
  • @user3386109,干得好!我懒得描述了。
  • 懒人是新思想的发明者:v
【解决方案2】:

要在复杂度 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

【讨论】:

  • 我宁愿不使用像memset 这样的高级概念。这是一个介绍性章节的练习。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-21
  • 2016-02-05
  • 2012-07-10
  • 1970-01-01
  • 1970-01-01
  • 2013-02-04
相关资源
最近更新 更多