자바 인터뷰 질문은이 Java 코드 스 니펫은 어떻게 작동합니까?
임시 버퍼를 사용하지 않고, 오른쪽으로 모두 0의 왼쪽과 1 개의 배치, 배열에서 0과 1을 구분합니다. 결과를 문자열로 인쇄하십시오. 예를 들어, 주어진 {0,1,1,0,0,1}, 출력은 "000111"입니다.
는 그리고 대답은 다음과 같습니다
public class ZeroOneSeparator {
public static void zeroOneSeparator(int[] inputArr){
// for each index, store number of 1's up to the index
for (int i = 1; i < inputArr.length; i++) {
inputArr[i] = inputArr[i-1] + inputArr[i];
}
// This is the "magical math" block I don't understand.
// Why does this "work"?
for (int i = inputArr.length - 1; i > 0; i--) {
if (inputArr[i] > 0) {
inputArr[i-1] = inputArr[i] - 1;
inputArr[i] = 1;
} else {
inputArr[i-1] = 0;
}
}
for (int i = 0; i < inputArr.length; i++) {
System.out.print(inputArr[i]);
}
}
public static void main(String[] args) {
int[] inputArr1 = {1,0,1,0,1,1};
ZeroOneSeparator.zeroOneSeparator(inputArr1);
System.out.println();
int[] inputArr2 = {1,1,1,0,0,0,0,0,0,1};
ZeroOneSeparator.zeroOneSeparator(inputArr2);
int[] inputArr3 = {}; // intentionally empty
System.out.println();
ZeroOneSeparator.zeroOneSeparator(inputArr3);
int[] inputArr4 = {0,0,0,0,0,0};
System.out.println();
ZeroOneSeparator.zeroOneSeparator(inputArr4);
int[] inputArr5 = {0,1,0,1,0,1,0,1};
System.out.println();
ZeroOneSeparator.zeroOneSeparator(inputArr5);
int[] inputArr6 = {1,1,1,1,1,1,0,0,0,0,0};
System.out.println();
ZeroOneSeparator.zeroOneSeparator(inputArr6);
}
}
나는 디버거이 코드를 강화,하지만 작동 난 아직도 왜 이해가 안 돼요. 누군가 그것을 통해 나를 걸을 수 있습니까?
'마법 블록'은 단지 배열을 정렬하는 것입니다. –
@ColeJohnson : 정말요? 그게 무슨 종류입니까? 그리고 "마술 블록"은 훌륭한 정렬 알고리즘이 될 O (n)입니다. – Thilo
@Thilo이 특정 정렬은 컬렉션에 두 개의 별개의 개체 만있는 경우에만 작동합니다. 그래도 비슷한 "집계 정렬"은 O (n)입니다. http://en.wikipedia.org/wiki/Counting_sort – dlev