二、数据结构

news2024/11/25 16:28:06

链表

单链表

https://www.acwing.com/problem/content/828/

#include<iostream>
using namespace std;
const int N = 1e5 + 10;
//head:头节点的指向   e[i]:当前节点i的值  ne[i]:当前节点i的next指针   idx:当前存储的点
int head, e[N], ne[N], idx;

//初始化
void init(){
    head = -1;
    idx = 1;
}

//将x插入到头节点
void add_head(int x){
    e[idx] = x;
    ne[idx] = head;
    head = idx;
    idx++;
}

//将x插入到下标是k的后面
void add(int k, int x){
    e[idx] = x;
    ne[idx] = ne[k];
    ne[k] = idx;
    idx++;
}

//删除第k+1个节点
void remove(int k){
    ne[k] = ne[ne[k]];
}

int main(){
    init();
    int m;
    cin>>m;
    char c;
    while(m--){
        cin>>c;
        int k, x;
        if(c == 'H'){
            cin>>x;
            add_head(x);
        }else if(c == 'D'){
            cin>>k;
            //删除头节点
            if(k == 0){
                head = ne[head];
            }else{
                remove(k);
            }
        }else{
            cin>>k>>x;
            add(k, x);
        }
    }
    for(int i = head; i != -1; i = ne[i]){
        cout<<e[i]<<" ";
    }
    return 0;
}

双链表

https://www.acwing.com/problem/content/829/

#include<iostream>
using namespace std;
const int N = 1e5 + 10;
int e[N], l[N], r[N], idx;

//初始化,0表示左端点,1表示右端点,下标从2开始
void init(){
    r[0] = 1;
    l[1] = 0;
    idx = 2;
}

//在第k个点的右边插入x
void add(int k, int x){
    e[idx] = x;
    r[idx] = r[k];
    l[idx] = k;
    l[r[k]] = idx;
    r[k] = idx;
    idx++;
}

//删除第k个点
void remove(int k){
    r[l[k]] = r[k];
    l[r[k]] = l[k];
}

int main(){
    init();
    int m;
    cin>>m;
    string s;
    while(m--){
        cin>>s;
        int k, x;
        if(s == "L"){
            cin>>x;
            add(0, x);
        }else if(s == "R"){
            cin>>x;
            add(l[1], x);
        }else if(s == "D"){
            cin>>k;
            //下标从2开始
            remove(k + 1);
        }else if(s == "IL"){
            cin>>k>>x;
            add(l[k + 1], x);
        }else{
            cin>>k>>x;
            add(k + 1, x);
        }
    }
    for(int i = r[0]; i != 1; i = r[i]){
        cout<<e[i]<<" ";
    }
    return 0;
}

先进后出

模拟栈

https://www.acwing.com/problem/content/830/

#include<iostream>
using namespace std;
const int N = 1e5 + 10;
int st[N], tt;

//栈顶插入一个元素
void push(int x){
    st[++tt] = x;
}

//删除栈顶
void pop(){
    tt--;
}

//判断栈是否为空
void empty(){
    cout<<(tt > 0 ? "NO" : "YES")<<endl;
}

//查询栈顶元素
void query(){
    cout<<st[tt]<<endl;
}

int main(){
    int m;
    cin>>m;
    string s;
    while(m--){
        int x;
        cin>>s;
        if(s == "push"){
            cin>>x;
            push(x);
        }else if(s == "pop"){
            pop();
        }else if(s == "empty"){
            empty();
        }else{
            query();
        }
    }
    return 0;
}

表达式求值

https://www.acwing.com/problem/content/3305/

中缀表达式,需要括号;后缀表达式,不需要括号

#include<iostream>
#include<unordered_map>
using namespace std;
const int N = 1e5 + 10;
int st1[N], tt1, tt2; //存储数字
char st2[N]; //存储运算符
unordered_map<char, int> mp{{'+', 1}, {'-', 1}, {'*', 2}, {'/', 2}}; //运算符优先级
string s;

void f(){
    int x1 = st1[tt1];
    tt1--;
    int x2 = st1[tt1];
    tt1--;
    char c = st2[tt2];
    tt2--;
    int res = 0;
    if(c == '-'){
        res = x2 - x1;
    }else if(c == '+'){
        res = x2 + x1;
    }else if(c == '*'){
        res = x2 * x1;
    }else{
        res = x2 / x1;
    }
    st1[++tt1] = res;
}

int main(){
    cin>>s;
    int n = s.size();
    for(int i = 0; i < n; i++){
        //如果是数字
        if(isdigit(s[i])){
            int x = 0, j = i;
            //计算数字
            while(j < n && isdigit(s[j])){
                x = x * 10 + (s[j] - '0');
                j++;
            }
            //存储到数字栈中
            st1[++tt1] = x;
            //因为for循环i还要++
            i = j - 1;
        }else if(s[i] == '('){
            //存储到运算符栈中
            st2[++tt2] = s[i];
        }else if(s[i] == ')'){
            //当栈顶不等于左括号时,就计算括号里的
            while(st2[tt2] != '('){
                f();
            }
            //弹出左括号
            tt2--;
        }else{
            //当运算符栈中有元素,当前元素小于等于栈顶优先级,则先计算之前的
            while(tt2 > 0 && mp[st2[tt2]] >= mp[s[i]]){
                f();
            }
            //存储到运算符栈中
            st2[++tt2] = s[i];
        }
    }
    //防止算了括号里的就结束了
    while(tt2 > 0){
        f();
    }
    cout<<st1[tt1];
    return 0;
}

队列

先进先出

模拟队列

https://www.acwing.com/problem/content/831/

#include<iostream>
using namespace std;
const int N = 1e5 + 10;
int q[N], hh, tt = -1;

//插入元素x
void push(int x){
    q[++tt] = x;
}

//弹出队头
void pop(){
    hh++;
}

//判断队列是否为空
void empty(){
    cout<<(hh <= tt ? "NO" : "YES")<<endl;
}

//查询队头
void query(){
    cout<<q[hh]<<endl;
}


int main(){
    int m;
    cin>>m;
    string s;
    while(m--){
        cin>>s;
        int x;
        if(s == "push"){
            cin>>x;
            push(x);
        }else if(s == "pop"){
            pop();
        }else if(s == "empty"){
            empty();
        }else{
            query();
        }
    }
    return 0;
}

单调栈

https://www.acwing.com/problem/content/832/

存储一个单调递增的序列

#include<iostream>
using namespace std;
const int N = 1e5 + 10;
int st[N], tt;
int n, x;

int main(){
    cin>>n;
    for(int i = 0; i < n; i++){
        cin>>x;
		//如果栈顶大于等于当前元素,那就弹出栈顶
        while(tt && st[tt] >= x){
            tt--;
        }
        //如果栈顶小于当前元素,那就输出
        if(tt){
            cout<<st[tt]<<" ";
        }else{
            cout<<-1<<" ";
        }
        //入栈
        st[++tt] = x;
    }
    return 0;
}

单调队列

https://www.acwing.com/problem/content/156/

#include<iostream>
using namespace std;
const int N = 1e6 + 10;
int a[N], q[N]; //q数组存储下标
int n, k, x;

int main(){
    cin>>n>>k;
    for(int i = 0; i < n; i++){
        cin>>a[i];
    }
    int hh = 0, tt = -1;
    for(int i = 0; i < n; i++){
        cin>>x;
        //如果队头已经出窗口了,那就出队
        if(hh <= tt && i - k + 1 > q[hh]){
            hh++;
        }
        //如果队尾大于等于当前元素,那就出队
        while(hh <= tt && a[q[tt]] >= a[i]){
            tt--;
        }
        //存储下标,要放在输出前,防止第三个元素还没进队列
        q[++tt] = i; 
        if(i >= k - 1){
            cout<<a[q[hh]]<<" ";
        }
    }
    cout<<endl;
    hh = 0, tt = -1;
    for(int i = 0; i < n; i++){
        cin>>x;
        //如果队头已经出窗口了,那就出队
        if(hh <= tt && i - k + 1 > q[hh]){
            hh++;
        }
        //如果队尾小于等于当前元素,那就出队
        while(hh <= tt && a[q[tt]] <= a[i]){
            tt--;
        }
        //存储下标,要放在输出前,防止第三个元素还没进队列
        q[++tt] = i; 
        if(i >= k - 1){
            cout<<a[q[hh]]<<" ";
        }
    }
    return 0;
}

KMP

https://www.acwing.com/problem/content/833/

在这里插入图片描述

#include<iostream>
using namespace std;
const int N = 1e6 + 10;
int ne[N];
int n, m;
char s[N], p[N];

int main(){
    //下标从1开始
    cin >> m >> p + 1 >> n >> s + 1;
    //求ne数组
    for(int i = 2, j = 0; i <= n; i++){
        while(j && p[i] != p[j + 1]){
            j = ne[j];
        }
        if(p[i] == p[j + 1]){
            j++;
        }
        ne[i] = j;
    }
    //s串和p串匹配
    for(int i = 1, j = 0; i <= n; i++){
        //如果j没有回到起点,且不相等,那就到标记的位置
        while(j && s[i] != p[j + 1]){
            j = ne[j];
        }
        //如果匹配,j向后移
        if(s[i] == p[j + 1]){
            j++;
        }
        //如果完全匹配p串,那就到下一个位置再尝试
        if(j == m){
            cout << i - m << " ";
            j = ne[j];
        }
    }
    return 0;
}

//下标从0开始
#include <cstring>
#include <iostream>
#include <algorithm>

using namespace std;

const int N = 1000010;

int n, m;
char s[N], p[N];
int ne[N];

int main()
{
    cin >> m >> p >> n >> s;

    ne[0] = -1;
    for (int i = 1, j = -1; i < m; i ++ )
    {
        while (j >= 0 && p[j + 1] != p[i]) j = ne[j];
        if (p[j + 1] == p[i]) j ++ ;
        ne[i] = j;
    }

    for (int i = 0, j = -1; i < n; i ++ )
    {
        while (j != -1 && s[i] != p[j + 1]) j = ne[j];
        if (s[i] == p[j + 1]) j ++ ;
        if (j == m - 1)
        {
            cout << i - j << ' ';
            j = ne[j];
        }
    }

    return 0;
}

Trie树

高效的存储和查找字符串集合

Trie字符串统计

https://www.acwing.com/problem/content/837/

在这里插入图片描述

#include<iostream>
using namespace std;
const int N = 1e5 + 10;
int son[N][26], cnt[N], idx; //0是根节点也是空节点
int n;

//插入字符串
void insert(char str[N]){
    int p = 0;
    //字符串结尾是'\0'
    for(int i = 0; str[i]; i++){
        //字母对应成数字
        int u = str[i] - 'a';
        if(!son[p][u]){
            son[p][u] = ++idx;
        }
        p = son[p][u];
    }
    //标记以这个节点结束的字符串有多少个
    cnt[p]++;
}

//查询字符串
int query(char str[]){
    int p = 0;
    for(int i = 0; str[i]; i++){
        int u = str[i] - 'a';
        if(!son[p][u]){
            return 0;
        }
        p = son[p][u];
    }
    return cnt[p];
}

int main(){
    cin>>n;
    char c, s[N];
    while(n--){
        cin>>c;
        if(c == 'I'){
            cin>>s;
            insert(s);
        }else{
            cin>>s;
            cout<<query(s)<<endl;
        }
    }
    return 0;
}

最大异或对

https://www.acwing.com/problem/content/145/

字典树不单单可以高效存储和查找字符串集合, 还可以存储二进制数字
将每个数以二进制方式存入字典树, 找的时候从最高位去找有无该位的异

#include<iostream>
using namespace std;
const int N = 1e5 + 10;
int son[31 * N][2], idx;
int n, x;
int ans, res;

void insert(int x){
    int p = 0;
    for(int i = 30; i >= 0; i--){
        int u = x >> i & 1; 
        if(!son[p][u]){
            son[p][u] = ++idx;
        }
        p = son[p][u];
    }
}

int query(int x){
    int p = 0;
    int sum = 0;
    for(int i = 30; i >= 0; i--){
        int u = x >> i & 1; 
        if(son[p][!u]){
            p = son[p][!u];
            sum = 2 * sum + !u;
        }else{
            p = son[p][u];
            sum = 2 * sum + u;
        }
    }
    return sum;
}

int main(){
    cin>>n;
    for(int i = 0; i < n; i++){
        cin>>x;
        insert(x);
        res = query(x);
        ans = max(ans, res ^ x);
    }
    cout<<ans;
    return 0;
}

并查集

合并集合

https://www.acwing.com/problem/content/838/

开始时每个集合都是一个独立的集合,并且都是等于自己本身下标的数
例如:p[5]=5,p[3]=3;
如果是M操作的话那么就将集合进行合并,合并的操作是:
p[3]=p[5]=5;
所以3的祖宗节点便成为了5
此时以5为祖宗节点的集合为{5,3}
如果要将p[9]=9插入到p[3]当中,应该找到3的祖宗节点,
然后再把p[9]=9插入其中,所以p[9]=find(3);(find()函数用于查找祖宗节点)
也可以是p[find(9)]=find(3),因为9的节点本身就是9
此时以5为祖宗节点的集合为{5,3,9};

#include<iostream>
using namespace std;
const int N = 1e5 + 10;
int p[N];
int n, m;

//找到根节点,路径压缩
int find(int x){
    if(x != p[x]){
        p[x] = find(p[x]);
    }
    return p[x];
}

int main(){
    cin>>n>>m;
    //初始化每个节点的根节点
    for(int i = 1; i <= n; i++){
        p[i] = i;
    }
    char c;
    int a, b;
    while(m--){
        cin>>c;
        if(c == 'M'){
            cin>>a>>b;
            //将a合并到b的集合中
            p[find(a)] = find(b);
        }else{
            cin>>a>>b;
            cout<<(find(a) == find(b) ? "Yes" : "No")<<endl;
        }
    }
    return 0;
}

连通块中点的数量

https://www.acwing.com/problem/content/839/

#include<iostream>
using namespace std;
const int N = 1e5 + 10;
int p[N], cnt[N];
int n, m;

int find(int x){
    if(x != p[x]){
        p[x] = find(p[x]);
    }
    return p[x];
}

int main(){
    cin>>n>>m;
    for(int i = 0; i < n; i++){
        p[i] = i;
        cnt[i] = 1;
    }
    string s;
    while(m--){
        cin>>s;
        int a, b;
        if(s == "C"){
            cin>>a>>b;
            //如果是一个集合,就不用再加了
            if(find(a) == find(b)){
                continue;
            }
            cnt[find(b)] += cnt[find(a)];
            p[find(a)] = find(b);
        }else if(s == "Q1"){
            cin>>a>>b;
            cout<<(find(a) == find(b) ? "Yes" : "No")<<endl;
        }else{
            cin>>a;
            cout<<cnt[find(a)]<<endl;
        }
    }
    return 0;
}

食物链

https://www.acwing.com/problem/content/description/242/

#include<iostream>
using namespace std;
const int N = 5e4 + 10;
int p[N], d[N]; //p存储根节点,d存储到根节点的距离
int n, k;
int res;

int find(int x){
    if(x != p[x]){
        int t = find(p[x]);
        d[x] += d[p[x]];
        p[x] = t;
    }
    return p[x];
}

int main(){
    cin>>n>>k;
    for(int i = 1; i <= n; i++){
        p[i] = i;
    }
    int c, x, y;
    while(k--){
        cin>>c>>x>>y;
        if(x > n || y > n){
            res++;
        }else{
            //找到x和y的根节点
            int px = find(x), py = find(y);
            if(c == 1){
                //如果父节点相同,但是距离不同,就是假话
                if(px == py && (d[x] - d[y]) % 3){
                    res++;
                }else if(px != py){
                    //不在一个集合,放在一个集合中
                    p[px] = py;
                    d[px] = d[y] - d[x]; //d[px] + d[x]和d[y]同余
                }
            }else{
                if(px == py && (d[x] - d[y] - 1) % 3){
                    res++;
                }else if(px != py){
                    p[px] = py;
                    d[px] = d[y] - d[x] + 1;
                }
            }
        }
    }
    cout<<res;
    return 0;
}

用一个一维数组存储一颗二叉树
1.插入一个元素
2.求集合当中最小值(最大值)
3.删除最小值(最大值)
4.删除任意一个元素
5.修改任意一个元素

小根堆:根节点小于等于左右子节点

堆排序

https://www.acwing.com/problem/content/840/
在这里插入图片描述

#include<iostream>
using namespace std;
const int N = 1e5 + 10;
int h[N], cnt;
int n, m;

void down(int u){
    int t = u;
    //如果根节点大于左右子节点,那就交换下标
    if(2 * u <= cnt && h[2 * u] < h[t]){
        t = 2 * u;
    }
    if(2 * u + 1 <= cnt && h[2 * u + 1] < h[t]){
        t = 2 * u + 1;
    }
    //如果已经交换了下标,那就递归子节点,u为根节点,t为子节点
    if(h[t] != h[u]){
        swap(h[t], h[u]);
        down(t);
    }
}

int main(){
    cin>>n>>m;
    cnt = n;
    for(int i = 1; i <= n; i++){
        cin>>h[i];
    }
    for(int i = n / 2; i > 0; i--){
        down(i);
    }
    while(m--){
        cout<<h[1]<<" ";
        h[1] = h[cnt];
        cnt--;
        down(1);
    }
    return 0;
}

模拟堆

https://www.acwing.com/problem/content/841/

#include<iostream>
using namespace std;
const int N = 1e5 + 10;
int h[N], cnt, m; //m:第几个插入的数
int hp[N], ph[N]; //hp[k]:第k个插入的点是几号,ph[j]:j号是第几个插入的点
int n;

void head_swap(int a, int b){
    swap(hp[ph[a]], hp[ph[b]]);
    swap(ph[a], ph[b]);
    swap(h[a], h[b]);
}

void down(int u){
    int t = u;
    if(2 * u <= cnt && h[2 * u] < h[t]){
        t = 2 * u;
    }
    if(2 * u + 1 <= cnt && h[2 * u + 1] < h[t]){
        t = 2 * u + 1;
    }
    if(h[t] != h[u]){
        head_swap(t, u);
        down(t);
    }
}

void up(int u){
    while(u / 2 > 0 && h[u / 2] > h[u]){
        head_swap(u / 2, u);
        u /= 2;
    }
}

int main(){
    cin>>n;
    string s;
    while(n--){
        cin>>s;
        int k, x;
        if(s == "I"){
            cin>>x;
            m++;
            cnt++;
            hp[m] = cnt;
            ph[cnt] = m;
            h[cnt] = x;
            up(cnt);
        }else if(s == "PM"){
            cout<<h[1]<<endl;
        }else if(s == "DM"){
            head_swap(1, cnt);
            cnt--;
            down(1);
        }else if(s == "D"){
            cin>>k;
            k = hp[k];
            head_swap(k, cnt);
            cnt--;
            down(k);
            up(k);
        }else{
            cin>>k>>x;
            k = hp[k];
            h[k] = x;
            down(k);
            up(k);
        }
    }
    return 0;
}

哈希表

模拟散列表

https://www.acwing.com/problem/content/842/

//拉链法
#include<iostream>
#include<cstring>
using namespace std;
const int N = 1e5 + 3; //大于1e5的第一个质数
int h[N], e[N], ne[N], idx;
int n;

void insert(int x){
    //加N防止模出来的数是负数
    int k = (x % N + N) % N; 
    e[idx] = x;
    ne[idx] = h[k];
    h[k] = idx;
    idx++;
}

int find(int x){
    int k = (x % N + N) % N;
    for(int i = h[k]; i != -1; i = ne[i]){
        if(e[i] == x){
            return 1;
        }
    }
    return 0;
}
 
int main(){
    cin>>n;
    memset(h, -1, sizeof(h));
    char c;
    while(n--){
        cin>>c;
        int x;
        if(c == 'I'){
            cin>>x;
            insert(x);
        }else{
            cin>>x;
            if(find(x)){
                cout<<"Yes"<<endl;
            }else{
                cout<<"No"<<endl;
            }
        }
    }
    return 0;
}

//开放寻地址法
#include<iostream>
#include<cstring>
using namespace std;
const int N = 2e5 + 3, null = 0x3f3f3f3f; //第一个大于2e5的质数
int h[N];
int n;

int find(int x){
    int k = (x % N + N) % N;
    //如果k位置不等于x,那就找下一个数
    while(h[k] != x && h[k] != null){
        k++;
        //到结尾也没找到,就从头开始找
        if(k == N){
            k = 0;
        }
    }
    return k;
}

int main(){
    memset(h, 0x3f, sizeof(h));
    cin>>n;
    char c;
    while(n--){
        cin>>c;
        int x;
        if(c == 'I'){
            cin>>x;
            //找到第一个空位置
            int k = find(x);
            h[k] = x;
        }else{
            cin>>x;
            //查询是否有x存在
            int k = find(x);
            cout<<(h[k] == x ? "Yes" : "No")<<endl;
        }
    }
    return 0;
}

字符串哈希

https://www.acwing.com/problem/content/843/
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

#include<iostream>
using namespace std;
const int N = 1e5 + 10, p = 131; //p为131或13331,2的64次方,溢出int就等效于取模了
unsigned long long a[N], b[N]; //a存储前缀和,b存储要乘的进位数
char s[N];
int n, m;

//初始化
void init(){
    b[0] = 1;
    for(int i = 1; i <= n; i++){
        a[i] = a[i - 1] * p + s[i];
        b[i] = b[i - 1] * p;
    }
}

unsigned long long get(int l, int r){
    return a[r] - a[l - 1] * b[r - l + 1];
}

int main(){
    cin>>n>>m>>s + 1;
    init();
    int l1, r1, l2, r2;
    while(m--){
        cin>>l1>>r1>>l2>>r2;
        cout<<(get(l1, r1) == get(l2, r2) ? "Yes" : "No")<<endl;
    }
    return 0;
}

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

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

相关文章

mysq开启慢查询日志,对慢查询进行优化

1.创建实验的环境 创建对应的数据库&#xff0c;然后写脚本向数据库中写入400万条的数据 //创建实验用的数据库 CREATE DATABASE jsschool;//使用当前数据库 USE jsschool;//创建学生表 CREATE TABLE student (sno VARCHAR(20) PRIMARY KEY COMMENT 学生编号,sname VARCHAR(20…

《21天精通IPv4 to IPv6》第0天:IPv4至IPv6的必要性与互联网IP资源发展趋势浅谈

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

【linux系统体验】-archlinux简易折腾

archlinux 一、系统安装二、系统配置及美化2.1 中文输入法2.2 安装virtualbox增强工具2.3 终端美化2.4 桌面面板美化 三、常用命令 一、系统安装 安装步骤人们已经总结了很多很全: Arch Linux图文安装教程 大体步骤&#xff1a; 磁盘分区安装 Linux内核配置系统&#xff08;…

JCIM | MD揭示PTP1B磷酸酶激活RtcB连接酶的机制

Background 内质网应激反应&#xff08;UPR&#xff09; 中的一个重要过程。UPR是由内质网中的三种跨膜传感器&#xff08;IRE1、PERK和ATF6&#xff09;控制的细胞应激反应&#xff0c;当内质网中的蛋白质折叠能力受到压力时&#xff0c;UPR通过减少蛋白质合成和增加未折叠或错…

vscode远程连接失败

目录 解决方案尝试1解决方案尝试2 解决方案尝试1 最近通过vscode一直使用腾讯云的服务器作为远程开发环境&#xff0c;以前一直很好用。 直到最近重装了系统之后&#xff0c;发现vscode没法对云服务器进行连接了&#xff0c;即使在远程主机添加了本地的公钥也不行。直接报错:…

vb.net极简版扫雷16*16,40雷源代码,仅供学习和参考

效果图&#xff1a;下载地址&#xff1a;链接&#xff1a;https://pan.baidu.com/s/14rrZujpQbfs-9HMw_lL-3Q?pwd1234 提取码&#xff1a;1234 源代码&#xff1a;只有120行 Imports System.Math Public Class Form1Dim Booms As New List(Of Point)Dim MyBooms As New List…

推荐系统|物品冷启动01_优化目标评价(包括基尼系数)

文章目录 物品冷启动冷启动的类型“新”按常规推送链路的角度按产品生态角度 物品冷启动的目标和评价指标作者侧用户侧 冷启动的衡量 物品冷启动 冷启动的类型 冷启动的内容种类包括很多方面&#xff0c;本文只介绍UGC的冷启动。 所谓UGC&#xff0c;就是User Generate Conte…

leetcode(二分查找)35.搜索插入位置(C++详细解释)DAY6

文章目录 1.题目示例提示 2.解答思路3.实现代码结果 4.总结 1.题目 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。…

利用YOLOv8 pose estimation 进行 人的 头部等马赛克

文章大纲 马赛克几种OpenCV 实现马赛克的方法高斯模糊pose estimation 定位并模糊:三角形的外接圆与膨胀系数实现实现代码实现效果参考文献与学习路径之前写过一个文章记录,怎么对人进行目标检测后打码,但是人脸识别有个问题是,很多人的背影,或者侧面无法识别出来人脸,那…

python从入门到精通(十):python常见标准库的使用

python数据分析和可视化基础 &#xff08;一&#xff09;Python 中处理日期和时间的模块time导入time模块time获取当前时间戳localtime获取当前时间struct_timeasctime获取格式化的时间ctime获取格式化的时间gmtime获取格式化的时间计时器功能strftime格式化日期strptime格式化…

顶级思维方式——认知篇三(财富与金钱)

目录 1、 什么是财富/财富的定义&#xff1f; 2、财富的影响 3、 财富意味着什么&#xff1f; 4、财富与幸福的关系 5、物质财富如何使用才有实际意义&#xff1f; 6、金钱的运作方式 7、【物质财富自由】后的选择 1、 什么是财富/财富的定义&#xff1f; 财富是一个多维…

MOMENTUM: 1

攻击机 192.168.223.128 目标机 192.168.223.146 主机发现 nmap -sP 192.168.223.0/24 端口扫描 nmap -sV -p- -A 192.168.223.146 开启了22 80端口 看一下web界面 随便打开看看 发现这里有个参数id&#xff0c;sql尝试无果&#xff0c;发现写入什么&#xff0c;网页显示…

2014-2022上市公司纳税信用评级、企业税务评级数据

2014-2022上市公司纳税信用评级、企业税务评级数据 1、时间&#xff1a;2014-2022年 2、来源&#xff1a;上市公司信用BG 3、指标&#xff1a;code&#xff0c;year&#xff0c;证券代码&#xff0c;纳税人名称。统一社会信用代码&#xff0c;纳税信用评级 4、样本量&#…

整合RabbitMQ实现消息异步发送

消息队列中间件 消息队列中间件是分布式系统中重要的组件&#xff0c;主要解决应用耦合&#xff0c;异步消息&#xff0c;流量削峰等问题。 中间件最标准的用法是生产者生产消息传送到队列&#xff0c;消费者从队列中拿取消息并处理&#xff0c;生产者不用关心是谁来消费&#…

《21天精通IPv4 to IPv6》第5天:IPv4与IPv6共存策略——如何为不同的系统实现IPv4与IPv6共存问题?

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

华为OD机试 - 分配土地( Python C C++ JavaGo JS PHP)

题目描述 从前有个村庄&#xff0c;村民们在各种田地上插上小旗子&#xff0c;每个旗子上都标识了一个数字。现在&#xff0c;村民们想要找出一个包含相同数字的最小矩形区域&#xff0c;并将这块土地分配给对村庄做出巨大贡献的村民。我们需要找出这个矩形区域的最大面积。 …

SPI NOR FLASH和SPI NAND FLASH

SPI NOR FLASH和SPI NAND FLASH是两种不同的存储设备&#xff0c;它们在硬件接口和软件应用上都有所不同。以下是关于这两种存储设备更详细的介绍&#xff1a; 1.SPI NOR FLASH SPI NOR FLASH是一种非易失性存储器&#xff0c;它通过串行接口进行数据传输&#xff0c;具有读写…

C#使用哈希表对XML文件进行查询

目录 一、使用的方法 1.Hashtable哈希表 2.Hashtable哈希表的Add方法 &#xff08;1&#xff09;定义 &#xff08;2&#xff09;示例 3.XML文件的使用 二、实例 1.源码 2.生成效果 可以通过使用哈希表可以对XML文件进行查询。 一、使用的方法 1.Hashtable哈希表…

一文读懂:Docker从入门到进阶(超详细实践应用、零踩坑)

文章目录 快速入门简介安装配置镜像加速部署MySQL Docker基础常见命令案例-部署Nginx命令别名数据卷挂载本地目录挂载DockerFile语法自定义镜像容器网络互联 项目部署部署Java应用部署前端DockerCompose 快速入门 简介 Docker是一个快速构建、运行、管理应用的工具。 传统的…

【Linux】学习-基础IO拓展篇

Linux基础IO拓展篇—详解文件系统 理解文件系统 在Linux基础IO篇中&#xff0c;我们站在用户的视角对文件进行了理解&#xff0c;主要是针对被打开的文件&#xff0c;那么有没有没有被打开的文件呢&#xff1f;当然有&#xff01;今天我们换个视角&#xff0c;来站在系统的角…