C++基础算法总结,2024最新Android面试笔试

66 阅读3分钟
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学习PDF+学习视频+面试文档+知识点笔记

【Android思维脑图(技能树)】

知识不体系?这里还有整理出来的Android进阶学习的思维脑图,给大家参考一个方向。

【Android高级架构视频学习资源】

**Android部分精讲视频领取学习后更加是如虎添翼!**进军BATJ大厂等(备战)!现在都说互联网寒冬,其实无非就是你上错了车,且穿的少(技能),要是你上对车,自身技术能力够强,公司换掉的代价大,怎么可能会被裁掉,都是淘汰末端的业务Curd而已!现如今市场上初级程序员泛滥,这套教程针对Android开发工程师1-6年的人员、正处于瓶颈期,想要年后突破自己涨薪的,进阶Android中高级、架构师对你更是如鱼得水,赶快领取吧!