4

最初の文字列の最初の文字の後に 2 番目の文字列の最初の文字が来て、次に最初の文字列の 2 番目の文字が来て、2 番目の文字列の 2 番目の文字が来るように、2 つの文字列を連結したい。の上。いくつかの例で最もよく説明されています:

    s1="Mark";
    s2="Zukerberg";  //Output=> MZaurkkerberg

もしも:

    s1="Zukerberg";
    s2="Mark"        //Output=> ZMuakrekrberg

もしも:

    s1="Zukerberg";
    s2="Zukerberg";  //Output=> ZZuukkeerrbbeerrgg

期待される出力を提供する次のコードを作成しましたが、多くのコードのようです。これを行うためのより効率的な方法はありますか?

public void SpecialConcat(string s1, string s2)
        {
            string[] concatArray = new string[s1.Length + s2.Length];
            int k = 0;
            string final = string.Empty;
            string superFinal = string.Empty;
            for (int i = 0; i < s1.Length; i++)
            {
                for (int j = 0; j < s2.Length; j++)
                {
                    if (i == j)
                    {
                        concatArray[k] = s1[i].ToString() + s2[j].ToString();
                        final = string.Join("", concatArray);
                    }
                }
                k++;
            }
            if (s1.Length > s2.Length)
            {
                string subOne = s1.Remove(0, s2.Length);
                superFinal = final + subOne;
            }
            else if (s2.Length > s1.Length)
            {
                string subTwo = s2.Remove(0, s1.Length);
                superFinal = final + subTwo;
            }
            else
            {
                superFinal = final;
            }
            Response.Write(superFinal);
        }
    }

私はJavascriptでも同じロジックを書いています。

4

10 に答える 10

7
var s1 = "Mark";
var s2 = "Zukerberg";
var common = string.Concat(s1.Zip(s2, (a, b) => new[]{a, b}).SelectMany(c => c));
var shortestLength = Math.Min(s1.Length, s2.Length);
var result = 
     common + s1.Substring(shortestLength) + s2.Substring(shortestLength);
于 2013-07-24T16:59:39.343 に答える
3

好奇心のために、ここに読めないワンライナーがあります(それでも、複数の行に分割されています;))

これは、文字列がすでに少なくともその長さになっている場合、文字列を特定の長さにパディングしても何も起こらないという事実を利用しています。つまり、各文字列を他の文字列の長さにパディングすると、短い方の文字列が長い方の長さにスペースで埋められます。

次に.Zip()、文字の各ペアを文字列に連結するために使用します。

string.Concat(IEnumerable<string>)次に、圧縮された文字列を単一の文字列に連結するために呼び出します。

最後に、 を使用して、前に導入した余分なパディング スペースを削除しますstring.Replace()

var result = string.Concat
(
    s1.PadRight(s2.Length)
    .Zip
    (
        s2.PadRight(s1.Length), 
        (a,b)=>string.Concat(a,b)
    )
).Replace(" ", null);

1 行 [ここにコーディング ホラー アイコンを挿入]:

var result = string.Concat(s1.PadRight(s2.Length).Zip(s2.PadRight(s1.Length), (a,b)=>string.Concat(a,b))).Replace(" ", null);
于 2013-07-24T18:29:18.333 に答える
3
static string Join(string a, string b)
{
   string returnVal = "";
   int length = Math.Min(a.Length, b.Length);
   for (int i = 0; i < length; i++)
      returnVal += "" + a[i] + b[i];

   if (a.Length > length)
      returnVal += a.Substring(length);
   else if(b.Length > length)
      returnVal += b.Substring(length);

   return returnVal;
}

おそらくstringbuilderによって改善される可能性があります

于 2013-07-24T17:00:58.447 に答える
2

頭のてっぺんから、これが私がそれを行う方法です。

        var s1Length = s1.Length;
        var s2Length = s2.Length;
        var count = 0;
        var o = "";
        while (s1Length + s2Length > 0) {
            if (s1Length > 0) {
                s1Length--;
                o += s1[count];
            }
            if (s2Length > 0) {
                s2Length--;
                o += s2[count];
            }
            count++;
        }
于 2013-07-24T17:14:42.160 に答える
1

わかりました、これは私が思いつくことができる* 2番目に短い解決策です:

    public string zip(string s1, string s2)
    {
        return (string.IsNullOrWhiteSpace(s1+s2))
            ? (s1[0] + "" + s2[0] + zip(s1.Substring(1) + " ", s2.Substring(1) + " ")).Replace(" ", null)
            : "";
    }

    var result =  zip("mark","zukerberg");

おっと!私の元の最短は上記のマークと同じでした...だから、私が思いついた2番目に短い! 再帰で本当に削減できることを望んでいましたが、それほどではありませんでした。

于 2013-07-24T21:15:43.237 に答える