机试总结(九推)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_43145926/article/details/97093590

待解决:

  • 大数加减法??
  • *p ++*(p++)又搞不清楚了。。。
  • 全排列算法? 蓝桥杯带分数那题 以及之前总结的模板 stl库很可能不能用所以要自己会写
  • 文件操作
  • 树状数组 小朋友排队那题
  • 什么是匈牙利算法
  • hash函数

之前写的几个机试专题:

之前整理的两个蓝桥杯blog:

几个常用模板:


注意点整理:

  • 多位数时候要注意首位不能为0,若每位数互不相等时不要漏掉,遇到除法要换成乘法。
  • 时刻考虑数据溢出、不在范围内、输出格式等细节问题。
  • 非静态成员变量不能在类外初始化
  • 不允许使用数据成员初始值设定项
    原因如下:https://blog.csdn.net/misayaaaaa/article/details/61195389
  • 超时可以把cin/cout缓存scanf/printf,读取字符串用str。c_str();
  • 按固定格式输出年月日:printf("%04d-%02d-%02d\n",y,m,d);
  • 用 sizeof求int数组长度:
int getArrayLength(T arr[]) {
	int length = sizeof(arr)/sizeof(T);
	return length;
}
  • C++中 swap函数记得引用
void swap(int &a,int &b){
	int temp=a;
	a=b;
	b=temp;
}
  • C++格式输出控制:setprecision(n)与setiosflags(ios::fixed)或者setiosflags(ios_base::fixed)合用,可以控制小数点右边的数字个数

  • fill函数与memset函数比较

  • 1,memset函数
    按照字节填充某字符
    在头文件< cstring >里面
    2,fill函数
    按照单元赋值,将一个区间的元素都赋同一个值
    在头文件< algorithm>里面

  • 得记住各种算法/排序算法的时间/空间复杂度
    在这里插入图片描述

  • for(auto &c:s)与for(auto c:s)

#include<iostream>
using namespace std;
int main()
{
    string s("hello world");
    for(auto c:s)
    c='t';
    cout<<s<<endl;//结果为hello world
 
    for(auto &c:s)
    c='t';
    cout<<s<<endl; //结果为ttttttttttt
  • transform函数
#include <iostream>
#include <algorithm>
using namespace std;
char op(char ch)
{
    if(ch>='A'&&ch<='Z')
        return ch+32;
    else
        return ch;
}
int main()
{
    string first,second;
    cin>>first;
    second.resize(first.size());
    transform(first.begin(),first.end(),second.begin(),op);
    cout<<second<<endl;
    return 0;
}
  • isalnum():string中至少有一个字符,而且全是字母或者数字或者是字母和数字混合返回True,其他情况返回False:
    isalpha():string中至少有一个字符,而且全为字母,返回True,其他情况返回False。
  • 无序集是不按特定顺序存储唯一元素的容器,它允许根据单个元素的值快速检索单个元素。在unordered_set中,元素的值同时是其键,它唯一地标识它。键是不可变的,因此,unordered_set中的元素不能在容器中修改一次 - 但是可以插入和删除它们。

字符串/字符数组相关知识点

  • 不能用C++的cin输入string,要加上#include <string>之后用 getline(cin,input_string);
  • 字符串长度是str.length()或者str.size()
  • char既可以定义字符串也可以定义字符
    char 定义的字符数组

char b[]={'h','e','l','l','o'};//声明字符数组,长度为5
char定义字符串
字符串的优势在于输入、输出和赋初值,输入输出不需要使用循坏。字符数组需要用循环依次输出每个字符。

     char b[]="hello";//定义字符串
     char *p = b;
     cout << b;//输出的是hello
     cout<<  *p;//指针指向首地址,所以输出为 h
  • 字符串的长度是字符数目加1,因为包含了\0结束符,而字符数组的长度就是字符的数目。
  • 对于字符数组可以通过sizeof求出其长度,但是对于字符串是其长度加上1。因此这个长度没有意义,为此C++可以用strlen求出字符串的有效内容的长度(不含字符串结束标识\0)。
  • 这里需要特别注意的是string并不是一个关键字,而是一个类。 下面代码的指针指向的是对象,而不是string中的第一个字符。
    string str="hello world";
    string *p1 = &str; //注意必须加取地址运算符 &
    cout << str << "," << *p1; //输出的是  hello world,hello world
  • 1 如果想访问string定义字符串中的每个字符,可以使用 str[i]
    2 cout<<p1[0];//输出的是 hello world
    3 不可像char定义的字符串那样使用p1[i],在string中,i>0并未分配指针,这种理解方式本来就错误。

  • 在C/C++中常用的获取字符串长度或者字符串数组长度的函数有:
    size()、length()、strlen()、sizeof()
    字符串长度:strlen(str)、str.length()、str.size()
    str.length()和str.size()是用于求string类对象的成员函数,求得的是实际的字符串长度;
    strlen(str) 是用于求实际字符串数组的长度,其参数是char*,头文件为string.h。
    sizeof用于求得的为字符串长度+1.对于字符数组,strlen()和sizeof()求得的结果相同.

  • strlen不区分是数组还是指针,就读到\0为止返回长度。而且strlen是不把\0计入字符串的长度的

  • vector头文件的push_back函数,在vector类中作用为在vector尾部加入一个数据。
    string中的push_back函数,作用是字符串之后插入一个字符。

  • 字符数组提取最后一个字母要减去‘0’ s[len-1]-'0'

  • 字符串带空格输入 用getline(cin , s1);

  • 将数字转换成字符串#include<string>,to_string函数

  • c_str() 以 char* 形式传回 string 内含字符串
    如果一个函数要求char*参数,可以使用c_str()方法:

string s = “Hello World!”;
printf("%s", s.c_str()); //输出 “Hello World!”

参考:


sort排序用法

  • #include <algorithm> 用法:Sort(起始地址,结束地址,排序方法),其中第三个参数可以不写,默认升序。sort(num,num+N,cmp);
  • #include <functional> greater表示内置类型从大到小排序,less表示内置类型从小到大排序。sort(a,a+10,greater<int>());//快速排序

  • 字符串相关,字符串的复制,连接,比较大小
    #include <string.h>中直接可以使用的字符串操作函数: strcpy、strcmp、 strcat、strlen
# include<stdio.h>
#include<string.h>
int main()
{
	char str1[11]="Hello";
	char str2[11]=" World";
	char str3[11];
	int length;
	strcpy(str3,str1);
	 printf("复制后的字符串:%s\n",str3);
   strcat(str1,str2);
   printf("连接后的字符串:%s\n",str1);
   length=strlen(str1);
   printf("连接后的字符串长度:%d\n",length);
   return 0;
} 

//自己编

#include <stdio.h>
#include<stdlib.h>
#include <string.h>

//字符串长度
int mystrlen(const char* str)//const?
{
	if(str==NULL)
	return -1;
	int len=0;
	while(*str++!='/0')
		{
			len++;
		}
	return len;
	
}

//从strSrc复制到strDest
//其中strDest长度要大于strSrc的长度
char* mystrcpy(char* strDest, const char* strSrc)
{
	if(strDest==NULL || strSrc==NULL)
		return NULL;
	if(strDest==strSrc)//考虑要周到
		return strDest;
	char *tmp=strDest;
	while((*strDest++=*strSrc++)!='/0');

	return tmp;
}
//连接两个字符串
char* myStrcat(char *str1,char *str2)
{
	int len1=strlen(str1);
	int len2=strlen(str2);
	for(int i=0;i<len2;i++)
	{
		str1[len1+i]=str2[i];
	}
	str1[len1+len2]='/0';//一定记得最后一个加上/0
	return str1;
}

int main()
{
	char *q="abcdefg";
	//strcpy_s(q,sizeof("123456"),"123456");
	printf("%d\n",mystrlen(q));
	printf("%d\n",strlen(q));
	return 0;
}

STL库

vector

  • 声明: vector<int> a 可用a[i]直接访问
    a.push_back() a.pop_back() 只能在尾端
    a.size()
    a.clear() 只会清数据,内存还在占用,所以可以用vector<int>().swap(v)

  • vector也可以数据类型时自定义的结构体。

  • 快速构造 10个1的vector数组

int n=10;
vector<int> vect(n,1); //第2个数字不屑的话默认为0.
  • 二维:vector<vector<int>> vect2 可直接用vect2[i][j]
    但是要先一维一维的初始化
int n=5;
vector<vector<int> > vec2;
for(int i=0;i<n;i++)
{
	vector<int> x(i+1,1);
	vec2.push_back(x);
}
for(int i=0;i<n;j++)
for(int j=0;j<vec2[i].size;i++){}

set
集合不会出现重复元素

  • 构造 set<T> s
    在这里插入图片描述
  • 在这里插入图片描述
  • 遍历元素:迭代器set<T>::iterator it 起始 begin尾后end
#include<set>
#include<string>
set <string> c;
for(set<string>::iterator it=c.begin();it!=c.end();it++)
{cout<<*it;}//不要用小于 set内部不一定连续
  • set也可结合结构体使用,一定要重载
  • 重载‘<’运算符:
struct Node{
	int x, y;
	bool operator < (const Node &rhs) const {
		if(x==rhs.x){//x相等的话 按y排 不然用x排
			return y<rhs.y;
		}else{
			return x<rhs.x;
		}
	}
}

映射表map
关键字集合(key),班级集合(value),只能从key找value。key唯一。
在C++中遍历map是按照关键字从小到大遍历的,这一点和set相同

  • map <T1,T2> m; 名为m的T1到T2的映射
  • insert()的时候一定要成对的
  • 利用make_pair(v1,v2)插入,若key映射已存在,第二次映射即使t2不同也不会更新
    在这里插入图片描述
  • 更改映射值dict["Tom"]=3;
  • dict["tom"].count() 存在返回1,不存在返回0
  • 可以用迭代器中it->first或者(*it).first找key,second找value
  • clear()清空,结构体也是要重载小于号的

  • isdigit() 用来判断是否是0-9之间的数字,是就则返回true,否则返回null(0),头文件为#include<ctype.h>
  • #include<math.h>pow() 函数用来求 x 的 y 次幂(次方),其原型为:double pow(double x, double y);
  • #include <cctype>(C语言使用<ctype.h>) isalpha()判断字符ch是否为英文字母,当ch为英文字母a-z或A-Z时,在标准c中相当于使用“isupper(ch)||islower(ch)”做测试,返回非零值(不一定是1),否则返回零。isupper()判断是否是大写字母。

队列

  • 构造队列:queue<T> q
  • 存入队列用push() 出队pop()
  • 输出队首元素用front()
  • 操作前一半要检测是否为空empty()
  • 队列没有clear()

广度优先搜索

相当于一层层搜,需要用队列辅助实现。搜最短的一般用bfs,要定义结构体存储状态信息

  • 初始时把起点放到队列中,并标记起点访问。
  • 如果队列不为空,从队列中取出一个元素x,否则算法结束
  • 访问和x相连的所有点v,弱国v没有被访问,把v入队,并标记已经访问。
  • 重复步骤2

栈 Stack
C++标准库中的Stack

#include <stack>
stack<T>
方法 功能 参数类型 返回值类型
push 压入元素 T类型 /
pop 弹出元素 / /
top 返回栈顶元素 / T类型
empty 栈是否为空 / bool类型 true表示空
size 栈的元素个数 / 非负整数

动态规划

  • 把多阶段决策问题变换为一系列互相联系的但阶段问题,找最优化解
    最优化原理:当前状态时最优的情况下,下一步才可能继续最优的。就是说每一个最优策略的子策略也时最优的。
    无后效性:如果某阶段状态给定以后,则在这个阶段以后的发展不受以前阶段各状态的影响。

错排公式

f[n]=(f[n-1]+f[n-2])*(n-1);

猜你喜欢

转载自blog.csdn.net/qq_43145926/article/details/97093590