자바스크립트 챌린지 3: 0 제거
This article was originally posted on my blog. Head over to inspiredwebdev.com for more articles and tutorials. Check out my JavaScript course on Educative to learn everything from ES6 to ES2020.
이 기사에서는 CodeWars의 Remove Zeroes 문제를 함께 해결할 것입니다. 여기link에서 찾을 수 있습니다. 이번 챌린지 난이도는 중입니다.
함께 작업을 읽어 봅시다.
Write a function that takes an array of values and moves all elements that are zero to the end of the array, otherwise preserving the order of the array. The zero elements must also maintain the order in which they occurred.
For example, the following array
[7, 2, 3, 0, 4, 6, 0, 0, 13, 0, 78, 0, 0, 19, 14]
is transformed into
[7, 2, 3, 4, 6, 13, 78, 19, 14, 0, 0, 0, 0, 0, 0]Zero elements are defined by either 0 or "0". Some tests may include elements that are not number literals.
You are NOT allowed to use any temporary arrays or objects. You are also not allowed to use any Array.prototype or Object.prototype methods.
임시 어레이에 관한 마지막 요점이 아니었다면 다음과 같이 완료할 수 있었기 때문에 이 과제가 더 쉬웠을 것입니다.
function removeZeros(array) {
const head = []
const tail = []
for (const e of array) {
if (e === 0 || e === "0") {
tail[tail.length] = e
} else {
head[head.length] = e
}
}
return [...head, ...tail]
}
이 솔루션은 내 것이 아니며 챌린지 페이지에서 가져왔습니다. 안타깝게도 0과 0이 아닌 값을 저장할 새 배열을 정의할 수 없으므로 유효하지 않습니다.
모든 것이 유효한 실생활 코딩에서 이것은 완벽하게 훌륭한 솔루션이므로 비슷한 문제가 발생하면 자유롭게 사용하십시오.
챌린지는 또한 Array.prototype 또는 Object.prototype 메서드를 금지하므로 push,slice,forEach 등은 금지됩니다..!
새 배열을 만들지 않고 해결하는 방법은 간단합니다. 여전히 배열을 반복하지만 임시 배열에 값을 저장하는 대신 각 0을 잡고 적절한 지점에 푸시합니다.
시작하자:
let limit = array.length;
let tmp;
for (let i = 0; i < limit; i++) {
if (array[i] === 0 || array[i] === "0") {
}
}
이제 배열을 반복하므로 마지막에 0을 이동하고 다른 모든 값도 한 단계 뒤로 이동해야 합니다.
let limit = array.length;
let tmp;
for (let i = 0; i < limit; i++) {
if (array[i] === 0 || array[i] === "0") {
tmp = array[i];
// iterate again over the array
for (let j = i--; j < array.length-1; j++) {
array[j] = array[j+1];
}
}
}
우리가 추가한 새로운 For 루프는 배열을 다시 반복하여 항목을 한 위치 뒤로 이동합니다. 다음 예를 보십시오.
// before our loop
[1,2,0,3,4,5]
// after our loop
[1,2,3,4,5,5]
보시다시피 루프는 모든 값을 한 지점 뒤로 이동한 다음 끝에 0을 다시 배치하여 이제 복제된 최종 값을 대체합니다.
정수 0인지 문자열 '0'인지 알아야 하므로 0 값을 저장하기 위해
tmp
변수를 만들었습니다.다음과 같이 함수를 마무리합시다.
function removeZeros(array) {
let limit = array.length;
let tmp;
for (let i = 0; i < limit; i++) {
if (array[i] === 0 || array[i] === "0") {
tmp = array[i];
// iterate again over the array
for (let j = i--; j < array.length-1; j++) {
array[j] = array[j+1];
}
// replace last value with the zero
array[array.length-1] = tmp;
limit --;
}
}
return array;
}
모든 것을 한 곳으로 되돌린 후 마지막 값을
array[array.length-1] = tmp;
로 바꿉니다.루프 끝에서
limit
변수를 줄이는 이유가 궁금하다면 배열의 뒤쪽에서 0을 이동하여 각 후 하나씩 확인해야 하는 배열 부분을 효과적으로 줄이고 있기 때문입니다. 0이 발견되는 반복.예를 들면 다음과 같습니다.
let array = [1,2,'0',3,0,4,5];
// after one iteration where a zero is found
// [1,2,3,0,4,5,'0'];
// after another iteration where a zero is found
// [1,2,3,4,5,'0',0];
// if we don't reduce the size of the iteration we end up with one more iteration like this
// [1,2,3,4,5,0,'0'];
위의 예에서 볼 수 있듯이 반복 가능한 배열의 크기를 줄이지 않으면 뒤에 '0'을 푸시하는 반복이 한 번 더 발생하여 잘못된 결과가 발생합니다. 올바른 순서를 존중합니다.
이것이 우리가
limit --
를 부르는 이유입니다.이 문제를 해결하는 다른 많은 방법이 있습니다. 의견에 귀하의 방법을 알려주십시오.
이러한 유형의 콘텐츠가 마음에 드셨다면 댓글로 알려주시면 더 많은 콘텐츠를 만들겠습니다.
ES6에서 ES2020까지 JavaScript에 대한 모든 것을 배우고 싶다면 Github에서 무료로 읽을 수 있는 제 책을 확인하세요. 과정도 진행 중입니다 Educative.
Reference
이 문제에 관하여(자바스크립트 챌린지 3: 0 제거), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/albertomontalesi/javascript-challenge-3-remove-zeroes-54gm텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)