Java最新PAT甲级备战-高精度和排序,java工作三年面试题

最后

小编精心为大家准备了一手资料

以上Java高级架构资料、源码、笔记、视频。Dubbo、Redis、设计模式、Netty、zookeeper、Spring cloud、分布式、高并发等架构技术

【附】架构书籍

  1. BAT面试的20道高频数据库问题解析
  2. Java面试宝典
  3. Netty实战
  4. 算法

BATJ面试要点及Java架构师进阶资料

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

排序

=====================================================================

技巧

对于模拟题,我们只需要考虑两个事情,1 怎么存数据 2 怎么模拟

round()四舍五入

count() 哈希表中查找是否存在,存在为1

容器中升降序排序

sort(Array.begin(),Array.end(),greater<类型>()); //降序

sort(Array.begin(),Array.end(),less<类型>()); //升序

或者自定义cmp函数

bool cmp(int a,int b){

return a>b;

}

sort(p[i].begin(),p[i].end(),cmp);

当使用getline读入一行时,如果前面有cin,需要使用getchar()吞掉上一个回车

getline配合stringstream可以遍历以空格为分隔的一串字符串

输入a b c d

string line;

getline(cin,line);

string key;

stringstream ss(line);

while(ss>>key)

s = ss.substr(index); 截取ss字符串index位置后的字符串给s

结构体排序 重载操作符

struct Student{

string id;

int score;

int position;

int localrank,allrank;

bool operator<(const Student& t)const{

if(score!=t.score) return score>t.score;

else return id<t.id;

}

}

定义结构体后记得写 ;

堆排序

如何手撸一个堆?

首先,堆是一个完全二叉树,且分为小根堆(子节点小于父母节点)和大根堆(子节点大于父母节点)。

那用什么来存入一个堆呢?一维数组!

对于一个一维数组a[] ,n[1]表示根节点,a[2_n]和a[2_n+1]分别为a[n]的左右子节点。

对于一个堆来说,我们有两个操作,down()操作和up()操作,这两个操作的组合(时间复杂度均为logn)可以实现对堆的一切修改。

对于小根堆:

**down()**操作:将某一个节点的值变大,堆重新调整,该节点下移

**up()**操作:将某一个节点的值变小,堆重新跳整,该节点上移

image.png

堆排序:每次输出堆顶

image.png

#include<bits/stdc++.h>

using namespace std;

const int N = 100010;

int h[N],size_;

int n,m;

void down(int u){

int t = u;

if(2u<=size_&&h[t]>h[2u]) t = 2*u;

if(2u+1<=size_&&h[t]>h[2u+1]) t = 2*u+1; //两个if找出三个节点中最小的节点,用这个节点和父节点交换

if(u!=t){

swap(h[u],h[t]);

down(t);

}

}

int main(){

cin>>n>>m;

for(int i=1;i<=n;i++){

int k;

cin>>k;

h[i] = k;

}

size_ = n;

for(int i=n/2;i;i–) down(i);

while(m–){

cout<<h[1]<<’ ';

swap(h[size_], h[1]);

size_–;

down(1);

}

return 0;

}

二分

二分模板

1.循环必须是l < r

2.if判断条件看是不是不满足条件, 然后修改上下界

3.若if else后是r = mid - 1,则前面mid 语句要加1

4.出循环一定是l == r,所以l和r用哪个都可以

二分只有下面两种情况

1:找大于等于给定数的第一个位置 (满足某个条件的第一个数)

2:找小于等于给定数的最后一个数 (满足某个条件的最后一个数)

image.png

image.png

// 判断条件很复杂时用check函数,否则if后直接写条件即可

bool check(int mid) {

return …;

}

// 能二分的题一定是满足某种性质,分成左右两部分

// if的判断条件是让mid落在满足你想要结果的区间内

// 找满足某个条件的第一个数 即右半段

int bsearch_1(int l, int r)

{

while (l < r)

{

int mid = l + r >> 1;

if (check(mid)) r = mid;

else l = mid + 1;

}

return l;

}

// 找满足某个条件的最后一个数 即左半段

int bsearch_2(int l, int r)

读者福利

分享一份自己整理好的Java面试手册,还有一些面试题pdf

不要停下自己学习的脚步

字节跳动的面试分享,为了拿下这个offer鬼知道我经历了什么

字节跳动的面试分享,为了拿下这个offer鬼知道我经历了什么

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

va面试手册,还有一些面试题pdf

不要停下自己学习的脚步

[外链图片转存中…(img-8tcmZ09C-1715410390993)]

[外链图片转存中…(img-wrK2TfMJ-1715410390994)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值