2011-03-04 28 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零件的其他解答。

相關問題