:入门阶段的题目刷完了,接下来到了有难度的题目,还有一些复杂的数据结构,希望自己可以坚持下去
1.用迭代求阶乘的方法
int jiechen(int n) {
if (n>1)
{
return n*jiechen(n - 1);
}
return n;
}
2.遇到方向转变的问题,可以用数字来控制方向,num=0是北边,num=1是东边
3.sort(bp+3, bp + n, com);按com定义好的规则进行排序
eg:
bool com(const Bp &a,const Bp &b) {
if (a.bg>b.bg)
{
return true;
}
else
{
return false;
}
}
4.整形转字符型+‘0’ 字符型转整形-‘0’
5.高精度加法:
应用场景:如果数据非常大,大到无法用long long这个数据类型存储,就需要用高精度算法来解决。
基本思想:普通的数据类型不够大们就用数组来存储,解决溢出的问题。
-1.定义三个字符数组a,b,分别用来存储两个加数,定义一个temp来存储进位,且初始化为0,定义一个整数数组存储和。
-2.字符数组转换成整数数组A,B。
-3.A[0]是个位,A[1]是十位,以此类推b。(B数组也是如此)
-4.个位相加即A[0]+B[0]+temp(初始化为0不会影响)=C[0],如果有进位(和是两位数),则把进位(和的十位)存储在temp中,个位存储在C[0]。
-5.十位相加即A[0]+B[0]+temp=C[0],如果有进位(和是两位数),则把进位(和的十位)存储在temp中,个位存储在C[0]。
-6.一直加下去,得出结果
https://blog.csdn.net/qq_42702981/article/details/114290183
乘法:https://blog.csdn.net/qq_42702981/article/details/114380214
6. 快速排序算法
void kuaipai(int l,int r) {
int i = l;
int j = r;
int mid = v[(l+r)/2];中间数
do
{
while (v[i]<mid)//查找左半部分比中间大的数字
{
i++;
}
while (v[j]>mid)//查找右半部分比中间小的数字
{
j--;
}
if (i<=j)//如果有一组不满足条件左小右大,则交换
{
swap(v[i],v[j]);
i++;
j--;
}
} while (i<=j);
if (l<j)//递归处理左边
{
kuaipai(l,j);
}
if (i<r)//递归处理右边
{
kuaipai(i,r);
}
}
//调用时
kuaipai(a[0],a[n-1]);//如果是n数组会越界
7.求第k小的数
方法一:对原数组进行快速排序,然后 O(1) 输出
#include<bits/stdc++.h>
using namespace std;
int x[5000005],k;
int main()
{
int n;
scanf("%d%d",&n,&k);
for(int i=0;i<n;i++)
scanf("%d",&x[i]);
sort(x,x+n);//快排
printf("%d",x[k]);
}
方法二:STL 里有一个的函数 nth_element
nth_element(a+x,a+