• 前端笔试算法题,提高笔试存活率!(持续更新)


    一、前言

     1. 校招笔试马上开始,整理一些算法题一起学习.
     2. 我统一使用Javscript(V8/Node)解答,都已经调试通过.
     3. 一起加油!一起进步!
    

    二、题目

    • 字符串拼接
      提交链接:字符串拼接
      题目:
          不借用任何字符串库函数实现无冗余地接受两个字符串,然后把它们无冗余的连接起来。
      输入描述:
          每一行包括两个字符串,长度不超过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;
    }
    
  • 相关阅读:
    poj1877
    poj2163
    API hook 单步调试
    用VC++编写勾子程序(转)
    不使用DLL创建全局系统钩子
    接触DLL编写并实现线程注入和全局钩子
    根据RGB计算亮度
    !!!光线对视频识别技术的影响
    消息钩子函数入门篇
    “蓝脑”计划:人造大脑的可能性 文化·探索 CCTV_com
  • 原文地址:https://www.cnblogs.com/soyxiaobi/p/9426168.html
Copyright © 2020-2023  润新知