一些写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.mzph.cn/web/53038.shtml

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

相关文章

部分动态铜皮的孤岛无法删除。报错

(SPMHCI-1): Cannot break shape into fragments. 网上寻找了很多答案&#xff0c;都不太理想&#xff0c;不是我想要的方法。 终于功夫不负有心人&#xff0c;在Cadence官方论坛找到了蛛丝马迹。 Breaking Static shape into fragments - PCB Design - PCB Design & IC …

uniapp 做一个查看图片的组件,图片可缩放移动

因为是手机端&#xff0c;所以需要触摸可移动&#xff0c;双指放大缩小。 首先在components里建个组件 查看图片使用 uni-popup 弹窗 要注意 transform的translate和scale属性在同一标签上不会一起生效 移动就根据触摸效果进行偏移图片 缩放就根据双指距离的变大变小进行缩…

【 html+css 绚丽Loading 】 000052 璇玑转轮

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f…

[网络]http的简单认识

文章目录 一. 什么是http二. http协议工作过程三. http协议格式1. 抓包工具fiddler2. http请求报文3. http响应报文 一. 什么是http HTTP (全称为 “超⽂本传输协议”) 是⼀种应⽤⾮常⼴泛的 应⽤层协议 HTTP 诞⽣与1991年. ⽬前已经发展为最主流使⽤的⼀种应⽤层协议 HTTP 往…

MyBatis中多对一关系的三种处理方法

目录 MyBatis中多对一关系的三种处理方法 1.通过级联属性赋值 1&#xff09;mapper 2&#xff09;mapper.xml 3&#xff09;测试代码 4&#xff09;测试结果 2.通过标签 1&#xff09;mapper 2&#xff09;mapper.xml 3&#xff09;测试代码 4&#xff09;测试结果 3.分步查询 …

【C++二叉树】102.二叉树的层序遍历

107. 二叉树的层序遍历 II - 力扣&#xff08;LeetCode&#xff09; 思路分析&#xff1a; 层序遍历&#xff0c;但是要注意输出的结果是一个二维数组&#xff0c;不是一层一个值一个值的输出&#xff0c;而是要一层一层的输出。可以通过一个循环控制每一层的数据个数&#xff…

PyCharm 安装教程

传送门 PyCharm 是一款由 JetBrains 开发的强大的 Python 集成开发环境&#xff08;IDE&#xff09;。它支持多种功能&#xff0c;包括调试、代码补全、智能代码分析、版本控制集成等&#xff0c;特别适合开发 Python 项目。接下来&#xff0c;我们将详细介绍如何在不同操作系…

【C++高阶】解锁C++的深层魅力——探索特殊类的奥秘

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ ⏩收录专栏⏪&#xff1a;C “ 登神长阶 ” &#x1f921;往期回顾&#x1f921;&#xff1a;C 类型转换 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀C特殊类 &#x1f4d2;1. 不能被拷贝…

文字loading加载

效果 1. 导入库 import sys from PyQt5.QtCore import QTimer, Qt, QThread, pyqtSignal from PyQt5.QtGui import QPainter, QFont, QColor, QBrush from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QPushButton, QProgressBar, QLabel 代码首先导入了P…

C++ | Leetcode C++题解之第409题最长回文串

题目&#xff1a; 题解&#xff1a; class Solution { public:int longestPalindrome(string s) {unordered_map<char, int> count;int ans 0;for (char c : s)count[c];for (auto p : count) {int v p.second;ans v / 2 * 2;if (v % 2 1 and ans % 2 0)ans;}retur…

【设计模式-外观】

这里写自定义目录标题 定义UML图角色作用代码使用场景 定义 为子系统中一组相关接口提供一致界面&#xff0c;定义一个高级接口&#xff0c;使得子系统更加容易使用。 UML图 角色作用 外观&#xff08;Facade&#xff09;角色&#xff1a;这是外观模式的核心&#xff0c;它知…

macOS上谷歌浏览器的十大隐藏功能

谷歌浏览器&#xff08;Google Chrome&#xff09;在macOS上拥有一系列强大而隐蔽的特性&#xff0c;这些功能能显著提高您的浏览体验。从多设备同步到提升安全性和效率&#xff0c;这些被低估的功能等待着被发掘。我们将逐步探索这些功能&#xff0c;帮助您最大化利用谷歌浏览…

力扣题解815

大家好&#xff0c;欢迎来到无限大的频道。祝大家中秋节快乐​。 今日继续给大家带来力扣题解。 题目描述&#xff08;困难&#xff09;​&#xff1a; 公交路线 给你一个数组 routes &#xff0c;表示一系列公交线路&#xff0c;其中每个 routes[i] 表示一条公交线路&…

Python logging库(python日志库)Logger(记录器、收集器、采集器)、Handler(处理器)、Formatter(格式化器)、Log Level(日志级别)

文章目录 Python Logging库详解简介日志记录的基本概念1. Logger&#xff08;记录器&#xff09;&#xff1a;这是日志系统的入口点。每个记录器都有一个名称&#xff0c;并且记录器之间可以存在父子关系。2. Handler&#xff08;处理器&#xff09;&#xff1a;记录器将日志消…

网络安全-intigriti-0422-XSS-Challenge Write-up

目录 一、环境 二、解题 2.1看源码 一、环境 Intigriti April Challenge 二、解题 要求&#xff1a;弹出域名就算成功 2.1看源码 我们看到marge方法&#xff0c;肯定是原型链污染题目 接的是传参&#xff0c;我们可控的点在于qs.config和qs.settings&#xff0c;这两个可…

Java设计模式—面向对象设计原则(四) ----->接口隔离原则(ISP) (完整详解,附有代码+案例)

文章目录 3.4 接口隔离原则(ISP)3.4.1 概述3.4.2 案列 3.4 接口隔离原则(ISP) 接口隔离原则&#xff1a;Interface Segregation Principle&#xff0c;简称ISP 3.4.1 概述 客户端测试类不应该被迫依赖于它不使用的方法&#xff1b;一个类对另一个类的依赖应该建立在最小的接…

Invoke-Maldaptive:一款针对LDAP SearchFilter的安全分析工具

关于Invoke-Maldaptive MaLDAPtive 是一款针对LDAP SearchFilter的安全分析工具&#xff0c;旨在用于对LDAP SearchFilter 执行安全解析、混淆、反混淆和安全检测。 其基础是 100% 定制的 C# LDAP 解析器&#xff0c;该解析器处理标记化和语法树解析以及众多自定义属性&#x…

Excel图片批量插入单元格排版处理插件【图片大师】

为了方便大家在图片的插入排版的重复工作中解放出来&#xff0c;最近发布了一款批量插入图片的插件&#xff0c;欢迎大家下载&#xff0c;免费试用。 这是图片的文件夹&#xff1a; 主要功能如下: 1&#xff0c;匹配单元格名称的多张图批量插入到一个单元格 该功能支持设置图…

腾讯百度阿里华为常见算法面试题TOP100(4):双指针、哈希、滑动窗口

之前总结过字节跳动TOP50算法面试题&#xff1a; 字节跳动常见算法面试题top50整理_沉迷单车的追风少年-CSDN博客_字节算法面试题 目录 双指针 42.接雨水 283.移动零 11.盛最多水的容器 15.三数之和 哈希 1. 两数之和 49.字母异位词分组 128.最长连续序列 滑动窗…

网络协议全景:Linux环境下的TCP/IP、UDP

目录 1.UDP协议解析1.1.定义1.2.UDP报头1.3.特点1.4.缓冲区 2.TCP协议解析2.1.定义2.2.报头解析2.2.1.首部长度&#xff08;4位&#xff09;2.2.2.窗口大小2.2.3.确认应答机制2.2.4.6个标志位 2.3.超时重传机制2.4.三次握手四次挥手2.4.1.全/半连接队列2.4.2.listen2.4.3.TIME_…