나는이 문제를 내 경력을 통해 여러 번 접했고 그다지 생각하지 못했습니다. 내 기준은 내가 더 좋은 솔루션을 원할 때까지 올랐다. 시연하기 위해 ES6을 사용할 것이지만 동일한 언어로 답변을 제한 할 필요는 없습니다.아이템들 사이의 공간
각 단어는 조건부로 인쇄되지만 각 단어 사이에는 구분 기호가 인쇄되어야합니다 (예 : 첫 단어를 제외한 모든 단어 앞에).
나는 종종 긴 체인이 문제가 발생 그렇게 같이 해결 if 문 :
let something_printed = false;
for (let [word, condition] of word_conditions) {
if (condition)
if (something_printed)
print(' ');
print(word);
something_printed = true;
}
, 단지 구분을 조건 추가 인쇄한다 :
let something_printed = false;
if (condition1) {
print(word1); // no space needed here
something_printed = true;
}
if (condition2) {
if (something_printed)
print(' '); // but now a space is necessary
print(word2);
something_printed = true;
}
if (condition3) {
if (something_printed)
print(' '); // here too
print(word3);
something_printed = true;
}
또는 루프에서
, 끝내기 위해 나를 괴롭힌다. 그래서 (위의 예 중 하나에 적용 할 수 있습니다) 다음과 함께했다 : 내가 함께 와서 한 가장 간결한 솔루션입니다 이let separator = ''; // separator is initially empty
for (let [word, condition] of word_conditions)
if (condition) {
print(separator + word);
separator = ' '; // separator is a space here on out
}
I가 일을 한 것입니다 ... 아주 오랜 시간.
그래서 여기에 우리가 두 개의 루프가이 첫 번째 루프가 처음 인쇄 된 단어를 포착하고, 두 번째는 앞의 모든 단어를 처리합니다 여분의 인덱싱을 무시
let words = word_conditions.keys();
let conditions = word_conditions.values();
let index;
for (index = 0; index < words.length; index++)
if (conditions[index]) {
print(words[index]);
break;
}
for (; index < words.length; index++)
if (conditions[index])
print(' ' + words[index]);
을, 두 번째 루프에서 더 낭비 노력이 없다, 이 방법은 좀 더 장황한 해결책이며, 여분의 색인 생성을 무시하는 데 많은 노력이 필요합니다.
let unconditional_words = [];
for (let [word, condition] of word_conditions)
if (condition)
unconditional_words.push(word);
print(unconditional_words.pop());
for (let word of unconditional_words)
print(' ' + word);
:
두 단계 접근 방식은 약간의 희망을 제공하며, 충분히 좋은,하지만 가장 간결하지 않고, 때문에 인쇄 된 단어 배열을 구축하는 시간과 메모리의 가격을 지불 할 수처럼 보인다
물론 이것은 멍청이지만 나는 항상이 문제에 빠져 있습니다. 거기에는 간결하고 효율적인 구현이 있어야합니다. 필자는보다 기능적인 접근법을 탐구하지는 않았지만 위에 표시된 것보다 몇 가지 더 나은 솔루션을 포함 할 수 있다고 생각합니다.
에필로그 아마 정말 배열을 구축하고 조인을 수행 할 수있는 공간이없는 생각 된 플랫폼으로 내 예제 자바 스크립트를 사용하지 말았어야
. (오래된 마이크로 컨트롤러를 생각해보십시오.) 그러나, 내가하는 일의 대부분은 이런 식으로 제한되지 않습니다. 공간을 절약 할 수없는 곳에서 위의 세 번째 구현을 계속 수행 할 것입니다. 현대 기술에서 join()은 적용 가능하고 간결하며 효율적입니다. 평소처럼 다른 사람의 노력을 활용하는 것이 최선의 방법입니다. 감사 그림자.
let words = [];
if (condition1)
words.push(word1);
if (condition2)
words.push(word2);
if (condition3)
words.push(word3);
print(words.join(' '));
를 루프와 두 번째 예를 들면 다음과 같습니다 :
let words = [];
for (let [word, condition] of word_conditions)
if (condition)
words.push(word);
print(words.join(' '));
날, 간단한 단순하고 이해할 수 있습니다
그래서 IFS 내 첫 번째 예는과 같이) (가입 사용할 수 있습니다 솔루션. 좋은.
오른쪽. 문제 해결에 가장 좋은 방법은 다른 사람의 캡슐화 된 솔루션을 사용하는 것입니다. join()에 대한 몇 가지 구현을 살펴 보았습니다. 그것들은 간결한 것과는 거리가 멀었고 우아한 해결책에 관한 어떤 계시로 나를 이끌지는 못했지만 확실히 효율적이었습니다. – Mark
당신은 inbuilt 하나를 사용하는 것보다 join의 구현을보고있는 어떤 이유가 있습니까? 문제를 해결하기보다는 자신의 버전을 작성하는 법을 배우려고하십니까? – Shadow