제로 코드 이동 도전
무작위 수조를 정하고, 수조의 모든 0을 수조의 끝까지 밀어냅니다.
예를 들어 주어진 수조가 {1,9,8,4,0,0,2,7,0,6,0}이면
그것은 {1,9,8,4,2,7,6,0,0,0,0,0}으로 바꿔야 한다.
모든 다른 원소의 순서는 같아야 한다.
예상 시간의 복잡도는 O(n)이고 추가 공간은 O(1)이다.
우리는 이 문제를 해결하는 두 가지 방법을 소개할 것이다. 첫 번째는 abrute force이거나 업무 해결 방안의 첫 번째 가장 좋은 추측이다. 그리고 우리는 the recommended way를 처리하여 비교할 것이다.
여기 영상이 있어요.
폭력 - 첫 번째 솔루션
나의 첫 번째 직감은 다음 단계로 나눌 수 있다.
const moveZeroes = ( arr, dir = 'end') => {
// body of function here
}
우리의 함수는 양호한 형식의 숫자 그룹과 기본적으로'end '인 선택 방향 인자가 필요합니다.이제 함수체의 단계로 이동합니다.const size = arr.length;
let holder = Array.from({ length: size}, () => 0);
let filtered = arr.filter( v => v !== 0);
let offset = size - filtered.length;
if( dir === 'end' ) {
filtered.forEach( (v, i) => holder[i] = v );
}
if( dir === 'start' ) {
filtered.forEach( (v, i) => holder[ i + offset] = v );
}
const moveZeroes = ( arr, dir = 'end') => {
const size = arr.length;
let holder = Array.from({ length: size}, () => 0);
const filtered = arr.filter( v => v !== 0);
const offset = size - filtered.length;
if( dir === 'end' ) {
filtered.forEach( (v, i) => holder[i] = v );
}
if ( dir === 'start' ) {
filtered.forEach( (v, i) => holder[ i + offset] = v )
}
return holder;
}
다음과 같은 방법으로 테스트를 수행할 수 있습니다.let arr = [1, 9, 8, 4, 0, 0, 2, 7, 0, 6, 0];
console.log('Zeroes to end: ', moveZeroes(arr));
console.log('Zeroes to start: ', moveZeroes(arr, 'start'));
출력Zeroes to end : [1, 9, 8, 4, 2, 7, 6, 0, 0, 0, 0]
Zeroes to start : [0, 0, 0, 0, 1, 9, 8, 4, 2, 7, 6]
이는 당면 과제의 예상 결과물을 충족하지만 자동 평가를 통해 솔루션을 최적화할 수 있는 여러 요소를 파악해야 합니다.첫 번째 해결 방안과 같이 해결 방안의 논리적 해체부터 시작하여 이해에 도움이 되었으면 합니다
최적화 솔루션 - 권장 사항
우리는 하나의 그룹에서만 작업하고 두 개의 인덱스를 추적할 것입니다. 같은 위치에서 시작하는 읽기 인덱스와 쓰기 인덱스입니다.
우리는 readIndex를 사용하여 끝에서 끝까지 그룹을 스캔하고 0을 포함하는 모든 칸을 건너뛸 것입니다.
0이 아닌 값을 만났을 때, 0이 아닌 값으로 write Index의 값을 업데이트한 다음, 필요에 따라 0을 어느 쪽으로 이동해서 write Index를 감소하거나 증가시킵니다.
만약 당신이 상술한 절차를 읽은 후에 머리가 어지럽고 눈앞이 캄캄해진다면, 나는 가시적인 전시를 해서 당신이 신속하게 이해하는 데 도움을 줄 것이다.아래는 한 걸음 한 걸음 왼쪽으로 0을 이동하는 것을 보여 준다
이번에는 두 개의 독립된 함수로 그것을 코드로 바꾸어 왼쪽의 0에서 시작합시다.
[최적화] 왼쪽으로 0 이동
우리는 항상 함수 성명부터 시작한다
const moveZeroesLeft = function(arr) {
}
그리고 write Index와 start 위치를 저장하기 위해 두 개의 국부 변수를 설명합니다let writeIndex = arr.length - 1;
let start = writeIndex;
두 색인은 모두 수조의 끝에서부터 시작한다.가시화에서 우리가 두 개의 내부 순환을 실행할 것이라고 짐작할 수 있습니다.
첫 번째 순환은readIndex를 사용하여 0이 아닌 값을 스캔하고 writeIndex에서 찾은 값을 넣습니다.
매번 이런 조작을 실행하면 writeIndex는 감소합니다
for(let readIndex = start; readIndex >= 0; readIndex-- ) {
if( arr[readIndex] !== 0) {
arr[writeIndex] = arr[readIndex];
writeIndex--;
}
}
두 번째 순환은 지금부터 시작하여, write Index 칸에 도달할 때까지 0으로 값을 교환합니다. 이 칸도 0을 받을 것입니다.for (let j = 0; j <= writeIndex; j++) {
arr[j] = 0;
}
마지막으로, 우리는 업데이트된 그룹을 되돌려주기만 하면 된다return arr;
전체 코드:const moveZeroesLeft = function(arr) {
let writeIndex = arr.length - 1;
let start = writeIndex;
for(let readIndex = start; readIndex >= 0; readIndex-- ) {
if( arr[readIndex] !== 0) {
arr[writeIndex] = arr[readIndex];
writeIndex--;
}
}
for (let j = 0; j <= writeIndex; j++) {
arr[j] = 0;
}
return arr;
}
이 명령문이 다음 명령문과 출력에 적용되는지 확인할 수 있습니다.let arr = [1, 9, 8, 4, 0, 0, 2, 7, 0, 6, 0];
console.log('\n------------ Move zeroes left --------\n');
console.log(moveZeroesLeft(arr));
// outputs to console
[0, 0, 0, 0, 1, 9, 8, 4, 2, 7, 6]
[최적화] 오른쪽으로 제로 이동
0을 오른쪽에 놓은 코드는 이전과 같은 논리를 따른다.
주된 차이점은readIndex와 writeIndex는 끝이 아닌 그룹의 시작에서 시작한다는 것이다.
한 걸음 한 걸음 진행할 필요가 없다. 다음은 완성된 코드다.
const moveZeroesRight = function(arr) {
let writeIndex = 0;
const size = arr.length;
for(let readIndex = 0; readIndex < size; readIndex++) {
if(arr[readIndex] !== 0) {
arr[writeIndex] = arr[readIndex];
writeIndex++;
}
}
for(let j = writeIndex; j < size; j++) {
arr[j] = 0;
}
return arr;
}
다음 문을 사용하여 0을 배열 끝으로 이동하는 경우를 다시 한 번 기대하고 검증할 수 있습니다.let arr = [1, 9, 8, 4, 0, 0, 2, 7, 0, 6, 0];
console.log('\n------------ Move zeroes right --------\n');
console.log(moveZeroesRight(arr));
// outputs to console
[1, 9, 8, 4, 2, 7, 6, 0, 0, 0, 0]
결론
나는 너희들에게 이 재미있는 도전을 해결하는 여러 가지 방법을 철저히 보여 주려고 한다.
나는 네가 이 책을 좋아하길 바란다. 더 중요한 것은 이 두 가지 방법을 이해하고, 왜 그 중 한 가지 방법이 다른 것보다 더 좋은지 이해하는 것이다.
Reference
이 문제에 관하여(제로 코드 이동 도전), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/adyngom/move-zeros-code-challenge-1l0c텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)