前端常见的算法题

一、 查找字符串中的最长公共前缀

    // ⽰例: 输⼊: [“flower”,“flow”,“flight”] 输出: “fl”
    <script>
    var arr = ['flower', 'flow', 'flight']
    var result = ''
    for (var i = 0; i < arr[0].length; i++) {
      
            
        for (var j = 1; j < arr.length; j++) {
      
      
            if (arr[0][i] != arr[j][i]) {
      
      
                break;
            } else if (arr[0][i] == arr[j][i] && j == arr.length - 1) {
      
      
                result += arr[0][i]
            }
        }
    }
    console.log(result)
</script>

二、给定⼀个按照升序排列的整数数组 nums,和⼀个⽬标值 target。找出给定⽬标值在数组中的开始位置和结束位置。 如果数组中不存在⽬标值,返回 [-1, -1]。

 <script>
        // 给定⼀个按照升序排列的整数数组 nums,和⼀个⽬标值 target。找出给定⽬标值在数组中的开始位置和结束位置。 如果数组中不存在⽬标值,返回 [-1, -1]。
        // ⽰例:
        // 输⼊: nums = [5, 7, 7, 8, 8, 10], target = 8, 输出:[3, 4] 输⼊: nums = [5, 7, 7, 8, 8, 10], target = 6, 输出:[-1, -1] 思路: 1. 开始位置 indexOf 2. 结束位置: 翻转数组, 求arr.length - (indexOf + 1)
        // 法(一)
        // function fn(num) {
      
      
        //     var nums = [5, 7, 7, 8, 8, 10]
        //     var arr = []
        //     for (var i = 0; i < nums.length; i++) {
      
      
        //         if(num == nums[i]){
      
      
        //             arr.push(i)
        //         }
        //     }
        //     var arr2 = []
        //     arr2.push(arr[0])
        //     arr2.push(arr[arr.length-1])
        //     console.log(arr2,'arr2-----------')
        // }
        // fn(8)

        // 法(二)
        function fn(num) {
      
      
            var nums = [5, 7, 7, 8, 8, 10]
            var arr = []
            var first = nums.indexOf(num)
            arr.push(first)
            var newnums = nums.reverse()
            console.log(newnums)
            var end = newnums.indexOf(num)
            arr.push(newnums.length-end-1)
            console.log(arr)
        }
        fn(8)
    </script>

三、 回⽂ 是指把相同的词汇或句⼦, 在下⽂中调换位置或颠倒过来, 产⽣⾸尾回环的情趣, 叫做回⽂,也叫回环。

 <script>
        // 思路: 将字符串转换成数组, 使用reverse方法对数组进行颠倒,判断颠倒后的两个字符串是否相同
        function fn(str){
      
      
            var arr = str.split('')
            var arr2 = arr.reverse()
            if(str == arr2.join('')){
      
      
                console.log(str,'是回文数')
            }else{
      
      
                console.log(str,'不是回文数')
            }
        }
        fn('159951')
    </script>

四、去掉⼀组整型数组重复的值 ⽐如输⼊: [1,13,1,24,11,11,14,1,2] 输出: [1,13,24,11,14,2] 需要去掉重复的11 和 1 这两个元素。

<script>
        // 示例:去掉⼀组整型数组重复的值 ⽐如输⼊: [1,13,1,24,11,11,14,1,2] 输出: [1,13,24,11,14,2] 需要去掉重复的11 和 1 这两个元素。
        // 法一
        // function fn(arr) {
      
      
        //     var newarr = []
        //     for (var i = 0; i < arr.length - 1;) {
      
      
        //         for (var j = i + 1; j < arr.length;) {
      
      
        //             if (arr[i] == arr[j] && j != (arr.length - 1)) {
      
      
        //                 arr.splice(j, 1)
        //             } else if (arr[i] == arr[j] && j == (arr.length - 1)) {
      
      
        //                 arr.splice(j, 1)
        //                 i++;
        //                 break;
        //             } else if (arr[i] != arr[j] && j != (arr.length - 1)) {
      
      
        //                 j++;
        //             } else if (arr[i] != arr[j] && j == (arr.length - 1)) {
      
      
        //                 i++;
        //                 break;
        //             }
        //         }
        //     }
        //     console.log(arr)
        // }
        // var arr = [1, 13, 1, 24, 11, 11, 14, 1, 2, 8, 13,1]
        // fn(arr)

        //  法二
        // function fn(arr) {
      
      
        //    var arr2 = new Set(arr)
        //    arr = [...arr2]
        //    console.log(arr,'arr-----')
        //    console.log([...arr])
        // }
        // var arr = [1, 13, 1, 24, 11, 11, 14, 1, 2, 8, 13,1]
        // fn(arr)

        // 法三
        function fn(arr) {
      
      
            let obj = {
      
      }
            for (var i = 0; i < arr.length;i++) {
      
      
                obj[arr[i]] = arr[i]
            }
            console.log(Object.values(obj), 'obj------------')
        }
        var arr = [1, 13, 1, 24, 11, 11, 14, 1, 2, 8, 13, 1]
        fn(arr)
    </script>

五、统计⼀个字符串出现最多的字母

 <script>
        // 统计⼀个字符串出现最多的字母
        function fn(str){
      
      
            var arr = str.split('')
            let obj = {
      
      }
            for(var i=0;i<arr.length;i++){
      
      
                if(arr[i] in obj){
      
      
                    obj[arr[i]]++
                }else{
      
      
                    obj[arr[i]] = 1
                }
            }
            console.log(obj,'obj---------')
            let arr2 = []
            for(key in obj){
      
      
                arr2.push(obj[key])
            }
            //排序(由大到小)
            var temp
            for(var i=0;i<arr2.length;i++){
      
      
                for(var j=i+1;j<arr2.length;j++){
      
      
                    if(arr2[j]>=arr2[i]){
      
      
                        temp = arr2[i]
                        arr2[i] = arr2[j]
                        arr2[j] = temp
                    }
                }
            }
            console.log(arr2)
            console.log(arr2[0])//出现最多的次数
            //去obj查找key
            let str2 = ''
            for(key in obj){
      
      
                if(obj[key] == arr2[0]){
      
      
                    str2 = key
                }
            }
            console.log(str2)//出现次数最多的字符


        }

        var str = 'helloooolllworldee'
        fn(str)
    </script>

六、不借助临时变量,进⾏两个整数的交换

<script>
    var a = 18
    var b = 11
    b = b - a //差  7
    a = a+b //此时的大数 = 小数+差
    b = a - b //此时的小数 = 大数-差
    console.log(a)
    console.log(b)
 </script>

七、给定一个数字,获取斐波那契数列

        function fn(n) {
            let arr = []
            let i = 0
            while (i < n) {
                if (i <= 1) {
                    arr.push(i)
                } else {
                    arr.push(arr[i - 1] + arr[i - 2])
                }
                i++
            }
            return arr
        }
        fn(20)

八、计算出下列正数组的最⼤差值⽐如: 输⼊ [10,5,11,7,8,9] 输出 6

//思路:获取数组最大值、最小值,他们的差值就是最大差值
 function fn(arr) {
            for (var i = 0; i < arr.length; i++) {
                for (var j = i + 1; j < arr.length; j++) {
                    let temp
                    if (arr[i] >= arr[j]) {
                        temp = arr[j]
                        arr[j] = arr[i]
                        arr[i] = temp
                    }
                }
            }
            console.log(arr)//升序数组
            //最大值-最小值
            var value = arr[arr.length-1]-arr[0]
            console.log(value)
        }

        let arr = [10, 5, 11, 7, 8, 9]
        fn(arr)

九、关于随机数的三个小题目
①.随机生成指定长度的字符串
②.获取指定范围内的随机数
③.随机获取数组中的元素

<script>
    // 一、随机⽣成指定长度的字符串
    // function fn(number){
      
      
    //     var arr = []
    //     for(var i=0;i<number;i++){
      
      
    //        console.log(Math.random().toString(36).slice(-number))
    //     }
    // }
    // fn(8)

    // 二、获取指定范围内的随机数
    // function fn2(number1,number2){
      
      
    //     var sub = number2-number1+1
    //     var number =  Math.floor(Math.random()*sub + number1);
    //     console.log(number)
    // }

    // fn2(2,5)

    // 三、随机获取数组中的元素
    var arr = ['s','j','h','e','l','r','e','l']
    var temp = arr.length
    console.log(arr[Math.floor(Math.random()*temp)])
    
    </script>

十、打乱数字数组的顺序

<script>
        // 法一
        // function fn(arr) {
      
      
        //     let obj = {}
        //     let num = arr.length
        //     for(var i=0;i<arr.length;i++){
      
      
        //         let randomnum = Math.floor(Math.random()*num)//0-12之间的随机数
        //         let temp
        //         temp = arr[randomnum]
        //         arr[randomnum] = arr[i]
        //         arr[i] = temp
        //     }
        //     console.log(arr)
        // }

        //法二
        function fn(arr) {
      
      
            var len = arr.length;
            var arr2 = new Array();
            for (var i = len; i > 0; i--) {
      
      
                var rand = Math.floor(Math.random() * i);
                arr2.push(arr[rand]);
                arr.splice(rand, 1);
            }
            return arr2;
        }

        var arr = [1, 2, 3, 4, 5, 6, 7, 'a', 'dsfs', 8, 9, 'v'];
        fn(arr)
    </script>

十一、对象转换为数组

<script>
        // 对象转换为数组
        // 法一
        function fn(obj){
      
      
            var arr = []
            for(key in obj){
      
      
                let obj2={
      
      
                    key:obj[key]
                }
                arr.push(obj2)
            }
            console.log(arr)
        }
        let obj = {
      
      
            name: 'zs',
            age: 18,
            sex: '男'
        }
        fn(obj)
    </script>

十二、验证是否为数组

<script>
    function fn(arr){
      
      
        console.log(arr instanceof(Array))
        console.log(Object.prototype.toString.call(arr) === '[object Array]')
    }
    let arr = [1,2,3,4,5]
    fn(arr)
</script>

十三、保留指定⼩数位

<script>
    var num =3.8899;
    num = num.toFixed(2); // 4.3457 第四位⼩数位以四舍五⼊计算
    console.log(num)
</script>

十四、找出数组中出现次数最多的元素,并给出其出现过的位置

    <script>
        function fn(arr) {
      
      
            let obj = {
      
      }
            for (var i = 0; i < arr.length; i++) {
      
      
                if (arr[i] in obj) {
      
      
                    obj[arr[i]]++
                } else {
      
      
                    obj[arr[i]] = 1
                }
            }
            console.log(obj, 'obj------------')
            let max = 0
            let newarr = [] //包含所有出现次数最多的数
            for (key in obj) {
      
      
                console.log(obj[key], 'key-----------')
                if (obj[key] > max) {
      
      
                    max = obj[key]
                    console.log(max, 'max--------------')
                    newarr = [key]
                } else if (obj[key] == max) {
      
      
                    newarr.push(key)
                }
            }
            console.log(newarr, 'newarr----------')
            let maxarrs = []//以key,value的形式,元素为key,位置为value形成一个数组
            for (var i = 0; i < newarr.length; i++) {
      
      
                let obj2 = {
      
      }
                obj2[newarr[i]] = []
                for (var j = 0; j < arr.length; j++) {
      
      
                    if (newarr[i] == arr[j]) {
      
      
                        console.log(newarr[i] + '出现的位置是:' + j)
                        obj2[newarr[i]].push(j)
                    }
                }
                maxarrs.push(obj2)
            }
            console.log(maxarrs,'maxarrs------------')
            maxarrs.map((item) => {
      
      
                for (key in item) {
      
      
                    console.log(key + '出现的位置是:' + item[key].join(','))
                }
            })

        }
        let arr = [1, 5, 8, 5, 46, 4, 9, 8, 1, 4]
        fn(arr)
    </script>

十五、给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。

<script>
        // 输入: nums = [1, 3, 5, 6], target = 3
        // 输出: 1
        function fn(arr,num){
      
      
            console.log(arr,'arr-----')
            for(var i=0;i<arr.length;i++){
      
      
                if(arr[i-1]<num && arr[i]>num){
      
      
                    arr.splice(i,0,num)
                }else if(arr[i] == num){
      
      
                    console.log(i,'索引为:',i)
                }
            }
            console.log('当前数组为:',arr)
        }

        let arr = [1,3,5,6,10]
        let num = 8
        fn(arr,num)
    </script>

十六、给定一个任意嵌套结构的对象如下,使用你熟悉的算法,将对象的属性按照层级输出到一个数组中

// 示例:obj = {
        //     a: {
        //                 b: {
        //                     c: {
        //                         d: 1
        //                     }
        //                 }
        //             },
        //             e: 2,
        //             f: {
        //                 g: 3
        //             }
        //         }
        //         输出:result = [[a,e,f],[b,g],[c],[d]]
        function fn(obj, arr) {
            console.log('进入fn方法------')
            let arritem = []
            Object.keys(obj).forEach((item) => {
                arritem.push(item)
                if (arritem.length == Object.keys(obj).length) { //把所有的父亲加入了数组
                    arr.push(arritem)
                    console.log(arr, 'arr-----')
                    let newobj = {}
                    for (var i = 0; i < arritem.length; i++) {
                        console.log(obj, 'obj----')
                        if (Object.prototype.toString.call(obj[arritem[i]]) == '[object Object]') {
                            console.log(obj[arritem[i]], '28------------')
                            newobj[Object.keys(obj[arritem[i]])[0]] = Object.values(obj[arritem[i]])[0]
                        }
                        console.log(newobj, 'newobj-----')
                        if (i == arritem.length - 1) {
                            console.log(newobj)
                            Object.keys(newobj).forEach((item, index) => {
                                console.log(newobj, '------', Object.keys(newobj).length)
                                if (index == Object.keys(newobj).length - 1) {
                                    fn(newobj, arr)
                                }
                            })
                        }

                    }

                }
            })
            return arr

        }
        let arr = []
        let obj = {
            a: {
                b: {
                    c: {
                        d: 1
                    }
                }
            },
            e: 2,
            f: {
                g: 3
            }
        }
        console.log(fn(obj, arr))
        

十七、假设集合A={a, b},集合B={0, 1, 2},则两个集合的笛卡尔积为{(a, 0), (a, 1), (a, 2), (b, 0), (b, 1), (b, 2)}。求当A={a, b, …, n}, B={0, 1, 2, …, n}时的笛卡尔积.

<script>
        function fn(arr) {
      
      
            if (arr.length < 2) return arr[0] || [];
            let res = []
            res = arr.reduce(function (acc, cur) {
      
      
                console.log(acc, '--------', cur)
                res = []
                acc.forEach(c => {
      
      
                    cur.forEach(s => {
      
      
                        let t = [].concat(Array.isArray(c) ? c : [c]);
                        t.push(s)
                        res.push(t)
                    })
                })
                return res
            });
            console.log(res)
        }

        let A = [
            [{
      
      
                a: 1,
                b: 2
            }, 'c'],
            [1, 2, 3],
            [7, 8, 9]
        ]
        console.log(fn(A))
    </script>

十八、有一个数组arr = [a1d1, a2, a3, b1, b2, b3, c1, c2, c3…], 通过算法将数组进行拆分, 转化为如下格式的数组a1, b1, c1], [a2, b2, c2], [a3, b3, c3]并实现通用公式.

<script>
        function fn(arr) {
      
      
            let result = []
            let obj = {
      
      }
            arr.forEach(item => {
      
      
                let i = /\d*$/.exec(item)[0] //全局搜素item中的数字
                // console.log(/\d+/.exec(item))//返回第一个符合条件的值
                // console.log(item.replace(/[^0-9]/ig, ''))//返回所有的数字
                if (i in obj) {
      
      
                    obj[i].push(item)
                } else {
      
      
                    obj[i] = [item]
                }

            })
            for (key in obj) {
      
      
                result.push(obj[key])
            }
            console.log(result, 'result----------')
        }
        let arr = ['a158', 'a2', 'a3', 'b1', 'b2', 'b3', 'c1', 'c2', 'c3']
        fn(arr)
    </script>

十九、输入一个正数N, 输出所有和为N的连续正数序列. 例如输入15, 结果: [[1, 2, 3, 4, 5], [4, 5, 6], [7, 8]]

 <script>
        function fn(value) {
      
      
            let arrs = []
            var mid = parseInt(value/2)
            for (var i = 0; i <= mid;) {
      
      
                var sum = 0
                let arr = []
                for (var j = i + 1; j <= mid+1;) {
      
      
                    console.log(j,'j----------')
                    arr.push(j)
                    sum += j
                    if(j==mid+1){
      
      //若j已经达到了mid+1了,则结束循环
                        console.log('结束了---')
                        i=mid+1
                        break;
                    }else if (sum == value) {
      
      //若累加之和等于value了,则退出本次循环,继续执行外层循环
                        i++;
                        arrs.push(arr)
                        break;
                    }else if(sum<value && j<mid+1){
      
      //若累加之和小于value并且j还未自增到mid/2(因为考虑到复杂度以及性能,j最大就是mid+1)
                        j++
                    }else if(sum>value){
      
      //若累加之和大于value了,那么退出本次循环,继续执行外部循环
                        i++;
                        break;
                    }
                }
            }
            console.log(arrs,'arrs------------')
        }
        fn(15)
    </script>

Guess you like

Origin blog.csdn.net/qq_45791799/article/details/125384557