我会不定时更新;
导入:
例2:写程序实现一个函数PrintN,使得传入一个正整数N的参数后,能顺序打印从1到N的全部正整数;
循环:
void PrintN(int N)
{
int i;
for(i=1;i<=N;i++)
{
printf("%d\n",i);
}
return ;
}
递归:
void PrintN(int N)
{
if(N)
{
printf(N-1);
printf("%d\n",i);
}
return ;
}
令N=100,1000,10000,100000,........
递归的运行时间很长,因为递归的程序对空间的占用很恐怖,甚至会爆掉。
例3:写程序计算给定多项式在给定点x处的值
double f(int n,double a[],double x)
{
int i;
double p=a[0];
for(i=1;i<=n;i++)
p+=(a[i]*pow(x,i));
return p;
}
double f(int n,double a[],double x)
{
int i;
double p=a[n];
for(i=n;i>n;i--)
p=a[i-1]+x*p;
return p;
}
clock():捕捉从程序开始运行到clock()被调用时所消耗的时间。这个时间单位是clock tick,即“时钟打点”。
常数CLJK_TCK:机器时钟每秒所走的时钟打点数;
#include<stdio.h>
#include<time.h>
clock_t start,stop;
//clock_t是clock()函数返回的变量类型
double duration;
//记录被测函数运行时间,以秒为单位
int main()
{
// 不在测试范围内的准备工作写在clock()调用之前
start=clock();//开始计时
MyFunction();// 把被测函数加在这里
stop=clock();// 停止计时
duration=((double)(stop-start))/CLK_TCK;
// 计算运行时间
//其他不在测试范围的处理写在后面,例如输出duration的值
return 0;
}
单调栈:
给定一个长度为 N� 的整数数列,输出每个数左边第一个比它小的数,如果不存在则输出 −1。
输入样例:
5
3 4 2 7 5
输出样例:
-1 3 -1 2 2
#include<iostream>
using namespace std;
const int N=1e5+10;
int a[N],t;
int main()
{
int n;
cin>>n;
int x;
for(int i=1;i<=n;i++)
{
cin>>x;
while(t&&a[t]>=x)
{
t--;
}
if(t)
{
cout<<a[t]<<" ";
}
else
{
cout<<-1<<" ";
}
a[++t]=x;
}
return 0;
}
滑动窗口:
给定一个大小为 n≤106�≤106 的数组。
有一个大小为 k� 的滑动窗口,它从数组的最左边移动到最右边。
你只能在窗口中看到 k� 个数字。
每次滑动窗口向右移动一个位置。
以下是一个例子:
该数组为 [1 3 -1 -3 5 3 6 7]
,k� 为 33。
窗口位置 | 最小值 | 最大值 |
---|---|---|
[1 3 -1] -3 5 3 6 7 | -1 | 3 |
1 [3 -1 -3] 5 3 6 7 | -3 | 3 |
1 3 [-1 -3 5] 3 6 7 | -3 | 5 |
1 3 -1 [-3 5 3] 6 7 | -3 | 5 |
1 3 -1 -3 [5 3 6] 7 | 3 | 6 |
1 3 -1 -3 5 [3 6 7] | 3 | 7 |
你的任务是确定滑动窗口位于每个位置时,窗口中的最大值和最小值。
输入样例:
8 3
1 3 -1 -3 5 3 6 7
输出样例:
-1 -3 -3 -3 3 3
3 3 5 5 6 7
#include<iostream>
using namespace std;
const int N=1e6+10;
int a[N],s[N];
int main()
{
int n,k;
cin>>n>>k;
for(int i=0;i<n;i++)
{
cin>>a[i];
}
int hh=0,tt=-1;
for(int i=0;i<n;i++)
{
if(hh<=tt&&i-k+1>s[hh])
{
hh++;
}
while(hh<=tt&&a[s[tt]]>=a[i])
{
tt--;
}
s[++tt]=i;
if(i>=k-1)
{
cout<<a[s[hh]]<<" ";
}
//for (int ii=hh;ii<=tt;ii++) cout << s[ii] << " "; cout << endl;
}
puts(" ");
// cout<<endl;
hh=0,tt=-1;
for(int i=0;i<n;i++)
{
if(hh<=tt&&i-k+1>s[hh])
{
hh++;
}
while(hh<=tt&&a[s[tt]]<=a[i])
{
tt--;
}
s[++tt]=i;
if(i>=k-1)
{
cout<<a[s[hh]]<<" ";
}
//for (int ii=hh;ii<=tt;ii++) cout << s[ii] << " "; cout << endl;
}
puts(" ");
return 0;
}
单链表
实现一个单链表,链表初始为空,支持三种操作:
- 向链表头插入一个数;
- 删除第 k𝑘 个插入的数后面的一个数;
- 在第 k𝑘 个插入的数后插入一个数。
现在要对该链表进行 M𝑀 次操作,进行完所有操作后,从头到尾输出整个链表。
注意:题目中第 k𝑘 个插入的数并不是指当前链表的第 k𝑘 个数。例如操作过程中一共插入了 n𝑛 个数,则按照插入的时间顺序,这 n𝑛 个数依次为:第 11 个插入的数,第 22 个插入的数,…第 n𝑛 个插入的数。
输入格式
第一行包含整数 M𝑀,表示操作次数。
接下来 M𝑀 行,每行包含一个操作命令,操作命令可能为以下几种:
H x
,表示向链表头插入一个数 x𝑥。D k
,表示删除第 k𝑘 个插入的数后面的数(当 k𝑘 为 00 时,表示删除头结点)。I k x
,表示在第 k𝑘 个插入的数后面插入一个数 x𝑥(此操作中 k𝑘 均大于 00)。
输出格式
共一行,将整个链表从头到尾输出。
数据范围
1≤M≤1000001≤𝑀≤100000
所有操作保证合法。
输入样例:
10
H 9
I 1 1
D 1
D 0
H 6
I 3 6
I 4 5
I 4 5
I 3 4
D 6
输出样例:
6 4 6 5
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10,mod=1e9+7;
typedef long long ll;
typedef pair<int,int>pii;
int t;
int e[N],ne[N],head,idx;
//初始化
void init()
{
head=-1;
idx=0;
}
//将x插到头结点
void add_to_head(int x)
{
e[idx]=x,ne[idx]=head,head=idx++;
}
// 将x插到下标k的点后面
void add(int k,int x)
{
e[idx]=x,ne[idx]=ne[k],ne[k]=idx++;
}
//将下标是k的点后面的点删掉
void remove(int k)
{
ne[k]=ne[ne[k]];
}
int main()
{
cin>>t;
init();
while(t--)
{
int k,x;
char op;
cin>>op;
if(op=='H')
{
cin>>x;
add_to_head(x);
}
else if(op=='D')
{
cin>>k;
if(!k) head=ne[head];
remove(k-1);
}
else
{
cin>>k>>x;
add(k-1,x);
}
}
for(int i=head;i!=-1;i=ne[i]) cout<<e[i]<<" ";
cout<<endl;
return 0;
}
双链表
实现一个双链表,双链表初始为空,支持 55 种操作:
- 在最左侧插入一个数;
- 在最右侧插入一个数;
- 将第 k𝑘 个插入的数删除;
- 在第 k𝑘 个插入的数左侧插入一个数;
- 在第 k𝑘 个插入的数右侧插入一个数
现在要对该链表进行 M𝑀 次操作,进行完所有操作后,从左到右输出整个链表。
注意:题目中第 k𝑘 个插入的数并不是指当前链表的第 k𝑘 个数。例如操作过程中一共插入了 n𝑛 个数,则按照插入的时间顺序,这 n𝑛 个数依次为:第 11 个插入的数,第 22 个插入的数,…第 n𝑛 个插入的数。
输入格式
第一行包含整数 M𝑀,表示操作次数。
接下来 M𝑀 行,每行包含一个操作命令,操作命令可能为以下几种:
L x
,表示在链表的最左端插入数 x𝑥。R x
,表示在链表的最右端插入数 x𝑥。D k
,表示将第 k𝑘 个插入的数删除。IL k x
,表示在第 k𝑘 个插入的数左侧插入一个数。IR k x
,表示在第 k𝑘 个插入的数右侧插入一个数。
输出格式
共一行,将整个链表从左到右输出。
数据范围
1≤M≤1000001≤𝑀≤100000
所有操作保证合法。
输入样例:
10
R 7
D 1
L 3
IL 2 10
D 3
IL 2 7
L 8
R 9
IL 4 7
IR 2 2
输出样例:
8 7 7 3 2 9
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10,mod=1e9+7;
typedef long long ll;
typedef pair<int,int>pii;
int t;
int e[N],l[N],r[N],idx;
//初始化
void init()
{
r[0]=1,l[1]=0;
idx=2;
}
void add(int k,int x)
{
e[idx]=x;
r[idx]=r[k];
l[idx]=k;
l[r[k]]=idx;
r[k]=idx;
idx++;
}
void remove(int k)
{
r[l[k]]=r[k];
l[r[k]]=l[k];
}
int main()
{
cin>>t;
init();
while(t--)
{
int k,x;
string op;
cin>>op;
if(op=="L")
{
cin>>x;
add(0,x);
}
else if(op=="R")
{
cin>>x;
add(l[1],x);
}
else if(op=="D")
{
cin>>k;
remove(k+1);
}
else if(op=="IL")
{
cin>>k>>x;
add(l[k+1],x);
}
else
{
cin>>k>>x;
add(k+1,x);
}
}
for(int i=r[0];i!=1;i=r[i]) cout<<e[i]<<" ";
return 0;
}