《算法笔记》之二(笔记)

1. vector:

1.定义:“变长数组”(长度依据需要而自动改变,节省空间,避免普通数组超内存)

代码定义:vector < typename > name;

注:(注意理解)
vector < vector < int > > name; 为 “二维双变长的数组”;
vector < int > vi[100]; 为 “二维:一维定长(100)、一维变长的数组”;

2.vector容器内元素的访问:

1.通过对“下标”访问:

对 vector < typename > vi 的 vector 容器而言,如:vi[0] - vi[vi.size()-1];

2.通过对“迭代器”访问:*迭代器的定义)

① “迭代器”相关:

定义:举例(其他类型类推):vector < typename >::iterator it;

3.对应函数:

push(赋值)、pop(类似于“栈”):push_back(i) ("i"为待插入的数值)、pop_back();

大小、长度获取:size();

清空:v.clear(); 等价于 erase(v.begin(),v.end());

插入与删除:insert(迭代器, 待插入的值); 、erase(单个迭代器、迭代器范围);
(注:“迭代器” 可理解为:“指针”)

4.用法总结:

5.易错点:

赋值:vi[0]=0;(×) vi.push_back(0);(√)

2. set:

1.定义:“集合”(1.自动有序;2.不含重复元素(结合数学定义记忆))

代码定义:set < typename > name;

2.set容器内元素的访问:(只能通过“迭代器”)

3.对应函数:

插入x(自动排序 & 去重):insert(x),时间复杂度:O(logN)(N为set内元素个数);
寻找:
删除:
“大小及清空” 二操作基本同 “vector”,时间复杂度:O(1),此处不再赘述;

4.用法总结:

3. string:

注意:使用前,引入头文件为 “”,不同于:“< cstring >” 或 “< string.h >”

1.定义:封装:处理字符串的一系列操作,简化编码

代码定义:如:string str;
初始化赋值:如:string str = “code”;(* 注意此处为 “双引号”)

2.string 容器内元素的访问:(1) 基于下标(前三种);(2) 基于 “迭代器”;
// 类似于“字符数组”的输出方式
string str1 = "code";
for (int i=0;i<int(str1.length());i++){printf("%c",str1[i]);
}
printf("\n");    // 为了方便看清楚、美观而换行// 使用"cin/cout":“直接”输入、输出一整行字符串(此处自由输入输出字符串)
string str2;
cin >> str2;
cout << str2 << endl;// 使用"printf"+"c_str()方法",输出一整行字符串(将其转换为“字符数组”)
string str3 = "love";
printf("%s\n",str3.c_str());// 基于 “迭代器” 的方法
string str4 = "work";
// string下,迭代器"it"的定义如下:
string::iterator it;
for (string::iterator it=str4.begin();it!=str4.end();it++){printf("%c",*(it));
}
printf("\n");    // 为了方便看清楚、美观而换行

注:string 同 vector ,支持直接对迭代器进行加减某个数字,如:str.begin()+3

3.对应函数:

(1)operator += ;这是string的加法,可将两个string直接拼接;
(2)compare operator;两个string类型可直接使用 “==;!=;<;<=;>;>=” 比较大小,比较规则是 “字典序”;
(3)获取大小及清空:size()/length(); clear();(同上,时间复杂度为:O(1))
(4)insert :① insert(pos,string); 在pos号位置插入字符串string;② insert(it,it2,it3); it为原字符串的欲插入位置,it2和it3为待插字符的首尾选代器用来表示串[it2,it3)将被插在it的位置上;

// 待拼接的两个子字符串
string str1 = "de";
string str2 = "co";// 用于存储:最终的字符串拼接结果
string str3, str4, str5;// 用"+"拼接
// 注意:被加数在前,加数在后
str3 = str2 + str1;// 用"insert"拼接
str4 = str1.insert(0, str2);// 输出结果:不要忘记"c_str()"
printf("%s\n", str3.c_str());
printf("%s\n", str4.c_str());// 用 “迭代器” 拼接
// 获取待插入字符串的首尾迭代器
string::iterator it1 = str2.begin();
string::iterator it2 = str2.end();
int index = distance(str1.begin(), it1);
str5 = str1.insert(index, it1, it2);printf("%s\n", str5.c_str());

(5) erase :删除单个元素、删除一个区间内所有元素;时间复杂度均为:O(N)

  1. str.erase(it)用于删除单个元素,it为需要删除的元素的迭代器;
  2. str.erase(first,last),其中first为需要删除的区间的起始选代器,而las 则为需要删除的区间的末尾迭代器的下一个地址,也即删除[first,last);
  3. str.erase(pos,length),其中pos为需要开始删除的起始位置,length为删除的字符个数;

(6) substr :获取子串
substr(pos,len) 返回从pos号位开始、长度为len的子串,时间复杂度为:O(len)

6. stack:

1.定义:先进后出

栈顶指针:始终指向栈顶最上方元素的一个标记(数组实现:int;链表实现:int*)
代码定义:stack < typename > name;
(typename可以为:任意基本数据类型或任意stl容器)

2.对应方法:

① 数组实现(《数据结构》部分,了解即可):

// 栈的建立(数组模拟)
st[10001] = {};// 清空(栈顶指针top置为"-1")
void clear () {top = -1;return;
};// 入栈(入栈元素i)
// 栈顶指针上移一位,到达对应地址 → 赋值入栈
void push (int i) {st[++top] = i;return;
};// 出栈(出栈元素i)
// 栈顶指针下移一位,到达对应地址
//(选择是否删除出栈元素)
void push () {top--;return;
};// 计算栈内元素总数(数组下标从"0"开始)
int size () {return top+1;
};// 判空(规定:栈顶指针为"-1"时"栈空")
bool empty () {if (top==-1)return true;elsereturn false;
};// 取栈顶元素(栈顶指针始终指向栈顶元素)
int get_top () {return st[top];
};

② STL容器实现:stl内容器 “stack” 的 各方法时间复杂度均为:O(1)
出栈:st.pop();
入栈("x"为入栈元素):st.push(x);
统计大小:st.size();
判空:st.empty();(返回bool值:true or false)
取栈顶元素:st.top();

清空:

// 如果栈不为空,则不断地pop栈顶元素,直至为空(效果等同于“清空栈”)
while (!st.empty()) {
st.pop();
};

3.用法总结:

stack 用于:模拟实现一些递归,防止“程序对栈内存的限制”,而导致程序出错。

9. algorithm 头文件下的常用函数:

1.max( )、min( )、abs( ):

image

2.swap(x, y) —— 交换两数的值

3.reverse(it1, it2)
将数组指针在[it1,it2)间的元素、或容器的迭代器在[it,it2)范围内的元素进行 “反转”;
举例:字符串反转:
image

4.全排列时使用:next_permutation()

举例一:
image

举例二:
题目:http://codeup.hustoj.com/problem.php?cid=100000604&pid=1
image

题解:
image

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

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

相关文章

PROFIBUS DP 转 EtherCAT 网关:冶金自动化高效协同的基石

在冶金行业高炉、连铸、轧钢等复杂场景中&#xff0c;生产设备往往跨越不同时代。许多关键产线仍依赖西门子PLC为核心的PROFIBUS DP网络&#xff0c;而新型伺服驱动器、机器人手臂则普遍采用高性能EtherCAT接口。如何实现新旧系统的无缝集成&#xff1f;JH-PB-ECT疆鸿智能PROFI…

开发云数据库

1、云数据库概述 云数据库是一款端云协同的数据库产品&#xff0c;是AGC云开发&#xff08;AGC Serverless&#xff09;关键服务之一&#xff0c;为AGC构建了MBaas&#xff08;Mobile Backend as a Service&#xff0c;移动后端即服务&#xff09;能力。云数据库提供了端云数据…

IEEE使用遇到的问题

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、如何在已知期刊中查找自己方向的论文 前言 IEEE 使用相关问题记录 一、如何在已知期刊中查找自己方向的论文 比如在IEEE Transactions on Visualization …

深入解析C#数组协变与克隆机制

—— 值类型与引用类型的内存行为差异 &#x1f50d; 一、数组协变&#xff08;Array Covariance&#xff09; 核心条件&#xff1a; 仅适用于引用类型数组被赋值对象与数组基类型需存在隐式/显式转换关系 class Animal {} class Dog : Animal {}Animal[] animals new Dog…

零散问题一

1.函数重载的原理 名称修饰&#xff08;Name Mangling&#xff09; 作用&#xff1a;编译器在编译时对函数名进行编码&#xff0c;生成唯一的内部标识符&#xff0c;使得同名函数能通过参数列表的差异被区分。示例&#xff1a; void func(int a); // 修饰后可能为 _Z4funcivo…

React Native【详解】内置 API

屏幕 Dimensions 获取屏幕信息 import { Dimensions } from "react-native"; export default function demo() {const { width, height, scale, fontScale } Dimensions.get("window");console.log(width, height, scale, fontScale); }参数为 window 时…

Selenium自动化测试常见的异常处理

在软件开发和测试领域,Selenium作为一种广泛使用的自动化测试工具,扮演着至关重要的角色。随着自动化测试的不断普及,如何在测试过程中有效捕获并处理异常,成为了每个测试工程师必须掌握的技能。本文旨在深入探讨Selenium异常处理的方法,通过丰富的案例和代码,帮助新手朋…

企业级安全实践:SSL 加密与权限管理(二)

权限管理&#xff1a;企业数据的守护者 权限管理的基本概念与重要性 权限管理&#xff0c;是指根据系统设置的安全规则或策略&#xff0c;用户可以访问且仅能访问自己被授权的资源&#xff0c;不多不少 。它是企业信息安全体系的重要组成部分&#xff0c;旨在确保只有授权的人…

AMAT P5000 CVDFDT CVDMAINT Precision 5000 Mark 操作 电气原理 PCB图 电路图等

AMAT P5000 CVDFDT CVDMAINT Precision 5000 Mark 操作 电气原理 PCB图 电路图等

深入浅出:语言模型中的“自回归生成”是什么?

在当今大语言模型&#xff08;LLM&#xff09;如 ChatGPT、GPT-4、文心一言、通义千问等风靡的时代&#xff0c;“自回归生成”是驱动它们流畅对话、创作文本的核心引擎。 理解它是深入掌握LLM工作原理的关键一步。本文将用清晰易懂的语言&#xff0c;结合实例&#xff0c;为你…

LLMs基础学习(八)强化学习专题(5)

LLMs基础学习&#xff08;八&#xff09;强化学习专题&#xff08;5&#xff09; 文章目录 LLMs基础学习&#xff08;八&#xff09;强化学习专题&#xff08;5&#xff09;重要性采样&#xff08;Importance Sampling&#xff09;权重计算逻辑两种实现形式使用注意事项 PPO 与…

深入理解“回调地狱“(Callback Hell)

"回调地狱"是异步编程中常见的问题&#xff0c;指由于过多嵌套的回调函数导致的代码难以理解和维护的情况。 一、什么是回调地狱 基本概念 回调地狱(Callback Hell/Pyramid of Doom)是指&#xff1a; 多层嵌套的回调函数形成的代码结构 代码向右缩进越来越深&…

Oracle 的 TCP.SEND_TIMEOUT 参数

Oracle 的 TCP.SEND_TIMEOUT 参数 一 参数基本概念 TCP.SEND_TIMEOUT 是 Oracle Net Services 中的一个重要参数&#xff0c;用于控制 TCP 数据发送操作的最长等待时间。 二 关键特性 特性说明参数类型sqlnet.ora 配置文件参数默认值none (无超时限制)单位ms, sec, min, 默…

[Nginx] 配置中的sendfile参数详解:从传统 IO 到零拷贝的性能优化

一、sendfile 是什么&#xff1f; sendfile 是 Nginx 中一个关键的配置参数&#xff0c;用于控制是否使用操作系统提供的 sendfile() 系统调用来传输文件。 sendfile on;&#xff1a;启用零拷贝技术&#xff0c;直接由内核将文件发送到网络。sendfile off;&#xff1a;使用传统…

(LeetCode 每日一题) 2138. 将字符串拆分为若干长度为 k 的组 (字符串、模拟)

题目&#xff1a;2138. 将字符串拆分为若干长度为 k 的组 思路&#xff1a;字符串模拟&#xff0c;时间复杂度0(n)。 C版本&#xff1a; class Solution { public:vector<string> divideString(string s, int k, char fill) {vector<string> v;int ns.size();for…

C++法则1:在 C++ 中,所有的具名变量都是左值,即使它们的类型是右值引用。

看下面例子&#xff1a; test(0)调用的是函数是&#xff1a; template<typename T> void test(T&& t) {std::cout << "右值引用" << std::endl; }test(n)调用的是函数是&#xff1a; template<typename T> void test(T& t) {st…

python如何使用正则提取文章所有形容词

在Python中使用正则表达式提取文章中的形容词需要结合语言特性处理。以下是分步解决方案&#xff1a; 英文场景解决方案&#xff08;推荐使用专业NLP库&#xff09;&#xff1a; import re import nltk nltk.download(averaged_perceptron_tagger) # 首次使用需要下载text …

低代码平台的数据归集及治理

低代码平台或无码平台&#xff0c;在建表单的时候&#xff0c;都是每一个表单一个json的格式文件&#xff0c;存储在Nosql数据库中。在开发的过程中&#xff0c;有以下主要的需求 1、json格式实时的转为关系数据库的格式&#xff0c;存入到关系数据库中 需要在流程结束的时候&…

Origin:如何使柱状图看起来悬空

想得到这样的一个没有下轴的柱状图&#xff0c;操作步骤如下: 1.点击下轴坐标轴 2.修改效果

Vite 原理深入剖析

1. 整体架构设计 Vite 的整体架构由几个关键模块组成,每个模块都对应具体的源码文件: 开发服务器:用于处理浏览器请求、模块解析和热更新。开发服务器的代码主要位于 src/node/server/index.ts。 模块解析与热更新:通过模块中间件拦截请求,处理代码转换与热模块替换。相关…