前端筆試算法題,提升筆試存活率!(持續更新)

1、前言

1. 校招筆試立刻開始,整理一些算法題一塊兒學習.
 2. 我統一使用Javscript(V8/Node)解答,都已經調試經過.
 3. 一塊兒加油!一塊兒進步!

2、題目

  • 字符串拼接
    提交連接:字符串拼接
    題目:
        不借用任何字符串庫函數實現無冗餘地接受兩個字符串,而後把它們無冗餘的鏈接起來。
    輸入描述:
        每一行包括兩個字符串,長度不超過100。
    輸出描述:
        可能有多組測試數據,對於每組數據,
示例1
   輸入
     abc def
   輸出
     abcdef
/*
*解題思路:這道題目比較簡單,只須要把字符串分割成數組去掉空格後,再拼接在一塊兒轉換成字符串便可
*/
let readline = require('readline');
let rl =  readline.createInterface({
    input:process.stdin,    //輸入流
    output:process.stdout   
})
let str = '';
rl.on('line',function(input){
    let strArr = input.trim().split(' ');   //trim()清空先後的空格.
    //split(' '),從字符串的空格切分紅數組 'abc def'變成['abc','def']
    if(strArr.length == 2){
        str = strArr[0] + strArr[1];
        console.log(str);
        return str;
    }
    
})
  • 查找重複元素
    提交連接:查找重複元素
    題目:
       找出數組 arr 中重複出現過的元素
示例1
  輸入
    [1, 2, 4, 4, 3, 3, 1, 5, 3]
  輸出
    [1, 3, 4]
/**
*解題思路:新建一個數組用來存放重複的元素。利用indexOf(元素)獲取數組元素下標,若是返回非-1的數,說明存在這個元素,添加到新數組中。只須要用自身去和後面的元素對比便可,前面的數已經在前面循環的時候對比過了。
*/
function duplicates(arr) {
    let optArr = [];    //新數組
    for(var i=0;i<arr.length;i++){
        let jugleArr = arr.slice(i+1,arr.length);   //獲取自身值後面的全部元素
        //slice(start,end)返回相應位置的元素,slice方法不改變原數組。
        
        //先判斷jugleArr數組裏的全部元素是否和arr[i]重複
        //若有,再判斷當前元素是否加入了optArr,如沒有,返回-1
        if(jugleArr.indexOf(arr[i]) != -1 && optArr.indexOf(arr[i]) == -1){
            optArr.push(arr[i]);
        }
    }
    console.log(optArr);    //[1,4,3]
    return optArr;
}
duplicates([1,2,4,4,3,3,1,5,3]);
請實現一個函數,將一個字符串中的每一個空格替換成「%20」。
例如,當字符串爲We Are Happy.
    則通過替換以後的字符串爲We%20Are%20Happy
/*
*解題思路:利用簡單的正則獲取空格,而且替換成%20便可。
        部分正則規則:/g 匹配全部符合條件的元素.  \d:表示數字  ^:表示開頭   $:表示結尾   +:匹配多個
        例如: ^\d+$ 匹配的字符串只能是數字
*/
let readline = require('readline');

let rl = readline.createInterface({
    input:process.stdin,
    output:process.stdout
})

rl.on('line',function(input){
    // let result = deal(input);
    let result = input.trim().replace(/ /g,'%20');  //replace(獲取值,替換值)  
    console.log(result);
    
    return result;
})
  • 求最大值和最小值
    提交連接:求最大值和最小值
    題目:
        輸入N個(N<=10000)數字,求出這N個數字中的最大值和最小值。每一個數字的絕對值不大於1000000。
    輸入描述:
        輸入包括多組測試用例,每組測試用例由一個整數N開頭,接下去一行給出N個整數。
    輸出描述:
        輸出包括兩個整數,爲給定N個數中的最大值與最小值。
示例1
    輸入
        5
        1 2 3 4 5
        3
        3 7 8
    輸出
        5 1
        8 3
/*
* 解題思路:能夠利用Math的max和min方法判斷,可是注意:max和min不支持數組,支持多個值傳入.能夠利用apply解決
*/
let readline = require('readline');
let rl = readline.createInterface({
    input:process.stdin,
    output:process.stdout,
})
let num = 0;
rl.on('line',function(input){
    //初始值是整數長度.賦值給num
    if(num == 0){
        num = input.trim();//去除先後的空格
    }
    else{
        let iptArr = input.split(' ')
        if(iptArr.length == num){
            let maxNum = Math.max.apply(null,iptArr)//Math.min(),Math.max(),其參數不能是數組,而是單個元素值
            let minNum = Math.min.apply(null,iptArr)//apply能夠將一個數組默認的轉換爲一個參數列表([param1,param2,param3] 轉換爲 param1,param2,param3)
            let result = maxNum + ' ' + minNum;
            console.log(result);
            return result
        }
   }
})
  • 統計字符
    提交連接:統計字符
    題目描述:
        給定一個英文字符串,請寫一段代碼找出這個字符串中首先出現三次的那個英文字符(須要區分大小寫)。
    輸入描述:
        輸入數據一個字符串,包括字母,數字等。
    輸出描述:
        輸出首先出現三次的那個英文字符
示例1
    輸入
        Have you ever gone shopping and
    輸出
        e
/*
*  解題思路:能夠利用對象的屬性添加新字符,值則是這個字符的出現的次數.
*  對象添加屬性(key): 對象[屬性名]:value
*  
*  擴展:對象屬性 經過點(.) 和方括號([]) 的不一樣之處:
*  經過點運算符(.)方法對象屬性時,屬性名用一個標識符來表示。標識符必須直接出現再js程序中,它們不是數據類型,所以程序沒法修改它們。

    反過來說,當經過[]來方式對象的屬性時,屬性名經過字符串表示。字符串是js的數據類型,再程序運行時能夠修改和建立它們。
*/

let readline = require('readline');
let rl = readline.createInterface({
    input:process.stdin,
    output:process.stdout
})

rl.on('line',function(input){
    let result = deal(input.trim());
    // console.log(result);
    return result;
})

function deal(input){
    let object = {};
    let reg =  /[a-zA-z]+/;  //英文字母的正則表達式,題目要求最早出現三次的英文字母
    for(let i=0;i<input.length;i++){
        //若是是英文字母,則進行下一步
        if(reg.test(input[i])){
            if(!object[input[i]]){
            //若是不存在字符
            object[input[i]] = 1;
            }
            else{
                object[input[i]]++;
            }
            //若是字符數量超過三個
            if(object[input[i]] == 3){
                console.log(input[i])//輸出這個字符
                return input[i]
            }
        }
    }
}
  • 下廚房
    提交連接:下廚房
    題目描述
        牛牛想嘗試一些新的料理,每一個料理須要一些不一樣的材料,問完成全部的料理須要準備多少種不一樣的材料。
    輸入描述:
        每一個輸入包含 1 個測試用例。每一個測試用例的第 i 行,表示完成第 i 件料理須要哪些材料,各個材料用空格隔開,輸入只包含大寫英文字母和空格,輸入文件不超過 50 行,每一行不超過 50 個字符。
    輸出描述:
        輸出一行一個數字表示完成全部料理須要多少種不一樣的材料。
示例1
    輸入
        BUTTER FLOUR
        HONEY FLOUR EGG
    輸出
        4
/*
*   解題思路:
            1.由於題目沒有要求輸入多少組數據,因此不能擅自要求用戶輸入多少組數據
            2.總共料理數量:i.length,但一樣的料理只算一種材料.能夠建立一個新的數組,放入新材料,經過indexOf判斷是否已經添加
*/

let readline = require('readline');

let rl = readline.createInterface({
    input:process.stdin,
    output:process.stdout
})
let iArr = [];

rl.on('line',function(input){
    if(input === 'end'){
    //須要用戶輸入end判斷是否輸入完成
        rl.close();
    }
    iArr.push(input.trim());
})

rl.on('close',function(){
    let result = 0;
    result = deal(iArr);
    console.log(result);
    return result;
})

function deal(iArr){
    let allArr = [];
    for(let i=0;i<iArr.length;i++){
       iArr[i].split(' ').map(item => {     
           if(allArr.indexOf(item) == -1){  //檢查是否已經添加過
               allArr.push(item)
           }
       }); 
    }
    // console.log(allArr);
    return allArr.length;
}
相關文章
相關標籤/搜索