盘点一下笔试中遇到的编程题(持续更新)

441 阅读2分钟

1、输入出生日期,返回距离还有多少天生日

        function getDay(month,day){
            var now = new Date()  // 今天的日期
            var thisYear = now.getFullYear()  // 2022
            var birthday = new Date(thisYear,month-1,day)   //今年的生日

            // 判断今年的生日是否已经过了
            if(birthday < now){     // 生日已经过了,那就计算到明年的日期
                birthday.setFullYear(now.getFullYear()+1)
            }   
            let timeDec = birthday-now
            let getday = timeDec / (24*60*60*1000)
            return Math.ceil(getday)
        }
        let day = getDay(11,6)
        console.log("距离生日还有:" + day + "天");

2、格式化日期

        // 输入 formatDate(new Date(1409894060000), 'yyyy-MM-dd HH:mm:ss 星期w')
        // 输出 2014-09-05 13:14:20 星期五
        function formatDate(timeStamp,formatDate){
            // 补零
            function appendZero(data){
                if(data < 10){
                    data = '0' + data
                }
                return data;
            }
            let date = new Date(timeStamp * 1000)
            let obj = {
                yyyy: date.getFullYear(),
                MM: appendZero(date.getMonth() + 1),
                dd: appendZero(date.getDate()),
                HH: appendZero(date.getHours()),
                mm: appendZero(date.getMinutes()),
                ss: appendZero(date.getSeconds()),
                w: ()=>{
                    const arr = ['日','一','二','三','四','五','六']
                    return arr[date.getDay()]
                }
            }
            let res1 = formatDate.replace('yyyy',obj.yyyy)
            let res2 = res1.replace('MM',obj.MM)
            let res3 = res2.replace('dd',obj.dd)
            let res4 = res3.replace('HH',obj.HH)
            let res5 = res4.replace('mm',obj.mm)
            let res6 = res5.replace('ss',obj.ss)
            let res7 = res6.replace('w',obj.w)
            return res7

        }
        let str = formatDate('1403058804','yyyy-MM-dd HH:mm:ss 星期w')
        console.log(str)

        let arr = [2,4,5,3,5]
        let res = new Array(10).fill(null).map( (x,index) => index )
        console.log(res);

3、给一个字符串,循环输出每一个字符,当输出到最后一个字符时再从头开始

        function p(s){
            let i = 0
            return function an(){
                if(i == s.length) i = 0
                let res = s[i]
                i++
                return res
            }
        }
        let str = p('bar')
        console.log(str(),str(),str(),str(),str());

4、给一个数,判断该数是否是斐波那契数列里的一项,若是则返回第几项,若不是则返回-1

            function judge(n){
                let a = 1, b = 1, sum = 0, index = 1;
                while(sum < n){
                    sum = a + b    
                    a = b
                    b = sum
                    index++
                }
                return sum === n ? index : -1
            }
            let ans = judge(5)
            console.log(ans);

5、实现链式的加减乘除(myCalculator(1).add(12).minus(3).multi(10).div(5).getValue() === 20)(数字马力)

            function myCalculator(num){
                class cla {
                    constructor (val){
                        this.val = val
                    }
                    getValue (val) {
                        return this.val
                    }
                    add (newVal) {
                        this.val = this.val + newVal
                        return this
                    }
                    minus (newVal) {
                        this.val = this.val - newVal
                        return this
                    }
                    multi (newVal) {
                        this.val = this.val * newVal
                        return this
                    }
                    div (newVal) {
                        this.val = this.val / newVal
                        return this
                    }
                }
                let obj = new cla(num)
                return obj
            }
            console.log(myCalculator(121).add(1).minus(2).getValue());   // 120
            console.log(myCalculator(1).add(12).minus(3).multi(10).div(5).getValue());   // 20

6、搜索多个文件夹路径(字符串数组,例如['/usr/bin', '/etc/config']),查找是否有公共路径,若有则返回公共路径(字符串),否则返回 null

            function findParentDirectory(paths) {
                let arr = []
                paths.forEach(element => {
                    let a = element.split('/')
                    a.shift()
                    arr.push(a)     // 先把文件弄成一个二维数组
                });

                let res = []   // 存放相同路径的元素

                // 先来一个双重循环
                for(let i = 0; i < arr[0].length; i++){
                    let isTrue = true
                    for(let j = 0; j < arr.length-1; j++){
                        if(arr[j][i] !== arr[j+1][i]) {
                            isTrue = false;
                            break;
                        }
                    }
                    isTrue && res.push(arr[0][i])
                }

                if(res.length){         
                    return '/' + res.join('/')  // 拼接返回即可
                } else {
                    return null
                }

            }
            console.log(findParentDirectory(['/home/user/vue','/home/user/react','/home/user/angular']));
            // /home/user

7、若a * a + b * b === c * c,则称'a,b,c'为勾股数,找出比 n 小的所有勾股数(暴力解法)

            function gougu(n) {
                let arr = []
                for(let a = 3; a <= n; a++){
                    for(let b = a+1; b <= n; b++){
                        for(let c = b+1; c <= n; c++){
                            if(a*a + b*b == c*c){
                                arr.push(`${a},${b},${c}`)
                            }
                        }
                    }
                }
                return arr;
            }
            console.log(gougu(10));
            // ['3,4,5', '6,8,10']

8、以‘-’为分隔符,将第二个起的非空单词首字母转为大写

        function change(str){
            let sArr = str.split('-')
            if(sArr[0] == ''){
                sArr.shift()
            }
            for(let i = 0; i < sArr.length; i++){
                sArr[i] = sArr[i].slice(0,1).toUpperCase() + sArr[i].slice(1)
            }
            sArr[0] = sArr[0].slice(0,1).toLowerCase() + sArr[0].slice(1)
            return sArr.join('');
        }
        console.log(change('-webikt-border-image'));    // webiktBorderImage
        console.log(change('font-size'));   // fontSize

9、检查字符串中是否包含连续相同的字母

    function containsRepeatingLetter(str) {
        return /([a-zA-Z])\1/g.test(str);
    }
       console.log(containsRepeatingLetter('rattle'))   // true