return 0;
}
[]( )归并排序
-----------------------------------------------------------------
时间复杂度为O(nlogn),是稳定排序
#include
using namespace std;
const int N = 1e5 + 10;
int n;
int a[N],temp[N];
void merge_sort(int a[],int l,int r){
int mid;
if(l >= r) return;
mid = (l+r)/2;
merge_sort(a,l,mid);
merge_sort(a,mid+1,r);
int i = l, j = mid+1;
int k = 0;
while(i<=mid && j<=r){
if(a[i]<=a[j])
temp[k++] = a[i++];
else
temp[k++] = a[j++];
}
while(i<=mid) temp[k++] = a[i++];
while(j<=r) temp[k++] = a[j++];
for(i=l,j=0;i<=r;i++,j++)
a[i] = temp[j];
}
int main(){
cin>>n;
int i;
for(i=0;i<n;i++)
scanf("%d",&a[i]);
merge_sort(a,0,n-1);
for(i=0;i<n;i++)
printf("%d ",a[i]);
return 0;
}
[]( )直接使用排序函数
---------------------------------------------------------------------
//包含头文件
#include
//使用方法
//对a[10]进行排序
sort(a,a+10);
[]( )二分法
----------------------------------------------------------------
注意二分的什么时候需要+1,很容易陷入死循环
int l = 0, r = n-1;
int mid;
//r = mid 不需要加1
while(l<r){
mid = (l+r)/2;
if(k<=a[mid]) r = mid;
else l = mid + 1;
}
//l = mid需要加1
l=0;
r=n-1;
while(l<r){
mid = (l+r+1)/2;
if(k>=a[mid]) l = mid;
else r = mid - 1;
}
### []( )高精度运算
对于高精度的加减乘除法,由于位数太多数字变量无法储存,所以需要将其储存在数组中。由于运算需要**有进位和借位**,所以对于加、减、乘需要逆序存储,而对于除法直接顺序存储就可以。
[]( )前缀和(常用)
--------------------------------------------------------------------
#### []( )一维前缀和
计算数组a\[l,r\]区间内的和
**注意下标需要从1开始,便于处理边界。**
#include
using namespace std;
const int N = 1e5 +10;
int a[N];
int s[N];
int n,m;
int main(){
cin>>n>>m;
int i;
int l,r;
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
for(i=1;i<=n;i++) //计算所有前缀和
s[i] = s[i-1] + a[i];
for(i=0;i<m;i++){
scanf("%d%d",&l,&r);
printf("%d\n",s[r]-s[l-1]); //输出[l,r]区间的前缀和
}
return 0;
}
#### []( )二维前缀和(子矩阵的和)
注意记住公式,而且下标要从0开始
#include
using namespace std;
const int N = 1010;
int a[N][N];
int s[N][N];
int n,m,q;
int main(){
cin>>n>>m>>q;
int i,j;
int x1,y1,x2,y2;
for(i=1;i<=n;i++){
for(j=1;j<=m;j++)
scanf("%d",&a[i][j]);
}
for(i=1;i<=n;i++){
for(j=1;j<=m;j++)
s[i][j] = s[i-1][j] + s[i][j-1] - s[i-1][j-1] + a[i][j]; //计算所有前缀和
}
while(q--){
cin>>x1>>y1>>x2>>y2;
printf("%d\n",s[x2][y2]-s[x1-1][y2]-s[x2][y1-1]+s[x1-1][y1-1]); //计算(x1,y1)和(x2,y2)之间的和
}
return 0;
}
[]( )差分
---------------------------------------------------------------
差分是前缀和的逆运算。
#### []( )一维差分
对于区间\[l,r\]上的每个数加上c,时间复杂度为O(1)。
#include
using namespace std;
const int N = 1e5 + 10;
int a[N];
int b[N];
int n,m;
void insert(int l,int r,int c){
b[l] += c;
b[r+1] -= c;
}
int main(){
cin>>n>>m;
int i;
int l,r,c;
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
for(i=1;i<=n;i++)
insert(i,i,a[i]); //假设为0,执行n次插入进行赋值
while(m--){
cin>>l>>r>>c;
insert(l,r,c);
}
for(i=1;i<=n;i++) //计算自身的前缀和并储存在自身
b[i] += b[i-1];
最后
其实Android开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。
上面分享的百度、腾讯、网易、字节跳动、阿里等公司2021年的高频面试题,博主还把这些技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,上面只是以图片的形式给大家展示一部分。
【Android思维脑图(技能树)】
知识不体系?这里还有整理出来的Android进阶学习的思维脑图,给大家参考一个方向。
【Android高级架构视频学习资源】
**Android部分精讲视频领取学习后更加是如虎添翼!**进军BATJ大厂等(备战)!现在都说互联网寒冬,其实无非就是你上错了车,且穿的少(技能),要是你上对车,自身技术能力够强,公司换掉的代价大,怎么可能会被裁掉,都是淘汰末端的业务Curd而已!现如今市场上初级程序员泛滥,这套教程针对Android开发工程师1-6年的人员、正处于瓶颈期,想要年后突破自己涨薪的,进阶Android中高级、架构师对你更是如鱼得水,赶快领取吧!