JavaScriptアルゴリズムの問題――異なる順序で並べられた文字列を検索します.


(面接の準備をして、問題をよく見てください.雨夜帯刀's Blogから来ました.)
需要記述:配列の中から、異なる順序で並べられた文字列の配列要素のセットを探し出す.このような配列がある場合:
[ 'abcd', 'hello', 'bdca', 'olleh', 'cadb', 'nba', 'abn', 'abc' ]
探し出すべき結果は:
[ 'abcd', 'bdca', 'cadb' ]
ここのポイントは、文字列のセットが文字の順番だけではないかどうかを判断することです.
方法1:
var stringClassify = function( arr ){
    var arrLength = arr.length,
        obj = {},
        i = 0,
        num, item, name, firstItem, strLength;

    for( ; i < arrLength; i++ ){
        item = arr[i];
        strLength = item.length;
        num = 0;

        //           Unicode   
        //          
        for( j = 0; j < strLength; j++ ){
            num += item.charCodeAt( j );
        }      

        if( !firstItem ){
            firstItem = item;
            obj[ num ].push( item );
        }
                //                    
                //                    
                // [ 'ad', 'da', 'bc' ]
        else if( ~firstItem.indexOf(item.charAt(0)) ){
            obj[ num ].push( item );
        }
    }

    for( name in obj ){
        console.log( obj[name] );
    }
}; 
方法1は、文字列中の各文字を巡回してユニック符号化に変換し、符号化を加算する計算を行い、abcdとbdcaの符号化は一致する.最後に、符号化と一致する文字列は、符号化と対象となるkeyで保存されます.
方法1で注意したいのは、文字列「ad」と「bc」のUnicodeコードは同じであり、この場合は判断を追加して、任意の文字列のうちの最初の文字が他の文字列に出現したかどうかを検出することである.
方法2:
var stringClassify = function(){
    var arrLength = arr.length,
        obj = {},
        i = 0,
        num, item, name, strArr, newStr;

    for( ; i < arrLength; i++ ){
        item = arr[i];

        strArr = arr[i].split( '' );
        strArr.sort();
        newStr = strArr.join( '' );

        if( !obj[newStr] ){
            obj[ newStr ] = [];
        }

        obj[ newStr ].push( item );
    }

    for( name in obj ){
        console.log( obj[name] );
    }
};
方法2は、文字列を配列に変換してから配列をsort順に並べ替えるもので、abcdとbdcaはsortを用いて並べ替えた後にabcdになり、撮影した順序の文字列を対象のkeyとして並べ替えられた文字列を保存します.
2つの方法の原理は、文字をUnicode符号に変換することによって、方法1は明示的に変換され、方法2で使用されるsort順序は暗黙的に変換される.