2011-03-04 6 views

답변

4

소리가 숙제와 비슷하지만 해결책이 있습니다.

char set[256]과 같이 256 개 항목의 배열을 만듭니다. 첫 번째 문자열을 읽습니다. 각 문자 cset[(unsigned char)c]을 1로 설정하십시오. 두 번째 문자열을 읽고 복사하십시오. 각 문자의 경우 cset[c]이면 c을 건너 뜁니다.

나는 잊고 당신이 memset(set, 0, sizeof(set)) 먼저해야 1.

+2

왜 당신은 256을 골랐습니까? 또한'char'가 아닌'int'의 배열이 될까요? –

+0

@Andrew : 표준 8 비트 char. 난 정말 까다 롭다 고 생각합니다 * 실제 바이트 크기를 결정하기 위해 전 처리기 매크로를 사용해야합니다. –

+0

@ Andrew : 공간을 절약하기 위해 char을 사용합니다. 그것은 실제로 비트 벡터가되어야하지만 너무 많은 번거 로움과 매크로가 더러운 있습니다. –

2

그들은 숫자 인 경우 :

당신은 그들을 "제거"할 수는 없지만 0로 설정할 수 있습니다 (또는 다른 귀하의 경우 제거를 나타낼 수있는 값) 또는이 포함 된 새 배열을 만들 두 배열의 하위 집합에 속하지 않는 숫자.

무력 방법은 char의 경우 두 개의 중첩 for 루프

을 사용하는 것입니다 : - "스와핑"-

당신이 그들을 "제거"할 수는 "변화"에 의해 모든 문자를 "이동"하는 왼쪽의 공통 하위 집합에 속하지 말고 올바른 위치에 널 종결자를 설정하십시오. (당신이 문자열 리터럴 (char * p = "lala")을 엉망으로 만들지 않는 한 이것은 괜찮습니다). 이렇게하면 흔히 사라지는 공통점이있는 char 명이됩니다.

+0

배열이 C 문자열 용인 경우에는 _removed_가 될 수 있습니다. – Apalala

+0

@apalala, 이동 중입니까? 당신이 올바른지. 질문을 전부 읽지 않았고 숫자라고 생각했습니다. – Muggen

+0

brute force (n * m 번, n은 배열 1의 길이이고 m은 배열 2의 길이)보다 나은 방법이 있습니까? – svirk

2

에 그 값 중 하나를 설정하기 전에 당신은 A1에 존재 A0에서 문자를 제거 할 가정 밖으로 떠났다. 먼저 각 인덱스가 문자 인 부울 배열을 만듭니다. 전의. x [ 'c']는 a1에서 'c'가 발견되면 참이됩니다. 그런 다음 a0을 반복하면서 x 배열을 검사하여 char가 유지되거나 던져 지는지 확인합니다. 필요한 경우 요소가 제거 된 새 배열을 만들 수 있습니다. 이것은 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 부분에 대한 다른 답변을 참조하십시오.

관련 문제