TypeScript算法题实战——剑指 Offer篇(5)

news2024/11/17 3:02:52

目录

  • 一、平衡二叉树
    • 1.1、题目描述
    • 1.2、题解
  • 二、数组中数字出现的次数
    • 2.1、题目描述
    • 2.2、题解
  • 三、数组中数字出现的次数 II
    • 3.1、题目描述
    • 3.2、题解
  • 四、和为s的两个数字
    • 4.1、题目描述
    • 4.2、题解
  • 五、和为s的连续正数序列
    • 5.1、题目描述
    • 5.2、题解
  • 六、翻转单词顺序
    • 6.1、题目描述
    • 6.2、题解
  • 七、滑动窗口的最大值
    • 7.1、题目描述
    • 7.2、题解
  • 八、队列的最大值
    • 8.1、题目描述
    • 8.2、题解
  • 九、n个骰子的点数
    • 9.1、题目描述
    • 9.2、题解
  • 十、扑克牌中的顺子
    • 10.1、题目描述
    • 10.2、题解

一支笔,一双手,一道力扣(Leetcode)做一宿!

在本文中,我们将使用TypeScript来解决剑指offer的算法题。这些问题涵盖了各种各样的主题,包括数组、字符串、链表、树、排序和搜索等。我们将使用TypeScript的强类型和面向对象的特性来解决这些问题,并通过实际的代码示例来演示如何使用TypeScript来解决算法问题。

题目全部来源于力扣题库:《剑指 Offer(第 2 版)》本章节包括的题目有(难度是我个人感受的难度,非官方标准):

题目难度
平衡二叉树简单
数组中数字出现的次数中等
数组中数字出现的次数 II中等
和为s的两个数字简单
和为s的连续正数序列简单
翻转单词顺序简单
滑动窗口的最大值中等
队列的最大值中等
n个骰子的点数困难
扑克牌中的顺子简单

一、平衡二叉树

1.1、题目描述

输入一棵二叉树的根节点,判断该树是不是平衡二叉树。如果某二叉树中任意节点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。

在这里插入图片描述

在这里插入图片描述

1.2、题解

在递归计算左子树和右子树深度时,加上判断Math.abs(left - right) > 1,若>1则说明此时二叉树已经不平衡了,将全局变量res置为false

function isBalanced(root: TreeNode | null): boolean {
    let res = true;
    if(root == null)
        return true;
    getHeight(root);
    function getHeight(root: TreeNode | null):number{
        if(root == null)
            return 0;
        let left = getHeight(root.left);
        let right = getHeight(root.right);
        if(Math.abs(left - right) > 1)
            res = false;
        return Math.max(left, right) + 1;
    }
    return res;
};

二、数组中数字出现的次数

2.1、题目描述

一个整型数组 nums 里除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。

示例 1:

输入:nums = [4,1,4,6]
输出:[1,6] 或 [6,1]

示例 2:
输入:nums = [1,2,10,4,1,4,3,3]
输出:[2,10] 或 [10,2]

2.2、题解

首先想到的是哈希表法,维护一个哈希Mapkeynums[i]value为出现的次数:

function singleNumbers(nums: number[]): number[] {
    let myMap: Map<number, number> = new Map();
    for(let i = 0; i < nums.length; i++){
        myMap.set(nums[i], myMap.get(nums[i])? myMap.get(nums[i]) + 1 : 1)
    }
    let res = [];
    for(let i = 0; i < nums.length; i++) {
        if(myMap.get(nums[i]) == 1)
            res.push(nums[i]);
    }
    return res;
};

但是题目要求时间复杂度 O(N),空间复杂度 O(1),所以并不满足条件。
参考:https://leetcode.cn/problems/shu-zu-zhong-shu-zi-chu-xian-de-ci-shu-lcof/solutions/572857/jian-zhi-offer-56-i-shu-zu-zhong-shu-zi-tykom/?envType=featured-list&envId=xb9nqhhg
的异或方法来解答。

首先异或运算满足交换律 a⊕b=b⊕a,且a⊕a=0,那么如果题目只存在一个仅出现一次的数字,那么a⊕b⊕c⊕d⊕a⊕c⊕d = a⊕a⊕c⊕c⊕d⊕d⊕c = c,就可以完全求出出现一次的c,代码如下:

function singleNumbers(nums: number[]): number[] {
    let x = 0;
    for(let i = 0; i < nums.length; i++){
        x ^= nums[i];
    }
    console.log(x);
    return [1,2];
};

然而题目要求的是有两个仅出现一次的数,即a⊕b⊕c⊕d⊕a⊕c⊕d⊕z = b⊕z,此时x求得的是b和z异或运算的值。此时得出的x如果为00100,说明b和z在二进制上面倒数第三位不同,如果为00110,说明b和z在二进制上面倒数第二、三位都不同。

由于数组中有两个数出现一次,那么我们可以把数组分成两个子数组,子数组内部出现一次的数仅有一个再进行异或,就可以得出答案,要将数组分成两个子数组(子数组内部出现一次的数仅有一个),可以按x的性质来分,可以按x的最高1位,也可以按x的最低1位:

function singleNumbers(nums: number[]): number[] {
    let x = 0;
    let res1 = 0, res2 = 0;
    for(let i = 0; i < nums.length; i++){
        x ^= nums[i];
    }
    let oneIndex = 1;
    while((x & oneIndex) == 0){
        oneIndex = oneIndex << 1; // m * 2
    }
    for(let i = 0; i < nums.length; i++){
        if(nums[i] & oneIndex)
            res1 = res1 ^ nums[i];
        else
            res2 = res2 ^ nums[i];
    }
    return [res1, res2];
};

三、数组中数字出现的次数 II

3.1、题目描述

在一个数组 nums 中除一个数字只出现一次之外,其他数字都出现了三次。请找出那个只出现一次的数字。

示例 1:

输入:nums = [3,4,3,3]
输出:4

示例 2:
输入:nums = [9,1,7,9,7,9,7]
输出:1

3.2、题解

哈希表方法同样能解,上一题的哈希方法直接拿过来套用。力扣上面有大神提供的位运算方法,使用到了模三计数器(数电的知识)的设计,没有很看懂。

这里提供一种排序方法:
首先将数组使用sort()进行排序,排序后的数组应当满足相同的数会以 3 的倍排序好,重新遍历排序好的数组,以 3 倍的“距离”跳跃式遍历,判断nums[i] == nums[i + 2]是否成立即可:

function singleNumber(nums: number[]): number {
    if(nums.length == 1)
        return nums[0];
    nums.sort();
    for(let i = 0; i < nums.length; i += 3){
        if(nums[i] != nums[i + 2])
            return nums[i];
    }
    return 1;
};

四、和为s的两个数字

4.1、题目描述

输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,则输出任意一对即可。

示例 1:

输入:nums = [2,7,11,15], target = 9
输出:[2,7] 或者 [7,2]

示例 2:
输入:nums = [10,26,30,31,47,60], target = 40
输出:[10,30] 或者 [30,10]

4.2、题解

使用双指针法,由于数组已经是排序好的数组,左指针指向最小值,右指针指向最大值,若当前最小值+最大值大于target,则右指针左移一位,若当前最小值+最大值小于target,则左指针右移一位:

function twoSum(nums: number[], target: number): number[] {
    let left = 0;
    let right = nums.length;
    while(nums[left] + nums[right] != target){
        if(nums[left] + nums[right] < target)
            left++;
        else{
            right--;
        }
    }
    return [nums[left], nums[right]];
};

五、和为s的连续正数序列

5.1、题目描述

输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)。

序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。

示例 1:
输入:target = 9
输出:[[2,3,4],[4,5]]

示例 2:
输入:target = 15
输出:[[1,2,3,4,5],[4,5,6],[7,8]]

5.2、题解

使用滑动窗口法,并维护一个当前滑动窗口里的值的和,若和大于target则将左边界右移,若和小于target则将右边界右移,若当前窗口的和等于target则记录窗口内的值并压入结果集中,再将右边界右移。

function findContinuousSequence(target: number): number[][] {
    let left = 1;
    let right = 1;
    let sum = 0;
    let res: number[][] = [];
    while(left <= target / 2){
        if(sum < target){
            sum = sum + right;
            right++
        }
        else if(sum > target){
            sum = sum - left;
            left++;
        }
        else{
            let tmpRes: number[] = [];
            for(let i = left; i < right; i++){
                tmpRes.push(i);
            }
            res.push(tmpRes);
            sum = sum - left;
            left ++;
        }
    }
    return res;
};

六、翻转单词顺序

6.1、题目描述

输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student. “,则输出"student. a am I”。

示例 1:
输入: “the sky is blue”
输出: “blue is sky the”

示例 2:
输入: " hello world! "
输出: “world! hello”
解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。

示例 3:
输入: “a good example”
输出: “example good a”
解释: 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。

6.2、题解

使用js自带的split函数,可以将字符串以" "为

function reverseWords(s: string): string {
    let arr = s.split(' ');
    let res = "";
    for(let i = arr.length - 1; i > -1; i--){
        if(arr[i]!='')
            res = res + arr[i] + ' ';
    }
    return res.substring(0, res.length - 1);
};

七、滑动窗口的最大值

7.1、题目描述

给定一个数组 nums 和滑动窗口的大小 k,请找出所有滑动窗口里的最大值。
示例:

输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3
输出: [3,3,5,5,6,7]
解释:

滑动窗口的位置最大值
[1 3 -1] -3 5 3 6 73
1 [3 -1 -3] 5 3 6 73
1 3 [-1 -3 5] 3 6 75
1 3 -1 [-3 5 3] 6 75
1 3 -1 -3 [5 3 6] 76
1 3 -1 -3 5 [3 6 7]7

7.2、题解

由于滑动窗口的性质其实很像一个队列,我们可以维护一个单调递减队列作为判断最大值的辅助,队列长度为k,当队列为空时将数压入队列,当后续的数要进来时,判断想要入队列的数与队尾的当前元素的大小,维护单调队列:

  • 队尾元素小于新增元素,则弹出队尾元素直至队尾元素大于新增元素
  • 队尾元素大于新增元素,则正常入队

形成窗口后,left变动时要判断当前边界值是否是队列的队首元素,如果是的话,下次滑动窗口后,队首元素不在窗口内了,得出队。

function maxSlidingWindow(nums: number[], k: number): number[] {
    if(k === 1)
        return nums;
    let tmpQue = [];
    let res = [];
    let right = 0;
    for(right = 0; right < nums.length; right++){
        // 维护单调递减队列
        while(tmpQue.length != 0 && tmpQue[tmpQue.length - 1] <  nums[right]){
            tmpQue.pop();
        }
        tmpQue.push(nums[right]);

        let left = right - k + 1;
        if(left < 0)  // 窗口尚未形成
            continue;
        else{  // 窗口已经形成
            res.push(tmpQue[0]);
            // 如果左边界是当前最大值
            if(nums[left] == tmpQue[0]){
                tmpQue.shift();
            }
        }
    }
    return res;
};

八、队列的最大值

8.1、题目描述

请定义一个队列并实现函数 max_value 得到队列里的最大值,要求函数max_value、push_back 和 pop_front 的均摊时间复杂度都是O(1)。

若队列为空,pop_front 和 max_value 需要返回 -1

输入:
[“MaxQueue”,“push_back”,“push_back”,“max_value”,“pop_front”,“max_value”]
[[],[1],[2],[],[],[]]
输出: [null,null,null,2,1,2]

输入:
[“MaxQueue”,“pop_front”,“max_value”]
[[],[],[]]
输出: [null,-1,-1]

8.2、题解

根据示例,题目的意思如下:

  • “MaxQueue” :生成队列,无需输入
  • “push_back” :向队列传入元素,需要输入一个数,输出null
  • “max_value” :求队列中的最大值,无需输入,输出当前队列中的最大值
  • “pop_front” : 删除队列头部元素,输出一个数

其本质类似求滑动窗口最大值的问题。这个队列可以看成是一个滑动窗口,入队就是将窗口的右边界右移,出队就是将窗口的左边界右移。维护一个单调递减队列,从而帮助存储队列的最大值。

class MaxQueue {
    myQueue:number[];
    maxQueue:number[];
    constructor() {
        this.myQueue = [];
        this.maxQueue = [];
    }

    max_value(): number {
        if(this.myQueue.length == 0)
            return -1;
        return this.maxQueue[0];
    }

    push_back(value: number): void {
        this.myQueue.push(value);
        while(this.maxQueue.length != 0 && this.maxQueue[this.maxQueue.length - 1] < value){
            this.maxQueue.pop();
        }
        this.maxQueue.push(value);
    }

    pop_front(): number {
        if(this.myQueue.length == 0)
            return -1;
        let res = this.myQueue.shift();
        if(res == this.maxQueue[0])
            this.maxQueue.shift();
        return res;
    }
}

/**
 * Your MaxQueue object will be instantiated and called as such:
 * var obj = new MaxQueue()
 * var param_1 = obj.max_value()
 * obj.push_back(value)
 * var param_3 = obj.pop_front()
 */

九、n个骰子的点数

9.1、题目描述

把n个骰子扔在地上,所有骰子朝上一面的点数之和为s。输入n,打印出s的所有可能的值出现的概率。

你需要用一个浮点数数组返回答案,其中第 i 个元素代表这 n 个骰子所能掷出的点数集合中第 i 小的那个的概率。

输入: 1
输出: [0.16667,0.16667,0.16667,0.16667,0.16667,0.16667]

输入: 2
输出: [0.02778,0.05556,0.08333,0.11111,0.13889,0.16667,0.13889,0.11111,0.08333,0.05556,0.02778]

9.2、题解

这题题目的意思是,输入1,也就是1个骰子,投出各个数值(1~6)的概率,也就是1/6 = 0.16667
输入2,也就是2个骰子,此时2个骰子的和范围为2~12,为2的概率为(两个骰子都为1),也就是1/6*1/6 = 1/36 = 0.02778。以此类推。

如果使用暴力法,2个骰子有6 × 6 = 36种情况,36种情况再汇聚成11种结果,但是如果题目n=11,那11个骰子有6的11次方情况,汇聚成61种结果,如此的话,时间复杂度会非常高。

这里选择动态规划方法:
设置dp[n][j]表示投掷完第n枚骰子后,点数和为j的次数那么

  • dp[1][1] = 1,dp[1][2] = 1 ... ... dp[1][6] = 1;
  • dp[2][1] = dp[1][1](在第一次投出1的情况下,此次投出1) = 1; dp[2][3] = dp[1][1](在第一次投出1的情况下,此次投出2) + dp[1][2](在第一次投出2的情况下,此次投出1) = 2; dp[2][4] = dp[1][1] + dp[1][2] + dp[1][3] = 3 ....
  • 推理可以得出状态转移方程:d[n][j] = dp[n - 1][j - 1] + dp[n - 1][j - 2] + dp[n - 1][j - 3] + … + dp[n - 1][j - 6] ,即第n个骰子投完后,出现和为j的概率,由第n-1个骰子投完后,第n个骰子投出1,2,3,4,5,6的情况之和。

故可以由此编码:

function dicesProbability(n: number): number[] {
     let dp = new Array(n + 1).fill(0).map(i => new Array(6 * n + 1).fill(0));
     for(let j = 1; j <= 6; j++){
         dp[1][j] = 1;
     }
     for(let i = 2; i <= n; i++){
        //  最小值到最大值
         for(let j = i; j<=6*i; j++){
            //  第i个骰子从1到6的情况
             for(let k = 1; k <= 6; k++){
                //  不要算dp[k - 1][j - k]为负的情况,不可能存在
                if(j - k <= 0){
                    break;
                 }
                dp[i][j] = dp[i - 1][j - k] + dp [i][j];
             }
         }
     }
    let all = Math.pow(6, n);
    let res:number[] = [];
    // 收集n到6*n的结果集次数
    for(let i = n; i <= 6 *n; i++){
        res.push(dp[n][i]/all);
    }
    return res;
};

十、扑克牌中的顺子

10.1、题目描述

从若干副扑克牌中随机抽 5 张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10为数字本身,A为1,J为11,Q为12,K为13,而大、小王为 0 ,可以看成任意数字。A 不能视为 14。

输入: [1,2,3,4,5]
输出: True

输入: [0,0,1,2,5]
输出: True

10.2、题解

这题要注意的是A为1,故10 J Q K A不能算顺子,而0是大小王,且可以五张都是。
要打出顺子,有两个特点:

  1. 除了0可以重复,其他数不能重复(不然顺子里面会出现对,如3,4,4,5,6、0,3,4,5,5不符合要求)
  2. 最大值减去最小值应该小于5,比如2,3,4,5,6、2,0,0,4,5
  3. 数字最大为14,最小为0
function isStraight(nums: number[]): boolean {
    let storeSet: Set<number> = new Set();
    let max = 1, min = 14;
    for(let i = 0 ; i < nums.length; i++){
        if(nums[i] !=0){
            // 判断是否出现其他不在扑克牌的数字
            if(nums[i] > 14 || nums[i] < 1){
                return false;
            }
            // 判断是否有重复数字(除0之外)
            if(storeSet.has(nums[i]))
                return false;
            storeSet.add(nums[i]);
            max = Math.max(max, nums[i]);
            min = Math.min(min,nums[i])
        }
    }
    return max - min < 5;
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/812360.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《cuda c编程权威指南》01- 用gpu输出hello world

学习一门新语言的最好方式就是用它来编写程序。 目录 1. 使用cpu输出hello world 2. 使用gpu输出hello world 3. CUDA编程结构 1. 使用cpu输出hello world hello.cu #include <stdio.h>void helloFromCPU() {printf("hello world from cpu!\n"); }int m…

Zabbix分布式监控配置和使用

目录 1 Zabbix监控的配置流程2 添加主机组3 添加模板4 添加主机5 配置图形6 配置大屏7 新建监控项7.1 简介7.2 添加监控项7.3 查看数据7.4 图表 8 新建触发器8.1 概述8.2 添加触发器8.3 显示触发器状态 1 Zabbix监控的配置流程 在Zabbix-Web管理界面中添加一个主机&#xff0c;…

【Golang 接口自动化00】为什么要用Golang做自动化?

目录 为什么使用Golang做自动化 最终想实现的效果 怎么做&#xff1f; 写在后面 资料获取方法 为什么使用Golang做自动化 顺应公司的趋势学习了Golang之后&#xff0c;因为没有太多时间和项目来实践&#xff0c;怕止步于此、步Java缺少练习遗忘殆尽的后尘&#xff0c;决定…

【C++进阶之路】多态篇

文章目录 前言一、概念1.分类2.实现条件①重写虚函数1.1总结三重1.2 final与override ②父类的指针或者引用2.1普通调用VS多态调用 3.抽象类3.1. 纯虚函数3.2. 接口继承和实现继承 二、原理及使用1.虚函数表 —— 虚表2.默认成员函数2.1构造函数2.2析构函数 3. 多继承3.1普通的…

python速成之循环分支结构学习

循环结构 应用场景 我们在写程序的时候&#xff0c;一定会遇到需要重复执行某条或某些指令的场景。例如用程序控制机器人踢足球&#xff0c;如果机器人持球而且还没有进入射门范围&#xff0c;那么我们就要一直发出让机器人向球门方向移动的指令。在这个场景中&#xff0c;让…

AD21原理图的高级应用(六)原理图设计片段的使用

&#xff08;六&#xff09;原理图设计片段的使用 Altium Designer 的片段功能可以很方便地重复使用一些单元模块,其中包括原理图的电路模块、PCB(包括布线)和代码模块。例如在工程中需要设计电源模块,而别的工程中又恰好有比较完善的电源模块,这时就可以通过片段功能重复地使用…

一文了解 Android 车机如何处理中控的旋钮输入?

前言 上篇文章《从实体按键看 Android 车载的自定义事件机制》带大家了解了 Android 车机支持自定义输入的机制 CustomInputService。事实上&#xff0c;除了支持自定义事件&#xff0c;对于中控上常见的音量控制、焦点控制的旋钮事件&#xff0c;Android 车机也是支持的。 那…

测试|测试用例方法篇

测试|测试用例方法篇 文章目录 测试|测试用例方法篇1.测试用例的基本要素&#xff1a;测试环境&#xff0c;操作步骤&#xff0c;测试数据&#xff0c;预期结果…2.测试用例带来的好处3.测试用例的设计思路&#xff0c;设计方法&#xff0c;具体设计方法之间的关系**设计测试用…

linux设备驱动的poll与fasync

什么是fasync 在 Linux 驱动程序中&#xff0c;fasync 是一种机制&#xff0c;用于在异步事件发生时通知进程。它允许进程在等待设备事件时&#xff0c;不必像传统的轮询方式那样持续地查询设备状态。 具体来说&#xff0c;当进程调用 fcntl(fd, F_SETFL, O_ASYNC) 函数时&am…

lib-flexible修改配置适配更多不同分辨率

找到设置宽度的地方 然后根据你的屏幕最大多大呀&#xff0c;最小多小呀设置一下 if (width / dpr < 1980) { width 1980 * dpr; } else if (width / dpr > 5760) { width 5760 * dpr; }

Python 教程之标准库概览

概要 Python 标准库非常庞大&#xff0c;所提供的组件涉及范围十分广泛&#xff0c;使用标准库我们可以让您轻松地完成各种任务。 以下是一些 Python3 标准库中的模块&#xff1a; 「os 模块」 os 模块提供了许多与操作系统交互的函数&#xff0c;例如创建、移动和删除文件和…

【Linux】进程篇Ⅱ:进程开始、进程终止、进程等待

文章目录 五、fork 函数&#xff0c;创建进程写时拷贝 六、进程终止1. 退出码2. 如何终止程序 七、进程等待1. 概念2. wait 函数waitpid 函数 &#x1f53a; 3. 阻塞等待 五、fork 函数&#xff0c;创建进程 #include <unistd.h>   pid_t fork(void);   返回值&#xf…

动态SQL 语句-更复杂的查询业务需求也能轻松拿捏

文章目录 动态SQL 语句-更复杂的查询业务需求动态SQL-官方文档为什么需要动态SQL动态SQL-基本介绍基本介绍动态SQL 必要性解决方案分析 动态SQL 常用标签动态SQL-案例演示if 标签应用实例where 标签应用实例choose/when/otherwise 应用实例forEach 标签应用实例trim 标签应用实…

【C语言进阶篇】 你真的学会数组了嘛?数组笔试题万字解析(上)

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏:《C语言初阶篇》 《C语言进阶篇》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 &#x1f4cb; 前言&#x1f4ac; 数组笔试题解析&#x1f4ad; 一维数组笔试题✅ 一维数组笔试题解析✅ 一维数…

ShardingSphere 源码模块介绍

目录 Agent Db-Protocol Dialect-Exception Distribution Features Infra JDBC Kernel Mode Proxy Agent agent 模块提供了基于 Java Agent 实现的可观察框架 logging&#xff1a; 用于记录 ShardingSphere 的日志&#xff0c;支持文件metricrs&#xff1a;用于收集…

C++那些事之高性能SIMD

C那些事之高性能SIMD 最近在看相关向量化的内容&#xff0c;看起来有点头大&#xff0c;借此机会&#xff0c;学习一下高性能SIMD编程。 SIMD全称single-instruction multiple-data,单指令多数据。 在传统的计算机架构中&#xff0c;CPU一次只能处理一个数据元素。但是&#xf…

【机器学习】Feature scaling and Learning Rate (Multi-variable)

Feature scaling and Learning Rate 1、数据集2、学习率2.1 α \alpha α 9.9e-72.2 α \alpha α 9e-72.3 α \alpha α 1e-7 3、特征缩放3.1 特征缩放的原因3.2 Z-score 归一化3.3 预测3.4 损失等值线 导入所需的库 import numpy as np np.set_printoptions(precision…

【C++】类和对象-C++运算符重载

运算符重载 1.加号运算符重载 代码&#xff1a; #include <iostream> using namespace std; /******************************************/ //加号运算符重载class Person { public:int m_A;int m_B;//1、成员函数重载号(不能与下面方式2同时存在&#xff0c;否则代码报…

在docker中没有vi如何修改docker中的文件

今天在做学成在线的项目&#xff0c;遇到了一个问题&#xff0c;就是死活登不上xxl-job&#xff0c;按照之前遇到的nacos的问题&#xff0c;我怀疑很大概率是和当时的ip设置有关&#xff0c;不知道nacos的ip怎么修改的同学&#xff0c;可以看看这篇文章&#xff1a;关于docker中…

电子词典

项目要求&#xff1a; 1.登录注册功能&#xff0c;不能重复登录&#xff0c;重复注册。用户信息也存储在数据库中。 2.单词查询功能 3.历史记录功能&#xff0c;存储单词&#xff0c;意思&#xff0c;以及查询时间&#xff0c;存储在数据库 4.基于TCP&#xff0c;支持多客户…