최근 인터뷰 질문입니다. 선형 배열보다 비트 배열의 비트를 분할하는 방법
1과 0의 배열을 감안할 때, '0'은 함께 그룹화되도록
in place
비트를 분할하는 방법을 발견하고 하나의 함께 그룹화된다. 1이 0보다 앞서거나 0이 1보다 앞서 있는지 여부는 중요하지 않습니다.
입력의 예는 101010101
이고 출력은 111110000
또는 000011111
입니다.
선형 시간 미만으로 문제를 해결하십시오.
문제를 간단하게 만듭니다. 입력은 정수 배열이며 각 요소는 1 또는 0입니다. 출력은 정수로 잘 분할 된 동일한 정수 배열입니다. 나에게
이는 O (N)에 해결 될 수 있다면 쉬운 질문이다. 내 접근 방식은 배열의 양쪽 끝에서 시작하는 두 개의 포인터를 사용하는 것입니다. 각 포인터를 늘리거나 줄입니다. 올바른 정수를 가리 키지 않으면 두 정수를 바꿉니다.
int * start = array; int * end = array + length - 1; while (start < end) { // Assume 0 always at the end if (*end == 0) { --end; continue; } // Assume 1 always at the beginning if (*start == 1) { ++start; continue; } swap(*start, *end); }
그러나 인터뷰에서는 하위 선형 솔루션이 있다고 주장합니다. 이것은 열심히 생각하고 있지만 여전히 대답을 얻지 못하게합니다.
누구든지이 인터뷰 질문에 도움이 될 수 있습니까?
업데이트 : : 하위 선형 시간에 문제를 해결할 수 없다는 응답을 볼 때 하위 선형 솔루션을 사용할 수 없다는 원래 생각을 확인할 수 있습니다.
면접관이 트릭을 할 가능성이 있습니까?
면접관이 "각 비트를 한 번 보지 않고 모든 비트가 분할되어 있다는 것을 알 수는 없으므로 선형입니다."라는 라인을 따라 여기에 뭔가를 원할 수도 있습니다. 당신의 대답에 대한 논리. 명확한 설명을 위해, 비록 나의 대답은 여전히 세트 비트를 "보았"만, 실제로 0을 비교할 때 모든 비트를 검사합니다. – GManNickG
"면접관이 트릭을 할 수 있습니까?" 어쩌면 당신이 어리석은 논평을하는 경영진을 어떻게 처리했는지보기위한 시험이었을 것입니다 :-) – paxdiablo
면접관은 "1이 0보다 앞서거나 0이 1보다 앞서 있는지 여부는 중요하지 않습니다."라고 말했습니다. 이 사실이 알고리즘에 예상치 못한 영향을 미칠 수 있습니까? (직관은 아니요, 여전히 각 요소를 방문해야합니다)? –