z作业2

71 阅读2分钟

大数相加溢出问题

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        function add(a, b) {
            // 看看两个字符串长度相差多少,小的在前面补0, 如 10000 和 1, 补0后为 10000 和 00001
            let leng = Math.abs(a.length - b.length);
            if (a.length > b.length) {
                b = Array(leng).join('0') + '0' + b;
            } else if (a.length < b.length) {
                a = Array(leng).join('0') + '0' + a;
            }
            // 将字符串转化为数组并且倒装,如同小学加法从个位开始算起
            let textArrA = a.split('').reverse(),
                textArrB = b.split('').reverse(),
                resultArr = [];

            // 对数组进行循环
            for (let i = 0; i < a.length; i++) {
                // 求和,和小于10,则将和放进目标数组,若大于10,将除以10将余数放进目标数组,然后textArrA数组的下一位 + 1(textArrB数组也可以,选一个即可)
                let sum = parseInt(textArrA[i]) + parseInt(textArrB[i]);

                // 这里判断是否是最高位数值相加,即i === a.length - 1, 如果是不用取余直接放进去
                if (parseInt(sum / 10) === 0 || i === a.length - 1) {
                    resultArr.push(sum);
                } else {
                    resultArr.push(sum % 10);
                    textArrA[i + 1] = parseInt(textArrA[i + 1]) + 1;
                }
            }
            // 最后将目标数组倒装一下,再转成字符串
            return resultArr.reverse().join('');
        }

        console.log(add('1045747', '10000')); 

       
    </script>
</body>

</html>

深拷贝浅拷贝

浅拷贝是创建一个新对象,这个对象有着原始对象属性值的一份精确拷贝。如果属性是基本类型,拷贝的就是基本类型的值,如果属性是引用类型,拷贝的就是内存地址 ,所以如果其中一个对象改变了这个地址,就会影响到另一个对象。

深拷贝是将一个对象从内存中完整的拷贝一份出来,从堆内存中开辟一个新的区域存放新对象,且修改新对象不会影响原对象。

bc49f5bb39107d941feb82ab92db64cb9a63581f.jpg@1320w_742h.webp

image.png

image.png

总而言之,浅拷贝只复制指向某个对象的指针,而不复制对象本身,新旧对象还是共享同一块内存。但深拷贝会另外创造一个一模一样的对象,新对象跟原对象不共享内存,修改新对象不会改到原对象。

深度优先遍历的思想可以分为以下几步:

指定一点为顶点,进行标记,并查找该节点的任意一个相邻节点。

若该相邻节点未被访问,则对其进行标记,并进入递归,查找它的未被标记访问的邻接节点;若该节点已被访问标记,则回退到上级节点,查找它未被标记访问的邻接节点,再进入递归,直到与起点相通的全部顶点都被标记访问为止。

若所有节点都被标记访问,就结束;反之,如果还有节点未被访问,则需要以该节点为顶点进行下一步的递归查找,直到所有点都被标记访问。

广度优先遍历

又称为"宽度优先搜索"或"横向优先搜索",简称 BFS。它的实现思想是:从一点出发,查出它的邻接节点放入队列并标记,然后从队列中弹出第一个节点,寻找它的邻接未被访问的节点放入队列,直至所有已被访问的节点的邻接点都被访问过;若图中还有未被访问的点,则另选一个未被访问的点出发,执行相同的操作,直至图中所有节点都被访问。