2011-03-04 25 views

回答

4

听起来像家庭作业,但这里有一个解决方案。

制作256个条目的数组,如char set[256]。 阅读第一个字符串。对于每个字符cset[(unsigned char)c]设置为1. 读取并复制第二个字符串。对于每个字符c如果set[c]则跳过c

我忘了,离开了,你必须先memset(set, 0, sizeof(set))任何值设置为1

+2

你为什么决定选择256?也不应该是'int'数组,而不是'char's? – 2011-03-04 03:57:40

+0

@Andrew:标准的8位字符。我想*真的很挑剔*你需要使用预处理器宏来确定实际的字节大小。 – 2011-03-04 04:00:30

+0

@Andrew:我使用char来节省空间。它实际上应该是一个有点向量,但这太麻烦了,而且宏是令人讨厌的。 – 2011-03-04 04:01:05

2

如果他们是数字:

你不能“删除”他们,但你可以将其设置为0(或能代表你的情况去除任何其他值),或者创建一个包含了一个新的数组不属于两个数组的子集的数字。

蛮力的方法是使用两个嵌套for循环

如果他们char S:

你可以“删除”他们的“转移” - “交换” - “移动”的所有字符,不属于左侧的公共子集,然后将空终止符设置在正确的位置。 (只要你不乱用字符串文字(char * p = "lala")这很好)。这几乎使得常见的char消失。

+0

如果数组是C字符串,则可以_removed_。 – Apalala 2011-03-04 03:55:36

+0

@apalala,你的意思是转移?你是对的。没有读完这个问题,我认为他们是数字。 – Muggen 2011-03-04 03:56:38

+0

有没有可能有更好的方式,而不是使用蛮力(n * m次,其中n是数组1的长度,m是数组2的长度) – svirk 2011-03-04 03:56:41

2

之前,假设你想删除A0存在A1中的字符。首先创建一个布尔数组,其中每个索引都是一个字符。恩。如果在a1中找到'c',x ['c']将成立。然后通过a0循环,检查x数组以查看是否应该保留或抛出一个字符。如果需要,您可以创建一个元素被删除的新数组。这应该是O(n)操作。

1
void remove_repeated(char* s, char* another) 
{ 
    // ... preparation with another... see other answers 
    for (pos = p = s; *p != 0; p++) 
    { 
     if (!macro_is_repeated(*p)) 
      *pos++ = *p; 
    } 
    *pos = 0; 
} 

查看对is_repeated零件的其他解答。

相关问题