我在C中有一段代码,用来删除字符串.But中的重复字符,我在两个循环中做了这件事,并希望将其优化为一个循环。
void removeDuplicates(char* ptr)
{
int end = 1;
int length = strlen(ptr);
int current;
int i;
current = 1;
for(end=1; end<length; end++)
{
for(i=0; i<end; i++)
{
if(ptr[end] == ptr[i])
break;
}
if(i == end)
{
ptr[current] = ptr[i];
current++;
}
}
ptr[current] = 0;
}
int main(int argc, char** argv)
{
char str[256] = {0,};
gets(str);
removeDuplicates(str);
printf("%s\n", str);
return 1;
}
如何在一次循环中完成此操作?
发布于 2011-10-18 17:12:51
void removeDuplicates(char* ptr)
{
int exists[256] = {0};
int end;
int current = 0;
int length = strlen(ptr);
for(end = 0; end < length; end++)
{
if (exists[ptr[end]]) break;
exists[ptr[end]] = 1;
ptr[current++] = ptr[end];
}
ptr[current] = '\0';
}
int main(int argc, char** argv)
{
char str[256] = {0,};
gets(str);
removeDuplicates(str);
printf("%s\n", str);
return 1;
}
发布于 2011-10-18 17:30:50
这就是我最初想做的事情。微优化,为"char seen“数组使用更少的内存,否则它的想法与其他人发布的相同。
void removeDuplicates(char* src) {
// Bitfield to remember which chars we 've seen, assumes 8-bit char type
char bitfield[32] = { 0 }; // 32 * 8 = 256 bits
char* dest = src; // initialize "output" ptr
while(*src) {
// Bitfield manipulation
char ch = *src;
int pos = ch >> 3; // ch / 8
int bit = ch & 0x7; // ch % 8
char mask = 1 << bit;
// If char seen for first time, mark and write to "output"
if(!(bitfield[pos] & mask)) {
bitfield[pos] |= mask;
*dest++ = ch;
}
++src;
}
*dest = 0; // null terminator
}
。
https://stackoverflow.com/questions/7804768
复制相似问题