花樣招聘面試題

殘缺的地圖

今天在微信羣裏面看到一張招聘圖片,以下面試

圖片描述

尋找鑰匙

被玷污的殘缺的婀娜多姿的二維碼,蘊藏着通往神祕國度大門的鑰匙。利用微信自帶截圖工具,憑藉着我手繪天賦,很快就還原了二維碼。xcode

圖片描述

而後查看圖片,長按。竟然是能夠識別的二維碼,掃一掃,獲得下面的摩斯密碼微信

.--..-......

找到答案

因而,百度摩斯密碼對照表。函數

圖片描述

因爲咱們獲得摩斯密碼沒有空格隔開,因此解密後有可能不止一種。這個時候,身爲攻城蝨固然想到是用程序解決了。工具

既然,圖片中說到是4個字的單詞,等於這段密碼能夠分爲4段。spa

[part1][part2][part3][part4]

若是4段密碼分別都能匹配上,那麼連起來整個密碼也能匹配上(廢話)。最早想到是用4層循環窮舉法code

for(){
    for(){
        for(){
            for(){
    
            }
        }
    }
}

但是如何把這段密碼分紅四段呢?很簡單,若是電碼符號與密碼前幾個字符能徹底匹配,這裏就分一段,而後繼續匹配下一段。blog

for(){
    // 匹配成功
    if([part1][part2][part3][part4].indexOf(xcode[i]) === 0 ){
        for(){
            if([part2][part3][part4].indexOf(xcode[j]) === 0 ){
                
            }
        }
    }
    
}

第四段,也就是最後一段匹配不能再用[indexOf],而是用[===]。遞歸

核心匹配代碼圖片

for(i = 0; i < morseCodeNum; i ++){
    if(mission1.indexOf(morseCodeMap[i]) === 0 ){
        firstMatchPart = morseCodeMap[i];
        mission2 = secretCode.slice(firstMatchPart.length);

        for(j = 0; j < morseCodeNum; j ++){

            if(mission2.indexOf(morseCodeMap[j]) === 0 ){
                secondMatchPart = morseCodeMap[j];
                mission3 = secretCode.slice(firstMatchPart.length+secondMatchPart.length);

                for(k = 0; k < morseCodeNum; k ++){
                    if(mission3.indexOf(morseCodeMap[k]) === 0 ){
                        thirdMatchPart = morseCodeMap[k];
                        mission4 = secretCode.slice(firstMatchPart.length+secondMatchPart.length+thirdMatchPart.length);

                        for(n = 0; n < morseCodeNum; n ++){
                            if(mission4 === morseCodeMap[n]){
                                fourthMatchPart = morseCodeMap[n];
                                console.log([firstMatchPart, secondMatchPart, thirdMatchPart, fourthMatchPart].join(''));
                                result.push([letters[i], letters[j], letters[k], letters[n]].join(''));
                                }
                            }
                        }
                    }
                }
            }
        }
    }

注: mission1表示處於匹配第一段密碼,以此類推。

完整的代碼

var morseCodeMap = [
    '.-', '-...', '-.-.', '-..',
    '.',  '..-.', '--.', '....',
    '..', '.---', '-.-', '.-..',
    '--', '-.', '---', '.--.',
    '--.-', '.-.', '...', '-',
    '..-', '...-', '.--', '-..-',
    '-.--', '--..'
], 
secretCode = '.--..-......',
morseCodeNum = morseCodeMap.length,
letters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; 

var result = [],
    firstMatchPart,
    secondMatchPart,
    thirdMatchPart,
    fourthMatchPart,
    mission1,
    mission2,
    mission3,
    mission4;

function deCodeMorse(){
    var i, j, k, n;
    mission1 = secretCode;
    for(i = 0; i < morseCodeNum; i ++){
        if(mission1.indexOf(morseCodeMap[i]) === 0 ){
            firstMatchPart = morseCodeMap[i];
            mission2 = secretCode.slice(firstMatchPart.length);

            for(j = 0; j < morseCodeNum; j ++){

                if(mission2.indexOf(morseCodeMap[j]) === 0 ){
                    secondMatchPart = morseCodeMap[j];
                    mission3 = secretCode.slice(firstMatchPart.length+secondMatchPart.length);

                    for(k = 0; k < morseCodeNum; k ++){
                        if(mission3.indexOf(morseCodeMap[k]) === 0 ){
                            thirdMatchPart = morseCodeMap[k];
                            mission4 = secretCode.slice(firstMatchPart.length+secondMatchPart.length+thirdMatchPart.length);

                            for(n = 0; n < morseCodeNum; n ++){
                                if(mission4 === morseCodeMap[n]){
                                    fourthMatchPart = morseCodeMap[n];
                                    console.log([firstMatchPart, secondMatchPart, thirdMatchPart, fourthMatchPart].join(''));
                                    result.push([letters[i], letters[j], letters[k], letters[n]].join(''));
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}

deCodeMorse();
console.log(result);

獲得結果以下,根據圖片中的提示,該單詞與面試有關,那麼應該是pass無疑。
圖片描述

上面的代碼咱們用了4層for嵌套循環,確實有點多,可是隻有if條件成立,纔會進入深層的循環。由於要求全部解,是避免不了的.

延伸

假如,咱們獲得的密碼可能不是4段,不肯定是幾段,這個時候就不能用嵌套for循環了,能夠用遞歸。
核心代碼邏輯

function deCodeMorse(mission[j]){
    for (var i = 0; i < morseCodeNum; i++) {
        if( morseCode.indexOf(morseCodeMap[i]) === 0 ){
            if( morseCode === morseCodeMap[i]){
                // 輸出匹配結果
            }else{
                deCodeMorse(mission[j+1]);
            }
        }
    }
}

使用遞歸的完整代碼

var morseCodeMap = [
        '.-', '-...', '-.-.', '-..',
        '.',  '..-.', '--.', '....',
        '..', '.---', '-.-', '.-..',
        '--', '-.', '---', '.--.',
        '--.-', '.-.', '...', '-',
        '..-', '...-', '.--', '-..-',
        '-.--', '--..'
    ], 
    secretCode = '.--..-......',
    morseCodeNum = morseCodeMap.length,
    letters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
    result = [],


function deCodeMorse(morseCode, deCodeResult, stack){
    stack = stack || [];
    for (var i = 0; i < morseCodeNum; i++) {
        if( morseCode.indexOf(morseCodeMap[i]) === 0 ){
            if( morseCode === morseCodeMap[i]){
                deCodeResult.push(stack.concat(letters[i]).join(''));
            }else{
                deCodeMorse(morseCode.slice(morseCodeMap[i].length), deCodeResult, stack.concat(letters[i]));
            }
        }
    }
}

deCodeMorse(secretCode, result);
console.log(result);

咱們還能夠傳一個數字參數給函數deCodeMorse,表示密碼由幾段組成,不傳則沒有限制。那麼deCodeMorse函數能夠這樣寫

function deCodeMorse(morseCode, deCodeResult, limit, stack){
    stack = stack || [];
    for (var i = 0; i < morseCodeNum; i++) {
        if( morseCode.indexOf(morseCodeMap[i]) === 0 ){
            if( morseCode === morseCodeMap[i]){
                if(limit){
                    stack.length +1 === limit && deCodeResult.push(stack.concat(letters[i]).join(''));
                }else{
                    deCodeResult.push(stack.concat(letters[i]).join(''));
                }
            }else{
                if(limit){
                    if(stack.length < limit){
                        deCodeMorse(morseCode.slice(morseCodeMap[i].length), deCodeResult, limit, stack.concat(letters[i]));
                    }
                }else{
                    deCodeMorse(morseCode.slice(morseCodeMap[i].length), deCodeResult, limit, stack.concat(letters[i]));
                }
                
            }
        }
    }
}

deCodeMorse(secretCode, result, 4);
相關文章
相關標籤/搜索