2017-11-30 16 views
1

このアルゴリズムを解決するより良い方法を学ぶことを願っています。入力は2つの文字列で構成されています。2つの文字列をマージするJavaScriptのアルゴリズム

入力 - 例1:

var a = 'abc' 
var b = 'def' 

予想される出力

mergedString = 'adbecf'; 

私のソリューション:

var a = 'abc'; 
var b = 'efg'; 

function mergeStr(a, b) { 
    var aArr = a.split(''); 
    var bArr = b.split(''); 
    var newStr = ''; 

    for (var i = 0; i < aArr.length; i++) { 
    newStr += aArr[i] + bArr[i]; 
    } 
} 

mergeStr(a, b); 

ソリューションは、上記の入力例のために働きます。第二の入力値が私に与えられたとき、しかし、私はある立ち往生した

var a = 'ab'; 
var b = 'efg'; 

予想される出力は次のようになります。私はタイムアウトされていたので、

aebfg 

LOL私は、次のジャンクを思い付きました。私はちょうど私が与えられた正確なユースケースに対処するためにifステートメントを追加しました。明らかにこの解決法は迷惑です。私は本当に他人が何をするかを見たいと思う。

function mergeStr(a, b) { 
    var aArr = a.split(''); 
    var bArr = b.split(''); 
    var newStr = ''; 

    for (var i = 0; i < aArr.length; i++) { 
    newStr += aArr[i] + bArr[i]; 
    } 

    if (a.length < b.length) { 
    newStr += b[2]; 
    } 

    console.log(newStr); 
} 

答えて

1

アレイのように各文字列にアクセスできます。これを行うには分割する必要はありません。空の文字列にundefinedフォールバック、それを通過した場合にループ、その後、最大の長さの変数を見つけることについて

function merge(str1, str2) { 
    let merged = ""; 
    let max = str1.length > str2.length ? str1.length : str2.length; 
    for (let i = 0; i < max; i++) { 
     merged += (str1[i] ? str1[i] : "") + (str2[i] ? str2[i] : ""); 
    } 
    return merged; 
} 

// prints acbd 
console.log(merge("ab", "cd")); 

// str1 is bigger, prints acbdx 
console.log(merge("abx", "cd")); 

// str1 is bigger, prints acbdxy 
console.log(merge("abxy", "cd")); 

// str2 is bigger, prints acbdx 
console.log(merge("ab", "cdx")); 

// str2 is bigger, prints acbdxy 
console.log(merge("ab", "cdxy")); 
+0

ええ素敵な機能のthats。私がテストしたすべてのユースケースでスケールします。ありがとう。 – Aaron

0

方法:

私のソリューションは、三項演算子を使用しています。

var a = 'ab'; 
 
var b = 'efg'; 
 

 
function mergeStr(a, b) { 
 
    let newStr = ''; 
 
    let len = Math.max(a.length - 1, b.length - 1); 
 
    for (let i = 0; i <= len; i++) { 
 
    newStr += (a[i] || "") + (b[i] || ""); 
 
    } 
 
    return newStr; 
 
} 
 

 
console.log(mergeStr(a, b));

+0

'var'の代わりに' let'を分割して使用する必要はありません; – davidbuzatto

3

他の(現在の)応答とは対照的に幾分少ない比較を使用する代替。

function mergeStr(str1, str2) { 
    let merged = ""; 
    const min = Math.min(str1.length, str2.length); 

    // first part: take from both strings 
    for(let i=0; i<min; i++) { 
    merged += str1[i] + str2[i]; 
    } 

    // second part: take the rest from either string 
    let largerStr= str1.length > str2.length ? str1 : str2; 
    merged += largerStr.substr(min); 

    return merged; 
} 

これは、短い長さをとり、基本的には最初の数文字のためにあなたのアプローチを使用しています。その後、それは単に大きな文字列の残りの部分を追加します。

+0

これは、値をスワップする必要がない場合のマージ/クイックソートのような良いアプローチです;) – davidbuzatto

+0

これは素晴らしい機能です。ありがとう。 – Aaron

1

私は1つのライナーが好き..

function algo(str1,str2) { 
    return Array.from(str1.length >= str2.length ? str1 : str2).map((v,i) => (str1[i]||"")+(str2[i]||"")).join("") 
} 
+2

'i'の代わりに' map() 'コールバックのインデックスパラメータを使用できませんでしたか? – Sirko

+0

trueeeeee haha​​ha – rupps

関連する問題