算法题必备基础技巧(C++版)

news2024/9/28 11:20:24

最近可能要参加秋招面试........最近还要顺便复习整理一下之前的一些技巧,整理归纳一下。倒不是说放弃考研了,而是尽可能找一个普通的工作保底吧......


一.函数模板

模板,顾名思义,任何类型都可以套用,分享一个打印任何类型vector的一个方法,语法如下:

template<class T>
void Myprint(vector<T> Vx)
{
 for(int i=0;i<=Vx.size()-1;i++)
 cout<<Vx[i]<<" ";
 cout<<endl;
 //模板方法!打印任何类型的 vector! 
}

核心语句是:template<class T>

二.string 和 vector 的区别总结

首先要明白字符与字符串的最大区别:"JSL"是字符串,'J'是字符,本质上就是双引号和单引号的区别。这一点可能在JavaScript等脚本语言(或弱语言)不严格,但C++中很严格!

string temp1="7371";
char temp2[5]="7166";
//注:采用这种方式赋值,需要将下标多于字符串一位

如下是两个vector,一个为string类,另一个是char类。

vector<string> S1;
vector<char> C1;

如下,temp1和temp2均可以压入string型的s1,而作为char型的temp3则不行。原因在于,char型数组本质上也是字符串,因此可以压入string类的S1中。但是,说个题外话,char型数组版的字符串,不能通过"+"运算符起到拼接字符串的作用~

char temp3='3'; 
S1.push_back(temp1);
S1.push_back(temp2);
//string 型的 vector,可以将 char 类型的数组压入
//而采用单引号的 char 字符,则不能压入!

用好vector这一容器的核心在于:一定要清楚vector内部装的是什么东西

string temp4=S1[2];
//注意:vector<string>型的每一位,仍然为字符串型,而不是
//char 类型,此处 temp4 如果为 char 型会报错!

此处再分享一种C语言类型的字符串:

char *jsl="JSL";
如下是C知道给出的解释:

char* 是一个指向单个字符的指针,而char a[] 是一个字符数组。它们的本质属性是不同的。char* 可以指向一个字符串,通过指针可以随意操作字符串中的字符。而char a[] 是一个固定大小的字符数组,用于存储一串字符。

注意:另一个很微妙又有些绕的地方: string 的每一位为 char 型但是如果是 vector<string> 型,每一位则为 string!如果想取出vector中string元素的某一位,可以采用中间变量先解析出当前下标对应的vector,千万不要混淆~

此前一篇博客的辨析说得更加清楚一些:
C++String 和 char类型的区别和用法辨析icon-default.png?t=N7T8https://blog.csdn.net/jsl123x/article/details/130004128

三.vector的随机插入与删除

vector<int> V2;
for(int i=1;i<=10;i++)
V2.push_back(i);
for(vector<int>::iterator it=V2.begin();it!=V2.end();it++)
cout<<(*it)<<" ";
cout<<endl;
vector<int>::iterator it=V2.begin();
上述代码创建指向开头的迭代器,便于 insert 和 erase 方法的实施。
删除下标为 2-4 的元素:
for(int j=2;j<=4;j++)
V2.erase(it+j);
在下标为 5 处连续插入 5 个 100:
V2.insert(it+5,5,100);

四.deque双端动态数组

deque的操作与vector基本一致,但是支持双向操作:

deque<int> D;   
    for(int i=0;i<=V2.size()-1;i++)  
    {  
        D.push_back(V2[i]);  
        //从左往右压   
        D.push_front(V2[i]);  
        //从右往左压   
    }  
    for(deque<int>::iterator it=D.begin();it!=D.end();it++)  
    {  
        //注意,deque的指针是从front部分开始的!   
        cout<<(*it)<<" ";  
    }  
    cout<<endl;  

assign函数类似erase,不过具体功能是拷贝,而at就是简单的遍历。

 deque<int> D1;  
 D1.assign(D.begin(),D.begin()+2);
 cout<<D.at(3)<<endl; 

五.list链表  

具体内容全部包含在如下代码中:

list<int> L;  
    vector<int> V;  
       
    for(int i=1;i<=10;i++)  
    {  
        L.push_back(i);  
        L.push_front(2*i);    
        //list同样为双端   
    }   
    //链表的元素添加更快一些  
    for(list<int>::iterator it=L.begin();it!=L.end();it++)  
        cout<<(*it)<<" ";  
    cout<<endl;   
    //而遍历则会慢一些  
    //list慎用,其不支持随机访问,如cout<<L[3]<<endl是错的   
    //且其不能使用stl的标准算法,竞赛中不建议使用  

六.set顺序集和multiset复合集

具体代码如下:

set<int> E;  
    //无重复元素   
    multiset<int> M;   
    //有重复元素   
    //均包含在头文件set中   
      
    for(int i=10;i>=1;i--)  
    {  
        E.insert(i);   
        E.insert(i);   
        M.insert(i);  
        M.insert(i);  
    }  
    for(set<int>::iterator it=E.begin();it!=E.end();it++)  
        cout<<(*it)<<" ";  
    cout<<endl;   
    for(set<int>::iterator it=M.begin();it!=M.end();it++)  
        cout<<(*it)<<" ";  
    cout<<endl;   
    //两者都会自动排序,但set会自动剔除重复元素  
    //注意:set并不支持下标的访问方式  
    set<char> E1;  
    E1.insert('j');  
    E1.insert('j');  
    E1.insert('s');  
    E1.insert('l');  
    for(set<char>::iterator it=E1.begin();it!=E1.end();it++)  
        cout<<(*it)<<" ";  
    cout<<endl;  
    //一个比较好的想法是,用char型的set处理不重复字符串

七.pair二值对(对组)

pair<int,string> p1(7371,"jsl");  
pair<int,string> p2(7166,"hyh");  
cout<<p1.second<<" love "<<p2.second<<endl;  
//通过.的方式获取元素属性,写法与结构体类似   
//通常情况可以采用二值对,偶尔采用结构体也是不错的选择。         
//!注意:map太复杂了,不使用。宁可用vector & struct混用。   

注:还有一种STL容器叫做map,个人感觉复杂,不建议使用:宁可用vector & struct混用

八.字符串处理合集

之前发过一篇:https://blog.csdn.net/jsl123x/article/details/129632297

    char goal[]="jsl love hyh.";  
    char target[]="hyh in my heart.";  
    //如果字符串的长度已知,可以直接开不定长空间完成赋值。  
    strcat(goal,"you konw?");  
    cout<<goal<<endl;  
    //strcat用于将后面的字符串拼接在前面  
    cout<<strcspn(goal,"l")<<endl;   
    //strcspn用于检索字符第一次出现的位置  
    cout<<strcmp(target,"agdsg")<<endl;  
    //strcmp用于比较两个字符串的大小,0表示相等,正数代表前面的大   

 下面这段偏C++风格:

string S3="JSL and HYH both come from TaiYuan.";   
    S3.assign("JSL and HYH both come from TaiYuan.");  
    //assign等价于“=”   
    S3+="FCB";  
    S3.append("FCB");  
    //append等价于“+=” (char型数组不能用+=)  
    cout<<S3<<endl;  
    string s4;  
//  getline(cin,s4);  
    //不跳过空格读取字符串  
    S3.replace(2,4,"fadg");  
    cout<<S3<<endl;  
    //从下标2处删去4个字符,用fasd代替   
    //无论删去多少,也只补后面字符串那么多的长度  
    cout<<S3.find('J')<<endl;  
    //find函数返回第一次出现J的下标  
    cout<<S3.rfind('H')<<endl;  
    //rfind返回最后一次 出现的下标   
  
    reverse(S3.begin(),S3.end());  
    cout<<S3<<endl;  
    S3.insert(S3.begin(),'R');  
    //在指定位置插入目标字符   
    cout<<S3<<endl;  
    S3.insert(S3.begin()+2,'R');  
    cout<<S3<<endl;  
    //指针移位,在特定位置上插入字符!  

九.数字与字符相互转化 

(1)字符型数字转为整型数字

    string s11="123";  
    char s111[s11.size()];  
    for(int i=0;i<=s11.size()-1;i++)  
    {  
        s111[i]=s11[i];  
    }  
    int a11=atoi(s111);  
    //atoi只对合法的数字有效   
    //此外,变量必须为char类型的   
    cout<<(a11)<<endl;  

(2)整型数字转为字符型数字

int a22=123;  
    char a222[5];  
    itoa(a22,a222,10);  
    a222[3]='c';  
    cout<<a222<<endl; 

(3)字符型数字转为对应字母 

string s13="1";  
    cout<<(s13[0]-48)<<endl;  
    //注意,此处字符型的1对应ascii码49,所以减去48即为数字型的本身   

(4)对应字母转换为字符型数字

    char c111='c';  
    char i111=c111-48;  
    cout<<i111<<endl;

(5)整型数字转为对应字母

    int i21=3;  
    char c21=(i21+96);  
    //加96可以直接强转自习室   
    cout<<c21<<endl;   

(6)对应字母转为整型数字

char c4='c' ;  
    int i4=c4-96;  
    cout<<(i4*5)<<endl;  
    //对于小写英文字母,-96可以得到对应的数字顺位 ,大写-64   
    //此处c对应3   
    return 0;  

附注刷题网:【赛码网】在线考试系统、在线面试系统-易用稳定专业

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

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

相关文章

【数据分享】2023年全国地级市点位数据(免费获取\shp格式\excel格式)

地级市点位数据是我们各项研究中经常使用到的数据&#xff0c;在之前的文章中我们分享过2022年度的地级市及以上城市的点位数据&#xff08;可查看之前的文章获悉详情&#xff09;。本次我们带来的是2023年度的全国范围的地级市及以上城市的点位数据&#xff0c;点位位置为市政…

【Linux 服务器运维】定时任务 crontab 详解 | 文末送书

文章目录 前言一、crontab 介绍1.1 什么是 crontab1.2 crontab 命令工作流程1.3 Linux 定时任务分类 二、crontab 用法详解2.1 crond 服务安装2.2 crontab 文件内容分析2.3 crontab 命令用法2.3.1 查看定时任务列表2.3.2 编辑/创建定时任务2.3.3 删除定时任务2.3.4 其他 cronta…

NI SCXI-1000 编码器模块

NI SCXI-1000 是 NI&#xff08;National Instruments&#xff09;生产的编码器模块&#xff0c;通常用于工业自动化和控制系统中&#xff0c;以采集和处理编码器信号&#xff0c;用于测量和监测旋转或线性位置。以下是该模块的一些主要产品特点&#xff1a; 编码器输入&#x…

linux内核分析:进程通讯方式

信号 一旦有信号产生,我们就有下面这几种,用户进程对信号的处理方式。 1.执行默认操作。Linux 对每种信号都规定了默认操作,例如,上面列表中的 Term,就是终止进程的意思。Core 的意思是 Core Dump,也即终止进程后,通过 Core Dump 将当前进程的运行状态保存在文件里面…

day1| 704. 二分查找、27. 移除元素

704. 二分查找 题目链接&#xff1a;https://leetcode.cn/problems/binary-search/ 文档讲解&#xff1a;https://programmercarl.com/0704.%E4%BA%8C%E5%88%86%E6%9F%A5%E6%89%BE.html 视频讲解&#xff1a;https://www.bilibili.com/video/BV1fA4y1o715 1、二分法的前提 这道…

SpringSecurity---内存认证和数据库认证

目录 一、内存认证 二、认证逻辑 三、数据库认证&#xff08;也就是用户名和密码在数据库中寻找&#xff09; &#xff08;1&#xff09;mapper层 &#xff08;2&#xff09;启动类添加扫描注解 &#xff08;3&#xff09;编写UserDetailsService实现类 一、内存认证 Co…

GLSL-WebGL着色器语言语法详解

GLSL语法 GLSL它是强类型语言&#xff0c;每一句都必须有分号。它的语法和 typescript 挺像。 GLSL的注释语法和 JS 一样&#xff0c;变量名规则也和 JS 一样&#xff0c;不能使用关键字&#xff0c;保留字&#xff0c;不能以 gl_、webgl_ 或 webgl 开头。运算符基本也和 JS 一…

C++之std::holds_alternative、std::get、std::variant应用实例(二百一十九)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

AVLoadingIndicatorView - 一个很好的Android加载动画集合

官网 GitHub - HarlonWang/AVLoadingIndicatorView: DEPRECATED 项目简介 AVLoadingIndicatorView is a collection of nice loading animations for Android. You can also find iOS version of this here. Now AVLoadingIndicatorView was updated version to 2.X , If …

git的使用——结合具体问题记录git的使用 代码提交从入门到熟练

前言 git作为开发人员必备的技能&#xff0c;需要熟练掌握&#xff0c;本篇博客记录一些git使用的场景&#xff0c;结合具体问题进行git使用的记录。以gitee的使用为例。 文章目录 前言引出已有项目推送gitee1.gitee中新建项目仓库2.本地项目的初始化提交3.比较好玩的commit图…

【EI会议征稿】2023年工业设计与环境工程国际学术会议

2023 International Conference on Industrial Design and Environmental Engineering 2023年工业设计与环境工程国际学术会议 2023年工业设计与环境工程国际学术会议&#xff08;IDEE 2023&#xff09;将于2023年11月24-26日于郑州召开。本次会议主要围绕工业设计与环境工程…

Django(18):中间件原理和使用

目录 概述Django自带中间件Django的中间件执行顺序自定义中间件函数使用类 其它中间件钩子函数process_viewprocess_exceptionprocess_template_response如何使用这3个钩子函数&#xff1f; 全局异常处理小结 概述 中间件(middleware)是一个镶嵌到Django的request(请求)/respo…

Zero-Shot、One-shot、Few-Shot 的简介

本文将介绍以下内容&#xff1a; Zero-Shot Learning 的提出ZSL 的通俗理解GPT 之 Zero-ShotZero-Shot、One-shot、Few-Shot 的通俗理解 一、Zero-Shot Learning 的提出 零样本学习 Zero-Shot Learning&#xff0c;简称 ZSL&#xff0c;是由 Lampert 等人在 2009 年提出的。…

Powerbi-矩阵日期表矩阵列数据表头排序

首先做一个DAX日期表&#xff0c;Powerbi中新建表输入如下代码即可 日期表 VAR YearStart 2023 //起始年度 VAR YearEnd 2024 //结束年度VAR WeekNumberType 2 VAR WeekDayType 2RETURN GENERATE (CALENDAR( DATE( YearStart , 1 , 1 ) , DATE( YearEnd , 12 , 31…

什么是内存碎片?

在嵌入式系统中&#xff0c;内存是十分有限而且是十分珍贵的&#xff0c;用一块内存就少了一块内存&#xff0c;而在分配中随着内存不断被分配和释放&#xff0c;整个系统内存区域会产生越来越多的碎片。 因为在使用过程中&#xff0c;申请了一些内存&#xff0c;其中一些释放…

软件定义世界,工程引领未来——中山大学软件工程学院 软件工程导论大作业

目录 软件工程&#xff0c;理解加深 个人困惑 软件与软件工程的定义 学习思路的启发 软件危机的认识及思考 软件测试的初步认识 科技前沿&#xff0c;守正创新 代码有智能&#xff0c;教育有情怀 深入浅出&#xff0c;引人入胜 再接再厉&#xff0c;未来可期 “软件…

AI数字人虚拟主播,跟传统主播相比有哪些优势,究竟谁更胜一筹?

在今年&#xff0c;AI人工智能技术得到了快速发展&#xff0c;AI数字人开始大面积进入我们的生活&#xff0c;我们经常可以在各大直播间刷到AI数字人虚拟主播。 这些主播光从表面上来看&#xff0c;完全跟真人一模一样&#xff0c;一样的容貌、一样的身形、一样的声音&#xf…

2023年8月体育用品行业数据分析(京东数据产品)

当前&#xff0c;亚运会临近&#xff0c;这也带动了国民对体育消费的热情&#xff0c;体育产品内销逐渐旺盛&#xff0c;“亚运经济”红利开始显现。鲸参谋数据显示&#xff0c;今年8月份&#xff0c;京东平台上体育用品行业的销量为185万&#xff0c;同比增长2%&#xff1b;销…

vue 组件公共的方法

我这是取后端数据发现后端给的数据啥样的都有 有带标签的 有带图片的 还有换行的把这些筛选掉 比如去掉标签 去掉空格 1.首先创建一个公共页面 /* 处理数据html标签显示界面 */export function removeHTMLTag(htmlStr) { let html htmlStr .replace(/<img.*?>/g…

硬件系统工程师宝典(41)-----蛇形走线有什么用?

各位同学大家好&#xff0c;欢迎继续做客电子工程学习圈&#xff0c;今天我们继续来讲这本书&#xff0c;硬件系统工程师宝典。 上篇我们说到了Datasheet里的内容不用全文通读&#xff0c;应该有选择的查看&#xff0c;如引脚功能、电气参数、典型电路及封装大小。今天我们来讲…