输入例子 1:
10
10 10 10 10 20 20 30 30 40 40
输出例子 1:
30
解答:
/简单,时间复杂度也低/
#include
using namespace std;int main(){
int n,t=0,syn=0;
int price[1000]={0};
cin>>n;
while(n–){
cin>>t;
price[t]=1;
}
t=0;
for(int i=0;i<1000;i++){
if(price[t]&&syn<3)
syn++;
if(syn==3)
break;
t++;
}
syn==3?cout<<t:cout<<-1;
}
2、一个数轴上共有 N 个点,第一个点的坐标是度度熊现在位置,第 N-1 个点是度度熊的家。现在他需要依次的从 0 号坐标走到 N-1 号坐标。
但是除了 0 号坐标和 N-1 号坐标,他可以在其余的 N-2 个坐标中选出一个点,并直接将这个点忽略掉,问度度熊回家至少走多少距离?
解答:
从 N-2 个坐标中选出一个点,并直接将这个点忽略掉。直接忽略一个点只会直接影响到,这个节点前后节点的距离。这个 影响的距离我们暂且命名为优化距离,**将所有节点按顺序组成三个节点的集合,**通过这种方式只需要通过一次循环便能得到结果。
优化距离越大说明如果去掉这个集合的中点元素将会使得总距离越短,下面上代码。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int length = scanner.nextInt();
int[] arrays = new int[length];
for (int i = 0; i < length; i++) {
arrays[i] = scanner.nextInt();
}
/**
-
sum 总距离
-
repetition 三个节点 中被重复计算的总距离
-
select 优化距离最大的 三个节点两两相加的距离
-
add 三个结尾距离为 max 中 头尾节点的距离
-
last 最后三个节点中 尾距离没有被计算两次 需要加上
-
optimizeDistance 优化距离
*/
int sum = 0,int repetition = 0,int select = 0,int add = 0,int last = 0,int optimizeDistance = 0;
for (int i = 0; i <= (arrays.length - 3); i++) {
int begin = arrays[i];
int mid = arrays[i + 1];
int end = arrays[i + 2];
//三个点之间的距离
int threePointDistance = Math.abs(mid - begin) +
Math.abs(end - mid);
//两个点之间的距离 即被多次计算待会需要减掉的距离
int twoPointDistance = Math.abs(end - mid);
int contrast = threePointDistance - Math.abs(begin - end);
repetition += twoPointDistance;
sum += threePointDistance;
last = twoPointDistance;
if (contrast > optimizeDistance) {
optimizeDistance = contrast;
select = threePointDistance;
add = Math.abs(end - begin);
}
}
System.out.println((sum - select + last) - repetition + add);
}
}
3、度度熊最近对全排列特别感兴趣,对于 1 到 n 的一个排列,度度熊发现可以在中间根据大小关系插入合适的大于和小于符号(即 ‘>’ 和 ‘<’ )使其成为一个合法的不等式数列。
但是现在度度熊手中只有 k 个小于符号即(‘<’‘)和 n-k-1 个大于符号(即’>'),度度熊想知道对于 1 至n 任意的排列中有多少个排列可以使用这些符号使其为合法的不等式数列。
解答:
dp[i][j] = (dp[i - 1][j - 1] * (i - j) + dp[i - 1][j] * (j + 1)) % 2017;
dp[i][j]表示有 i 个数字及 j 个小于号所能组成的数量(大于号数量当然是 i - j - 1 次,后面需要使用)
而加入第 i + 1 个数字时,分以下四种情况:
-
如果将 i+1 插入当前序列的开头,即有了 1<2,加入后成为 3>1<2,会发现等于同时加入了一个大于号!(此时可以无视 1 与 2 之间的关系,因为 i+1>i)
-
如果将 i+1 插入当前序列末尾,即 1<2 变成了 1<2<3,会发现等于同时加入了一个小于号! (此时可以无视 1 与 2 之间的关系,因为 i+1>i)
-
如果将i+1加入一个小于号之间,即已经有 1<2了,向中间加入3,会发现变成了1<3>2,等于同时加入了一个大于号!
-
如果将 i+1 加入一个大于号中间,即有了 2>1,变成了 2<3>1,等于同时加入了一个小于号!
综上所述,**dp[i][j]**等于以上四种情况之和:
dp[i - 1][j] 将 i 加在开头等于加入一个大于号,即要求 i-1 个数时已经有了 j 个小于号;
dp[i - 1][j - 1] 将 i 加在末尾等于加入一个小于号,即要求 i-1 个数时已经有了 j-1 个小于号;
dp[i - 1][j] * j 将 i 加在任意一个小于号之间,等于加入了一个大于号,即要求 i-1 个数时已经有了 j 个小于号,每个小于号都可以进行这样的一次插入;
dp[i - 1][j - 1] * (i- j - 1) 将 i 加载任意一个大于号之间,等于加入了一个小于号,即要求i-1 个数时有了 j-1 个小于号;
而此时共有(i - 1) - (j - 1)- 1 个大于号,每个大于号都要进行一次这样的操作合并同类项即为dp[i][j] = (dp[i - 1][j - 1] * (i - j) + dp[i - 1][j] * (j + 1))。
最后要记得取模。
…
由于篇幅原因,我就不一一给大家展示了,需要文件的朋友可以来私信我。
由于在准备面试,以前收集的Java进阶宝典《Java核心知识点整理.pdf》,全文覆盖了JVM、锁、高并发、反射、mybatis、Spring原理、微服务、Zookeeper、数据库、数据结构等等内容,获取方式: 加小助理微信 mxj94670 即可免费领取!
于是,我被老大叫去办公室喝茶,然后,就离职了。
**OS:**你TM裁员就裁员,突击测试算怎么回事?
这段时间,我就是待就业状态,网上找了一些算法和安卓有关的课程(没错,我转安卓了,以后有问题可以一起探讨探讨)
帮忙宣传一下,这个课程的具体内容:
JAVA容器
树
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)
总结
阿里伤透我心,疯狂复习刷题,终于喜提offer 哈哈~好啦,不闲扯了
1、JAVA面试核心知识整理(PDF):包含JVM,JAVA集合,JAVA多线程并发,JAVA基础,Spring原理,微服务,Netty与RPC,网络,日志,Zookeeper,Kafka,RabbitMQ,Hbase,MongoDB,Cassandra,设计模式,负载均衡,数据库,一致性哈希,JAVA算法,数据结构,加密算法,分布式缓存,Hadoop,Spark,Storm,YARN,机器学习,云计算共30个章节。
2、Redis学习笔记及学习思维脑图
3、数据面试必备20题+数据库性能优化的21个最佳实践
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
op,Spark,Storm,YARN,机器学习,云计算共30个章节。
[外链图片转存中…(img-xbEQOrTi-1713596338277)]
2、Redis学习笔记及学习思维脑图
[外链图片转存中…(img-TAPKw0G6-1713596338277)]
3、数据面试必备20题+数据库性能优化的21个最佳实践
[外链图片转存中…(img-rgbBcDyH-1713596338278)]
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!