消除字符数组中的重复项

时间:2014-12-22 22:31:35

标签: c++ visual-studio-2012

我必须使用指针和函数消除字符数组中的重复项。 我无法让它正常工作:

void del_copy(char *p){
int n = strlen(p);          
for (int i = 0; i < n; i++){           // Element that we compare
    for (int j = i + 1; j < n;j++){     //We compare p + i element with the rest of the elements
        if (*(p + i) == *(p + j)){        //If we find two similar, we eliminate that element by shifting
            for (int k = i; k < n; k++)
                *(p + k) = *(p + k + 1);
            }               
        }
    }
}

5 个答案:

答案 0 :(得分:3)

完成班次后,长度会发生变化。但你的n并没有考虑到这一点。

答案 1 :(得分:2)

这是一个简单的算法:

s 为空集(到目前为止遇到的字符)
结果为空字符串
对于输入字符串中的每个字符 c
如果 c 不在 s 中(
s 和中包含 c c 附加到结果的末尾 )

结果是结果

对于具有8位字节的普通计算机上的char类型,您只需使用std::bitset设置为s

另一个简单的算法是首先对字符串进行排序,如果没有要求保留顺序。然后你可以扫描它并查找重复项。

答案 2 :(得分:0)

这是我对这个问题的看法。它基本上使用查找表来检查之前是否已经看过该字符但是是模板化的。您可以使用任何类型的value_type

#include <algorithm>
#include <unordered_map>

template <typename Container>
Container unique_all(Container const& c) {
  Container out;
  ::std::unordered_map<typename Container::value_type,::std::size_t> lookup;
  ::std::copy_if(c.begin(), c.end(),
      ::std::back_inserter(out),
      [&](typename Container::value_type ch) {return !lookup[ch]++;}); 
  return out;
}

您可以这样称呼它:

unique_all(::std::string("hello dear world"))

答案 3 :(得分:0)

要修复的示例

void del_copy(char *p){
    char c;
    for (int i = 0; c=*(p+i); i++){
        char *p2, *p3;
        for(p2 = p+i+1, p3 = p2; *p3; ++p3){
            if(*p3 != c)
                *p2++ = *p3;
        }
        *p2 = '\0';
    }
}

答案 4 :(得分:0)

我还设法修复了自己的代码。谢谢大家的支持。 我不得不为while循环更改if循环并减少de lenght @ ScottMcP-MVP。

void del_copy(char *p){
int n = strlen(p);          
for (int i = 0; i < n-1; i++){           // Element that we compare
    for (int j = i + 1; j < n;j++){     //We compare p + i element with the rest of the elements
        while(*(p + i) == *(p + j)){        //If we find two similar, we eliminate that element by shifting
            for (int k = j; k < n; k++)
                *(p + k) = *(p + k + 1);
            n--;                             //decrement n because the lenght if smaller now
        }               
    }
}
}