2016-11-03 2 views
0

나는이 문제를 내 경력을 통해 여러 번 접했고 그다지 생각하지 못했습니다. 내 기준은 내가 더 좋은 솔루션을 원할 때까지 올랐다. 시연하기 위해 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 내 첫 번째 예는과 같이) (가입 사용할 수 있습니다 솔루션. 좋은.

답변

1

join 기능을 찾고있는 것처럼 들립니다. 자바 스크립트 (및 ES6)에서

["First item", "Second item"].join(", "); 

는 자바 스크립트에서이 작업을 수행하는 방법에 내장 조인 사용

"First item, Second item" 
+0

오른쪽. 문제 해결에 가장 좋은 방법은 다른 사람의 캡슐화 된 솔루션을 사용하는 것입니다. join()에 대한 몇 가지 구현을 살펴 보았습니다. 그것들은 간결한 것과는 거리가 멀었고 우아한 해결책에 관한 어떤 계시로 나를 이끌지는 못했지만 확실히 효율적이었습니다. – Mark

+0

당신은 inbuilt 하나를 사용하는 것보다 join의 구현을보고있는 어떤 이유가 있습니까? 문제를 해결하기보다는 자신의 버전을 작성하는 법을 배우려고하십니까? – Shadow

0

를 반환합니다.

var words = "Hello this is my sentence"; 
 
var comma = words.split(" ").join(", "); 
 
console.log(comma);