当前位置: 首页 > news >正文

位运算,双指针,二分,排序算法

文章目录

  • 位运算
    • 二进制中1的个数
    • 题解
    • 代码
    • 我们需要0
    • 题解
    • 代码
  • 排序
    • 模版排序1
    • 题解
    • 代码
    • 模版排序2
    • 题解
    • 代码
    • 模版排序3
    • 题解
    • 代码
  • 双指针
    • 最长连续不重复子序列
    • 题解
    • 代码
  • 二分
    • 查找
    • 题解
    • 代码

位运算

在这里插入图片描述
在这里插入图片描述

1. bitset< 16 >将十进制数转为16位的二进制数

int x = 25;
cout << bitset<16>(x) << endl;

二进制中1的个数

在这里插入图片描述

题解

1. 就是每个数与上1判断低位是否是1,是1就加,否则不加,判断完后,这个数右移1位,再判断,直到这个数变为0为止

代码

// 3  011 & 001  1 count++
//        >> 001 & 001 1 count++
#include<iostream>
#include<vector>
using namespace std;

int main()
{
    int n;
    cin >> n;
    vector<int> v(n);
    for (int i = 0; i < n; i++)
        cin >> v[i];
    for (int i = 0; i < n; i++)
    {
        int count = 0;
        int val = v[i];
        while (val)
        {
            if (val & 1)
                count++;
            val /= 2;
        }
        v[i] = count;
    }
    for (int i = 0; i < n; i++)
        cout << v[i] << " ";

    return 0;
}

我们需要0

在这里插入图片描述

题解

1. 利用了x ^ x = 0和0 ^ x = x这两个性质

代码

// 1 ^ 2  ^ 3 ^ x ^ x ^ x  
// 1 ^ 2 ^ 3 ^ x = 0
// 1 ^ 2 ^ 3 ^ x ^ x == 0 ^ x
// 1 ^ 2 ^ 3 == x

#include<iostream>
#include<vector>
using namespace std;

int main()
{
    int t, n;
    cin >> t;
    int k = 0;
    int x = 0;

    while (t--)
    {
        cin >> n;
        vector<int> v(n+1);
        int sum = 0;
        for (int i = 1; i <= n; i++)
            cin >> v[i];
        for (int i = 1; i <= n; i++)
            sum ^= v[i];

       cout << sum << '\n';
    }

    return 0;
}

排序

在这里插入图片描述

1. 使用unique之前要确保数组是有序的,有序的才能确保所有元素都是唯一的
2.unique会把重复的元素移动到数组的末尾,最后返回第一个重复元素的迭代器

模版排序1

在这里插入图片描述

题解

1. 先排序,然后用unique进行返回第一个重复元素的迭代器,最后用erase删除这些重复元素

代码

#include<iostream>
#include<vector>
#include<algorithm>

using namespace std;

int main()
{
    int n;
    cin >> n;
    vector<int> v(n);
    for(int i = 0;i < n;i++)
    cin >> v[i];

    sort(v.begin(),v.end());
    v.erase(unique(v.begin(),v.end()),v.end());
    for(auto x : v)
    cout << x << " ";

    return 0;
}

模版排序2

在这里插入图片描述

题解

1. 自己写一个排序的逻辑,自定义类型的排序
2.升序的,逆置完之后就可以变为降序的了

代码

#include<iostream>
#include<vector>
#include<algorithm>

using namespace std;

const int N = 2e5 + 10;
struct Book
{
    int a;
    int b;
    int c;
    bool operator<(const Book& v) const
    {
        if (a == v.a && b == v.b) return c < v.c;
        if (a == v.a) return b < v.b;
        return a < v.a;
    }

}u[N];

int main()
{
    int n = 0;
    cin >> n;
    for (int i = 0; i < n; i++)
        cin >> u[i].a >> u[i].b >> u[i].c;

    sort(u, u + n);
    reverse(u, u + n);

    for (int i = 0; i < n; i++)
        cout << u[i].a << " " << u[i].b << " " << u[i].c << '\n';

    return 0;
}

模版排序3

在这里插入图片描述

题解

1. 这题用了桶排序的思想
2.记录出现数字的次数,然后用次数控制循环,输出[ ]里的数就是存进去的数,可以按顺序输出了

代码

// 桶排序

#include<iostream>
#include<vector>
#include<algorithm>

using namespace std;

const int N = 2e5 + 10;
int v[N];

int main()
{
    int n = 0;
    cin >> n;
    

    for(int i = 1;i <= n;i++)
    {
       int x;
       cin >> x;
       v[x]++;
    }

    for(int i = 0;i <= 2e5;i++)
    {
        // v[i] 是出现的次数
        for(int j = 0;j < v[i];j++)
        {
            // i是出现的数字
            cout << i << " ";
        }
    }
    cout << '\n';

    return 0;
}

双指针

1. 一快一慢(快慢指针)
2.区间内维护某个东西(滑动窗口)

在这里插入图片描述

最长连续不重复子序列

在这里插入图片描述

题解

1. 开始的时候i = 1,j = 0
2.j向右走的条件j+1下标的数不在数组中
3. 如果出现重复的数,更新i,让i向后走
4. 代码中使用桶的思想解决

在这里插入图片描述

代码

#include<iostream>
#include<vector>
#include<algorithm>

const int N = 1e5 + 10;
using namespace std;
int a[N],b[N];

void solve()
{
    int n = 0;
    cin >> n;
    for(int i = 1;i <= n;i++) cin >> a[i];
    
    int ans = 0;
    // 初始化桶数组
    for(int i = 1;i <= n;i++) b[a[i]] = 0;

    for(int i = 1,j = 0;i <= n;i++)
    {
        // j < n并且后一个数不在桶数组中
        while(j < n && !b[a[j+1]]) b[a[++j]]++;
        
        // 更新最大长度
        ans = max(ans,j - i + 1);
        // i之后要++,让i往后走一个,把之前在桶数组中的数删除
        b[a[i]]--;
    }
    cout << ans << '\n';
}

int main()
{
    int T = 0;
    cin >> T;
    while(T--)
    {
        solve();
    }

    return 0;
}

二分

1. 二分的步骤
在这里插入图片描述
在这里插入图片描述

查找

在这里插入图片描述

题解

1. 保证了l始终小于r, l + 1 == r
2.这样保证了a[l] < x, a[r] >= x,后续可以判断a[r] == x

代码

#include<iostream>
#include<vector>
#include<algorithm>

using ll = long long;
const int N = 2e5 + 10;
using namespace std;
int a[N];

void solve()
{
    int n = 0, q = 0;
    cin >> n >> q;
    for (int i = 1; i <= n; i++) cin >> a[i];

    while (q--)
    {
        int x;
        cin >> x;
        int l = 0, r = n;
        while (l + 1 != r)
        {
            int mid = l + (r - l) / 2;
            if (a[mid] < x) l = mid;
            else r = mid;
        }

        if (a[r] == x) cout << r << " ";
        else cout << -1 << " ";
    }
}

int main()
{
    solve();

    return 0;
}

相关文章:

  • WeMos D1+PIR+Android 的小场景制作
  • freertos源码分析DAY12 (软件定时器)
  • 【第14章:神经符号集成与可解释AI—14.1 神经符号AI系统的基本原理与实现方法】
  • 一款简单的弹窗打赏页HTML源码
  • python入门详解
  • EasyRTC智能硬件:小体积,大能量,开启音视频互动新体验
  • ORB-SLAM3的源码学习: Settings.cc:Settings::readCamera1/readCamera2 从配置文件中加载相机参数
  • 【信息学奥赛一本通 C++题解】1282:最大子矩阵
  • Linux 文件与目录命令学习记录
  • 语音识别中的MFCC特征提取:时频分析如何转化为机器可理解的声学参数?(附完整代码实现)
  • Python常见面试题的详解7
  • Python爬虫系列教程之第四篇:数据存储与管理
  • Kubernetes-node(节点) 组件
  • Java 包装类详解
  • 04运维实用篇(D4_日志)
  • Windows Server 中配置 Active Directory:从零到精通
  • Kubernetes 概述
  • Ubuntu 下 nginx-1.24.0 源码分析 - ngx_cycle_t 类型
  • 数据库基本概念及基本使用
  • AcWing 801. 二进制中1的个数
  • 观众走入剧院空间,人艺之友一起“再造时光”
  • 阶跃星辰CEO姜大昕:追求智能上限仍是最重要的事,多模态的“GPT-4时刻”尚未到来
  • 吉林市马拉松5月18日开赛,奖牌、参赛服公布
  • 高盛上调A股未来12个月目标点位,沪深300指数潜在回报15%
  • 越秀地产前4个月销售额约411.2亿元,达年度销售目标的34.1%
  • 中邮保险斥资8.69亿元举牌东航物流,持股比例达5%