• 算法(递归)---写的很乱


    前言
    本周花了大量的时间再研究算法,这个东西不是一下子就能搞懂的,可能花了大量的时间的看不到见效,也就是得不到一些有效的反馈,这也是我现在比较苦恼的问题,是继续先研究数据结构和算法,还是直接刷leetcode呢?我也不清晰,两眼摸黑,能怎么办呢?学呗,没准一年后就入门了,每天啃一点,没准哪天突然领悟了,后面就会轻松一些

    特点

    • 找重复
    • 找变化
    • 找边界

    所有的循环都可以改成递归

    查找一定区域的范围值
    const f2=(a,b)=>{
        if(a>b) return;
        console.log(a);
        return f2(a + 1, b);
    };
    
    对数组求和
    const f1=(a,b=0)=>{
        if(a.length-1==b) return a[b];
        return a[b]+f1(a,b+1);
    };
    console.log(f1([1, 2, 3]));
    
    字符串倒序
    const s1=(a,b=0)=>{
        if(b == 0 ) return a.charAt(0);
        return a.charAt(b) + s1(a, b - 1);
    };
    console.log(s1('123456789',2));
    
    const reverse(str)=>{
        if(str.length<=1) return str;
        return reverse(str.slice(1))+str[0];
    }
    
    一串字符串,是否有两个字符相等
    const isPalindrome=(str)=>{
        if(str.length) return true;
        if(str.length==2) return str[0] == str[1];
          if(str[0]==str.slice(-1)){
              return isPalindrome(str.slice(1))
          }
    };
    console.log(isPalindrome('aka'));
    
    数组扁平化
    const flatten = arr => arr.reduce((acc, val) => {
        return acc.concat(Array.isArray(val) ? flatten(val) : val);
    }, []);
    
    接受一个对象,这个对象的值是偶数,让其想加
    
    let obj = {
        a: 1,
        b: 2,
        c: {d: 3},
        e: {f: {g: 6}},
        t: {f: {g: {f:10}}},
    };
    const objSum = obj => {
        let sum = 0;
        for (let key in obj) {
            if (typeof obj[key] == 'object') {
                sum += objSum(obj[key])
            } else if (typeof obj[key] == 'number' && obj[key] % 2 == 0) {
                sum += obj[key];
            }
        }
        return sum
    };
    console.log(objSum(obj));
    
    const reduceSum=obj=>
        Object.values(obj).
        reduce((acc,val)=>
            typeof val=='object'?
                acc+reduceSum(val):
                acc+val,0);
    
    

    汉诺塔

    讲A柱子上n-1个盘子暂时移到B柱子上

    A柱子只剩下最大的盘子,把他移到目标柱子C上

    最后再将B柱子上的n-1个盘子移到目标C上

    参数
    最大编号   初始柱子    辅助的柱子    目标的柱子
    const hanoi = (n, a, b, c) => {
        if (n == 1) {
            //a到c
            // move(a, c);
            console.log('Move' + n + ' ' + a + ' ' + c);
        } else {
            // a绕过c放到b
            hanoi(n - 1, a, c, b);
            // move(a, c);
            console.log('Move' + n + ' ' + a + ' ' + c);
            //b绕过a放到c
            hanoi(n - 1, b, a, c);
        }
    };
    console.log(hanoi(3, 'a', 'b', 'c'));
    

    二分查找递归

    左边找(递归)

    中间比

    右边找(递归)

    //在一定范围内L R 求最大值
    const getMax=(arr,L,R)=>{
        if(L==R) return arr[L];
        let mid=Math.floor((L+R)/2);
        let maxLeft = getMax(arr, L, mid);
        let maxRight = getMax(arr, mid + 1, R);
        return Math.max(maxLeft, maxRight);
    };
    let arr = [1, 3, 44, 5, 6, 7, 8];
    console.log(getMax(arr, 0, arr.length-1));
    

    希尔排序

    归并排序

    举例说明
    [9, 3, 6, 4]
    [9, 3] | [6, 4]
    [9] | [3] [6] | [4]
    [3, 9] | [4, 6]
    [3, 4, 6, 9]
    我们把数组拆分成多个最小的块,可以利用slice方法来实现
    
    //  排序合并
    const merge=(left,right)=>{
        let result=[];
        while (left.length > 0 && right.length > 0) {
            if (left[0] < right[0]) {
                result.push(left.shift())
            }else{
                result.push(right.shift())
            }
        }
        /*把长度不一样的连接起来*/
        return result.concat(left).concat(right)
    }
    //拆开
    const mergeSort=array=>{
        if(array.length<2) return array;
        let mid = Math.floor(array.length / 2)
        let left = array.slice(0, mid);
        let right = array.slice(mid);
        return merge(mergeSort(left), mergeSort(right))
    }
    console.log(mergeSort([1, 2, 3, 4, 200, 1, 2, 3]))
    

    基于比较的排序

    每一个元素都像一个黑盒子

    不需要准备的知道每个元素究竟是什么

    只需要能够两两比较他们的大小

    插入 比较 冒泡 合并 快速 分块

    [1,2,3].sort((a,b)=>a-b)

    快速排序

    类似合并排序--相同点-- 分治策略

    先找到一个基准点(一般指数组的中部),然后数组被该基准点分为两部分,依次与该基准点数据比较,如果比它小,放左边;反之,放右边。

    const quickSort=arr=>{
        if(arr.length<=1) return arr;
        let pivotIndex = Math.floor(arr.length / 2)
        //取中心点
        let pivot=arr.splice(pivotIndex,1)
        let left=[];
        let right=[];
        for (let i = 0; i < arr.length; i++) {
            if (arr[i] < pivot) {//小的放左边
                left.push(arr[i])
            }else{
                right.push(arr[i])
            }
        }
        return quickSort(left).concat(pivot, quickSort(right))
    }
    

    计数排序

    非比较型排序

    一般用于范围小于100的排序

    时间复杂度为O(n),空间复杂度为数组的数字范围

    太变态了,无法理解!!!!

    基数排序

    每一个元素对应位置上数字的大小进行排序:个位与个位,十位与十位...

    看得我头皮发麻,算了,来点轻松的东西

    ||的妙用

    去重(直接保留刚开始的第0项)
    const uniq=array=>array.sort((a, b) => a - b)
        .filter((item,index,array)=>!index||item!==array[index-1])
    

    Attribute 和 Property 的区别

    "Attribute" 是在html中定义的,而"property" 是在DOM上定义的

    说明区别
    <input type="text" value="Hello">
    const input = document.querySelector('input');
    console.log(input.getAttribute('value')); // Hello
    console.log(input.value); // Hello
    
    console.log(input.getAttribute('value')); // Hello
    console.log(input.value); // Hello World!
    
  • 相关阅读:
    Linux下安装软件遇见的问题汇总
    使用AlarmManager定期执行工作
    android打开文件、保存对话框、创建新文件夹对话框(转载)
    一些算法的整理
    安卓adb调试命令常见的问题
    java下的串口通信-RXTX
    Unity 协程运行时的监控和优化
    Unity3D 协程的介绍和使用
    游戏服务器:到底使用UDP还是TCP
    Unity 可重复随机数
  • 原文地址:https://www.cnblogs.com/fangdongdemao/p/11073556.html
Copyright © 2020-2023  润新知