一些写leetcode的笔记

  1. 标准库中的string类没有实现像C#和Java中string类的split函数,所以想要分割字符串的时候需要我们自己手动实现。但是有了stringstream类就可以很容易的实现,stringstream默认遇到空格、tab、回车换行会停止字节流输出。
#include <sstream>
#include <iostream>int main()
{std::stringstream ss("this apple is sweet");std::string word;while (ss >> word){std::cout << word << std::endl;   // 这里依次输出this、apple、is、sweet四个单词}return 0;
}
  1. 可以使用getline()函数用其他字符分割字符串,第一个参数 - 流中获取数据,第二个参数 - 把数据转换成字符串,第三个参数 - 分隔符。
#include <sstream>
#include <iostream>int main()
{std::string str = "this,is,apple";std::istringstream ss(str);std::string token;while (std::getline(ss, token, ',')) {std::cout << token << '\n';        // 这里依次输出this、is、apple三个单词}return 0;
}
  1. 匿名函数实现一个功能,输入一个由空格分割单词的字符串,就计算出每个单词的出现频率:
unordered_map<string, int> freq;auto insert = [&](string s) {stringstream ss(s);string word;while (ss >> word) {++freq[move(word)];}};insert(s1);
  1. accumulate是numeric库中的一个函数,主要用来对指定范围内元素求和,但也自行指定一些其他操作,如范围内所有元素相乘、相除等。
int main() {vector<int> arr{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};int sum = accumulate(arr.begin(), arr.end(), 0); // 初值0 + (1 + 2 + 3 + 4 +... + 10)int sum = accumulate(arr.begin(), arr.end(), 1, multiplies<int>()); // 初值1 * (1 * 2 * 3 * 4 *... * 10)cout << sum << endl;	return 0;
}
  1. 计算gcd 最大公约数的算法
int gcd(int a, int b){return b ? gcd(b, a % b) : a;
},
  1. C++取均匀随机数的方法
mt19937 gen{random_device{}()};//声明:产生器+种子。
//--上面这俩需要#include<random>
//由于gen的初始化里面也是一个发生器,因此要{}
// random_device先加{}产生一个随机产生器对象,再()产生种子
uniform_int_distribution<int> dis(15);//声明:取数器
int ans = dis(gen);//ans是1~5中均匀概论取到的。
  1. 对一个数组中每个元素进行第三项中函数的判断
return all_of(arr.begin(), arr.end(), [n](int x){ return x %n  == 0; });
  1. 位运算中 x&(x-1) 相当于把 x 的最后一位1去掉:
// 衍生题:统计一个数二进制表示中1的个数
int func(x) 
{ int countx = 0; while(x) { countx ++; x = x&(x-1); } return countx; 
}

如果 n是正整数并且 n & (n - 1) = 0,那么 n 就是 2的幂;如果 n是正整数并且 n & (-n) = n,那么 n就是 2的幂。
令 y=x & (x−1),则 y 为 将x的最末位的1改成0的数字。
x除以2 可以通过x>> 1(x右移一位得到),x除以2的余数可以通过 x& 1得到

x&(-x)的用途:
1.可用于获取某个二进制数的最低位1所对应的值
2.求一个偶数能被整除的最大的二次幂

在这里插入图片描述

lower_bound( )和upper_bound( )都是利用二分查找的方法在一个排好序的数组中进行查找的。

在从小到大的排序数组中,

lower_bound( begin,end,num):从数组的begin位置到end-1位置二分查找第一个大于或等于num的数字,找到返回该数字的地址,不存在则返回.end()。通过返回的地址减去起始地址begin,得到找到数字在数组中的下标。

upper_bound( begin,end,num):从数组的begin位置到end-1位置二分查找第一个大于num的数字,找到返回该数字的地址,不存在则返回.end()。通过返回的地址减去起始地址begin,得到找到数字在数组中的下标。

  1. 优先队列-小顶堆
/*优先队列-小顶堆*/static bool cmp(pair<int,int> &m,pair<int,int> &n){return m.second>n.second;}//C++11新标准引入了decltype类型说明符,它的作用是选择并返回操作数的数据类型
//在此过程中,编译器分析表达式并得到它的类型,却不实际计算表达式的值。
// 升序队列,先弹小的元素出来:priority_queue
priority_queue<pair<int,int>,vector<pair<int,int>>,decltype(&cmp)> q(cmp);
> 基本数据类型的优先级设置:(即可以直接使用的数据类型),优先队列对他们的优先级设置一般是数字越大的优先级越高,因此队首是优先级最大的那个(如果是 char 类型,则是字典序最大的)。以 int 型为例下面两种是等价的:
> > priority_queue<int>q;
> > priority_queue<int,vector<int>,less<int> >q;
> > 可以发现第二种定义方式的尖括号内多出了两个参数:其中 vector<int>填写的是承载底层数据结构堆 (heap)的容器,如果是其他类型 可写为 vector<char>或vector<char>;
> 
> 
> //构造一个空的优先队列,此优先队列是一个小顶堆
> 
> priority_queue<int,vector<int>,greater<int> > small_heap;
> > 第三个参数 less<int> 则是对第一个参数的比较类,!!less<int> 表示数字大的优先级越大,而 greater<int> 表示数字小的优先级越大。
>
^ ”的异或指的是二进制中,对应的对应二进制位相同时异或为零,相异时异或为一1、任何数和 0 做异或运算,结果仍然是原来的数,即 a⊕0=a 
2、任何数和其自身做异或运算,结果是 0,即 a⊕a=0
3、异或运算满足交换律和结合律,即 a⊕b⊕a=b⊕a⊕a=b⊕(a⊕a)=b⊕0=b
4、x=ai⊕aj 等价于 aj=x⊕ai// 通过异或来判断两个数的正负
if (numeratorLong < 0 ^ denominatorLong < 0) {sb.append('-');}
  1. 关于 substr:

//如果我要取索引i到索引j这一段子串,就使用:
substr(i,j-i+1)
// 数字转字符串
string str = to_string( int value ); 
to_string( float value );
to_string( long value );// 数字转字符
s[i]+'0';// 字符转数字
s[i]-'0';// 数字字符串转成数字
char a[]="-100";  char b[]="123";  int c;
c=atoi(a.c_str())+atoi(b.c_str());
printf("c=%d\n",c); //c = 23//判断一个字符是否为字母或者数字:
//字母(不区分大小写):
isalpha();
// 数字
isdigit();
//字母和数字
isalnum();// 字符串转数字:stoi(字符串,起始位置,n进制),将 n 进制的字符串转化为十进制
string s = "12345";
int num1 = stoi(s);
  1. 利用快慢指针来找到链表的中间节点
ListNode* getMidNode (ListNode* head){ListNode* fast = head;ListNode* slow = head;while(fast->next != nullptr && fast->next->next != nullptr){fast = fast->next->next;slow = slow->next;}return slow;}
  1. 在 C++ 中,可以使用 std::map 来实现键值对的有序存储,但是 std::map 默认是按照键(key)的升序进行排序的。希望按照值(value)进行排序,然后在值相同时再按照键进行排序,需要借助一个辅助数据结构来实现。一种常用的方法是使用 std::vector 来存储 std::map 中的键值对,然后对 std::vector 进行排序,并且自定义排序规则。
#include <iostream>
#include <map>
#include <vector>
#include <algorithm>int main() {using namespace std; // 引入命名空间,可以省略 std::// 定义一个 map,假设键为字符串,值为整数map<string, int> myMap = {{"apple", 3},{"orange", 2},{"banana", 1},{"grape", 2}};// 定义一个 vector 来存储 map 中的键值对vector<pair<string, int>> vec(myMap.begin(), myMap.end());// 使用 Lambda 表达式定义排序规则sort(vec.begin(), vec.end(), [](const pair<string, int>& a, const pair<string, int>& b) {if (a.second == b.second) {  // 如果值相同,按照键进行升序排序return a.first < b.first;}return a.second < b.second;  // 否则按照值进行升序排序});// 打印排序后的结果for (const auto& pair : vec) {cout << pair.first << ": " << pair.second << endl;}return 0;
}
  1. 如果我想在unordered_set中存储整数对时,可以使用自定义哈希函数:
using PII = pair<int,int>;auto hash_function = [](const PII& o){return hash<int>()(o.first) ^ hash<int>()(o.second);};unordered_set<PII,decltype(hash_function)> seen(0,hash_function);
  1. 裴蜀定理(或贝祖定理)得名于法国数学家艾蒂安·裴蜀,说明了对任何整数a、b和它们的最大公约数d,关于未知数x和y的线性不定方程(称为裴蜀等式):若a,b是整数,且gcd(a,b)=d,那么对于任意的整数x,y,ax+by都一定是d的倍数,特别地,一定存在整数x,y,使ax+by=d成立。

它的一个重要推论是:a,b互质的充分必要条件是存在整数x,y使ax+by=1.

  1. lamda函数+优先队列的写法:
auto cmp = [&nums1,&nums2](const pair<int,int> &a,const pair<int,int> &b){return nums1[a.first]+nums2[a.second]> nums1[b.first]+nums2[b.second];};priority_queue<pair<int,int>, vector<pair<int,int>>, decltype(cmp)> pq(cmp);
  1. 发现的一个小规律:

在一个环内,如果设置快慢指针,如果 fast 比 slow 的起始位置 前一个,此后 slow走一步,fast走2步,二者最终会在 起始点的 前一个位置(也就是走入下一次环的最后位置) 重合。

(1+2n) % x = n % x , n = x-1时 等式成立

  1. Dilworth定理

对于任意有限偏序集,其最大反链中元素的数目必等于最小链划分中链的数目。此定理的对偶形式亦真。

二 偏序集中的概念

链 : D 中的一个子集 C 满足 C 是全序集 及C中所有元素都可以比较大小

反链 : D 中的一个子集 B 满足 B 中任意非空子集都不是全序集 即所有元素之间都不可以比较大小

链覆盖 : 若干个链的并集为 D ,且两两之间交集为 ∅

反链覆盖 : 若干个反链的并集为 D ,且两两之间交集为∅

最长链 : 所有链中元素个数最多的 (可以有多个最长链)

最长反链 : 所有反链中元素个数最多的 (可以有多个最长反链

偏序集高度 : 最长链的元素个数
偏序集宽度 : 最长反链中的元素个数

最小链覆盖(使链最少)= 最长反链长度 = 偏序集宽度

最小反链覆盖=最长链长度=偏序集深度

该定理可以应用在拦截导弹的题目中,题目问这个序列最少可以划分为多少个非递增序列,根据Dilworth定理,我们只需求最长上升子序列的长度就是答案

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

六、二分搜索-算法总结

文章目录 六、二分搜索6.1 简介6.2 典型实例 -- 二分查找6.2 模板6.3 常见题目6.3.1 搜索插入位置6.3.2 搜索二维矩阵6.3.3 寻找旋转排序中数组中的最小值6.3.4 寻找旋转排序数组中的最小值 II6.3.5 搜索旋转排序数组6.3.6 搜索旋转排序数组 II 总结 六、二分搜索 6.1 简介 给…

电学基础概念详解及三相电公式汇总

​​​​​​​ 本文全面介绍了电路的基本组成、电学核心概念以及三相电的常用公式。首先&#xff0c;通过水力学中的现象类比&#xff0c;生动解释了电路中电池、开关、电阻和灯泡等元素的功能&#xff0c;帮助读者更好地理解电压、电流和电阻之间的关系。随后&#xff0c;详…

【笔记】进制转换

文章目录 一、任意进制转十进制1、整数转化成十进制&#xff08;1&#xff09;二进制转十进制&#xff08;2&#xff09;八进制转十进制 2、小数转化成十进制&#xff08;1&#xff09;二进制转十进制&#xff08;2&#xff09;八进制转十进制 3、代码1、整数转化成十进制2、小…

OpenCV-Python笔记(上)

安装 全局安装 pip install opencv-python项目虚拟环境安装 # 进入项目根路径执行 .venv/bin/pip install opencv-python计算机眼中的图像 一张图片由大小比如&#xff08;100*100&#xff09;决定&#xff0c;说明存在100*100的像素点&#xff0c;每个像素点存在颜色通道&…

Neo4j入门案例:西游记

创建一个基于《西游记》中“孙悟空”的黑神话版本的知识图谱。这个图谱将会包括《西游记》中的一些主要角色、地点、事件以及它们之间的关系。我们将创建至少10个节点和20个关系&#xff0c;并提供相应的Cypher语句。 数据模型定义 实体类型&#xff08;节点&#xff09; 角色…

Nuxt Kit 组件管理:注册与自动导入

title: Nuxt Kit 组件管理:注册与自动导入 date: 2024/9/15 updated: 2024/9/15 author: cmdragon excerpt: Nuxt Kit 为组件的注册和导入提供了灵活高效的解决方案。无论你是要批量导入组件,还是单独处理特定组件,这些工具都能够满足你的需求。使用这些方法可以显著提升…

路径规划——D*算法

路径规划——D*算法 D Star算法是一种用于动态环境下的算法&#xff0c;它可以在环境变化时快速更新路径。 算法原理 D Star算法是一种反向增量式搜索算法&#xff0c;反向即算法从目标点开始向起点逐步搜索&#xff1b;增量式搜索&#xff0c;即算法在搜索过程中会计算每一…

Navicat On-Prem Server 2.0 | MySQL与MariaDB基础管理功能正式上云

近日&#xff0c;Navicat 发布了 Navicat On-Prem Server 2.0 的重大版本更新。这标志着这款自2021年首发的私有云团队协作解决方案迈入了一个崭新的阶段。此次2.0版本的飞跃性升级&#xff0c;核心聚焦于MySQL与MariaDB基础管理功能的全面革新与强化&#xff0c;赋予了用户的操…

leaflet【十】实时增加轨迹点轨迹回放效果实现

实时轨迹回放 在前面有用leaflet-trackplayer实现了一个轨迹回放的效果&#xff0c;单击前往&#xff1a;轨迹回放效果&控制台控制轨迹运动效果 这篇文章主要是实现一下实时增加轨迹点&#xff0c;不改变原来运行轨迹和速度。这里是简易做了一个demo效果&#xff0c;大概…

计算机网络 --- 【1】欢迎来到计算机网络/计算机网络基本概念/计算机网络、互连网、互联网的区别

目录 一、计算机网络学什么&#xff1f; 二、 什么是计算机网络&#xff1f;计算机网络、互联网(因特网&#xff0c;Internet)、互连网(internet)之间的区别&#xff1f; 2.1 计算机网络的定义 2.2 计算机网络与互连网的区别 2.3 互连网 三、总结部分 一、计算机网络学…

Nginx+Tomcat(负载均衡、动静分离)

目录 一、Nginx概述 1.Nginx应用 二、正向代理和反向代理 1.正向代理 1.1主要作用 1.2工作原理 2.反向代理 2.1主要作用 2.2工作原理 三、负载均衡模式 1.轮询 2.最少连接数 3.IP 哈希 4.加权轮询 5.最少时间算法 6.一致性哈希 四、规划部署负载均衡和反向…

oracle数据库安装和配置详细讲解

​ 大家好&#xff0c;我是程序员小羊&#xff01; 前言&#xff1a; Oracle 数据库是全球广泛使用的关系型数据库管理系统 (RDBMS)&#xff0c;提供高性能、可靠性、安全性和可扩展性&#xff0c;广泛应用于企业关键任务系统。下面详细介绍如何在 CentOS 系统上安装和配置 Or…

【Android 13源码分析】WindowContainer窗口层级-1-初识窗口层级树

在安卓源码的设计中&#xff0c;将将屏幕分为了37层&#xff0c;不同的窗口将在不同的层级中显示。 对这一块的概念以及相关源码做了详细分析&#xff0c;整理出以下几篇。 【Android 13源码分析】WindowContainer窗口层级-1-初识窗口层级树 【Android 13源码分析】WindowCon…

智能家居环境监测系统设计(论文+源码)

1. 系统方案 系统由9个部分构成&#xff0c;分别是电源模块、烟雾传感器模块、GSM发送短信模块、报警模块、温度传感器模块、人体红外感应模块、按键设置模块、显示模块、MCU模块。各模块的作用如下&#xff1a;电源模块为系统提供电力&#xff1b;烟雾传感器模块检测烟雾浓度&…

[项目实战]EOS多节点部署

文章总览&#xff1a;YuanDaiMa2048博客文章总览 EOS多节点部署 &#xff08;一&#xff09;环境设计&#xff08;二&#xff09;节点配置&#xff08;三&#xff09;区块信息同步&#xff08;四&#xff09;启动节点并验证同步EOS单节点的环境如何配置 &#xff08;一&#xf…

开放系统,面向各类业务需求可提供定制化服务的智慧物流开源了

智慧物流视频监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒&#xff0c;省去繁琐重复的适配流程&#xff0c;实现芯片、算法、应用的全流程组合&#xff0c;从而大大减少企业级应用约95%的开发成本。构建基于Ai技术的…

计算机毕业设计 智慧物业服务系统的设计与实现 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

Python数据分析 Pandas库-初步认识

Python数据分析 Pandas库-初步认识 认识Pandas ​ pandas是一个非常实用的Python工具&#xff0c;我们可以把它想象成一个超级强大的表格处理工具&#xff0c;它比Excel更智能&#xff0c;操作更为简单。pands可以从各种文件格式&#xff08;CSV、JSON、SQL、Excel&#xff0…

ModbusTCP/RTU转Ethernet/IP(CIP)-Modbus设备与罗克韦尔AB的PLC之间通讯

IGT-DSER智能网关模块支持西门子、三菱、欧姆龙、罗克韦尔AB等各种品牌的PLC之间通讯&#xff0c;同时也支持PLC与Modbus协议的工业机器人、智能仪表、变频器等设备通讯。网关有多个网口、串口&#xff0c;也可选择WIFI无线通讯。无需PLC内编程开发&#xff0c;只要在IGT-DSER智…

AI大模型与产品经理:替代与合作的深度剖析

在创业的征途中&#xff0c;产品经理常常被外界以一种半开玩笑的口吻提及&#xff1a;“就差一个程序员了。”这句话背后&#xff0c;既蕴含着对产品经理创意与策略能力的认可&#xff0c;也揭示了技术实现环节对于产品成功不可或缺的重要性。然而&#xff0c;随着AI技术的飞速…