数学

1.判断矩形框和点的包含关系

可以使用向量关系

import numpy as np
from typing import List

def judge(box: List[np.ndarray], point: np.ndarray) -> bool:
    """
    判断一个点是否在旋转矩形框内。

    Args:
        box (List[np.ndarray]): 形状为 (4, 2) 的列表,其中每个元素表示一个二维坐标点。
                                 box[0], box[1], box[3] 是矩形的三个角点(通常是左上角,右上角,左下角)。
        point (np.ndarray): 一个二维坐标,表示待判断的点,形状为 (2,),表示 (x, y)。

    Returns:
        bool: 如果点在矩形框内,返回 True,否则返回 False。
    """
    assert len(box) == 4, "box should contain 4 points"

    # 解包 box 中的四个角点:a, b, _, d
    a, b, _, d = box
    
    # 计算矩形的边向量
    ab = b - a  # 矩形边 ab
    ad = d - a  # 矩形边 ad
    ap = point - a  # 待判断点到点 a 的向量
    
    # 计算向量的长度的平方
    norm_ab = np.sum(ab * ab)  # ab 向量的平方长度
    norm_ad = np.sum(ad * ad)  # ad 向量的平方长度
    
    # 计算 ap(待判断点与点 a 之间的向量)与 ab 和 ad 向量的点积
    ap_dot_ab = np.sum(ap * ab)  # ap 和 ab 向量的点积
    ap_dot_ad = np.sum(ap * ad)  # ap 和 ad 向量的点积

    # 判断待判断点是否在矩形内
    return (ap_dot_ab >= 0) and (ap_dot_ab <= norm_ab) and (ap_dot_ad >= 0) and (ap_dot_ad <= norm_ad)  # is_in_box

2.计算多边形的面积

鞋带公式

def _polygon_area(points: np.ndarray) -> float:
    x = points[:, 0]
    y = points[:, 1]
    return float(0.5 * abs(np.dot(x, np.roll(y, -1)) - np.dot(y, np.roll(x, -1))))

3.两个向量的叉积就是平行四边形面积

vec1 = tri[1] - tri[0]
vec2 = tri[2] - tri[0]
area = abs(float(vec1[0] * vec2[1] - vec1[1] * vec2[0]))

3.余弦定理:知道三条边,可以求任意角

def _angle(opposite: float, adj1: float, adj2: float) -> float:
    denom = max(2.0 * adj1 * adj2, 1e-9)
    cos_v = (adj1 * adj1 + adj2 * adj2 - opposite * opposite) / denom
    cos_v = float(np.clip(cos_v, -1.0, 1.0))
    return float(math.degrees(math.acos(cos_v)))

apt update
apt install -y openssh-server
service ssh start
passwd root #设置密码
vi /etc/ssh/sshd_config # 改端口
# PermitRootLogin yes
# PasswordAuthentication yes
service ssh restart


# 如果重新创建容器则
ssh-keygen -R [192.168.5.93]:23400

项目

1.异或运算

异或运算具有交换律,结合律和自反性

自反性指a^a=0

异或运算有几个偏门使用

1.异或加密

def encryption(char,key):
    return "".join([chr(ord(c)^key) for c in char])

string = "hello wolrd"
key = 193
encry = encryption(string,key)
print("加密: ",encry)
deencry = encryption(encry,key)
print("解密: ",deencry)

2.无中间变量的swap

// 交换a和b的值
void swap(int& a,int& b){
    a ^= b;
    b ^= a;
    a ^= b;
}
// int x = 5;
// int y = 10;
// swap(x, y);

3.从一组数寻找唯一不重复的元素

int findNoDuplicate(vector<int>& nums){
    int  num = nums[0];
    for(int i = 1; i < nums.size(); i++){
        num^=nums[i];
    }
    return num;
}
// vector<int> nums = {4,1,2,1,2};

4.异或链表

就是链表不再存储前驱指针和后继指针,而是存储一个前驱指针和后继指针的异或。这样在存储上减少一半内存

2.加密字段如何模糊搜索

分析:肯定不能把加密数据解密然后进行搜索

方案:可以新建一个字段,把原始字段按不同窗口尺寸进行切片,然后加密,通过一个指定的分隔符拼接在一起,然后放在新的字段中

在搜索时,把关键词进行加密然后和这个新字段进行匹配

注意:用分割符是为了避免每个加密切片在匹配时不会混淆

3.40 亿个QQ 号,1G内存,如何去重

分析:一个qq号是4个字节,40亿个就是15个G,肯定存不下

方案:由于qq号的数字增加有规律可循,一个int32最大表示42亿个,所以使用bitmap,用一个二进制位表示一个qq号是否存在。

4.有1亿条数据,如何去重

1.用hashset

2.排序+遍历去重

3.bitmap