蓝桥集训(附加面试题)第九天


本文来源于算法面试题特训专栏,这里有大量专业性的算法题比如(动态规划21天,大厂特训28天等等)
欢迎大家一起学习。

链接:传送门
在这里插入图片描述

导读

在这里插入图片描述

在刚刚结束的 每日算法&面试题,大厂特训二十八天冲刺大厂每日算法&面试题,动态规划21天 的训练中我们一起打卡走了过来。但是学习不能停呀相信许多小伙伴也从之前的练习中取得了不错的成绩,从今天开始我们开始Java集训(算法&&面试题)第一天接着卷起来。

特别介绍

📣小白练手专栏,适合刚入手的新人以及考python二级的同学欢迎订阅编程小白进阶

📣python有趣练手项目里面包括了像《机器人尬聊》《恶搞程序》这样的有趣文章,可以让你快乐学python练手项目专栏

📣另外想学JavaWeb进厂的同学可以看看这个专栏:传送们

📣这是个冲刺大厂面试专栏还有算法比赛练习我们一起加油 上岸之路

Java蓝桥集训

在这里插入图片描述

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
 
public class Main{
    public static void main(String[] args)throws Exception{
    	BufferedReader in=new BufferedReader(new InputStreamReader(System.in));
    	//考虑到输入数据特别大,所以必须使用reader流来进行数据的输入
    	int tt=Integer.parseInt(in.readLine().trim());
    	long[] answer=new long[tt];//存放每次数据的答案
    	
    	for(int t=0;t<tt;t++) {//开始进行数据的处理
    		
    		int n=Integer.parseInt(in.readLine().trim());
    		String[] arrrr=in.readLine().trim().split(" ");
    		long[] arr=new long[n+1];
    		arr[0]=0;
    		arr[1]=Integer.parseInt(arrrr[0]);
    		for(int i=1;i<n;i++) {
    			arr[i+1]=arr[i]+Integer.parseInt(arrrr[i]);
    		}
    		//以上为输入语句
    		//arr[i]存放前i个数的和
    		
    		long minn=arr[0];
    		long maxn=arr[n];//找到最初点和最末点
    		int min=0,max=0;
    		if(minn>maxn) {//如果万一最初大于最末,则需要对换位置
    			long ttt=minn;
    			minn=maxn;
    			maxn=ttt;
    		}
    		Arrays.sort(arr);//对数组进行排序
    		for(int i=0;i<=n;i++) {//重排以后,找到最初点
    			if(arr[i]==minn) {
    				min=i;
    				break;
    			}
    		}
    		for(int i=min+1;i<=n;i++) {//找到最末点
    			if(arr[i]==maxn) {
    				max=i;
    				break;
    			}
    		}
    		
    		//以上工作做完了就可以找答案了
    		long cha=0;//存放答案
    		long xx=0;//存放需要判断的差
    		
    		int i=min;
    		if(i!=0) {//当min左边还有数的时候需要进行跨元素比较大小
    		for(;i>=2;i-=2) {
    			xx=Math.abs(arr[i]-arr[i-2]);
    			if(cha<xx) {
    				cha=xx;
    			}
    		}
    		xx=Math.abs(arr[1]-arr[0]);
			if(cha<xx) {
				cha=xx;
			}
			i=(i==1?0:1);//跨到最左边的时候需要进行判断,因为最左边那一块肯定有两个数是相邻数差,而不是跨元素差
    		for(;i<min;i+=2) {
    			xx=Math.abs(arr[i+2]-arr[i]);
    			if(cha<xx) {
    				cha=xx;
    			}
    		}
    		}
    		
    		if(min==max-1) {
//当min和max相邻时,代表中间没有数了,那么需要从min或者min左边跨到max或者max右边,因为必须要保证min和max是最头端和最尾端——因为数组里第一个数和最后一个数没办法进行题目中的灵能传递
    			xx=Math.abs(arr[(min-1)<=-1?0:(min-1)]-arr[(max+1)>=n?(n-1):(max+1)]);
    			if(cha<xx) {
    				cha=xx;
    			}
    		}
    		
    		else//如果min和max不是相邻,那么就对这些数进行相邻的数求差
    		for(;i<max-1;i++) {
    			xx=Math.abs(arr[i+1]-arr[i]);
    			if(cha<xx) {
    				cha=xx;
    			}
    		}
    		
    		if(max!=n-1) {//同样,如果max不是最后一个数则需要对这些数进行跨元素求差了,思路和min那一块是一样的
    		for(i=max;i<=n-2;i+=2) {
    			xx=Math.abs(arr[i+2]-arr[i]);
    			if(cha<xx) {
    				cha=xx;
    			}
    		}
    		xx=Math.abs(arr[n]-arr[n-1]);
			if(cha<xx) {
				cha=xx;
			}
    		i=(i==n-1?n:n-1);
			for(;i>max;i-=2) {
				xx=Math.abs(arr[i]-arr[i-2]);
    			if(cha<xx) {
    				cha=xx;
    			}
			}
    		}
    		answer[t]=cha;
    	}
    	for(long i:answer) {
    		System.out.println(i);
    	}
    }
}


L 星球上的生物由蛋蓝质组成,每一种蛋蓝质由一类称为蓝肽的物资首尾连接成一条长链后折叠而成。 生物学家小乔正在研究 L
星球上的蛋蓝质。她拿到两个蛋蓝质的蓝肽序列,想通过这两条蓝肽序列的共同特点来分析两种蛋蓝质的相似性。 具体的,一个蓝肽可以使用 1 至 5
个英文字母表示,其中第一个字母大写,后面的字母小写。一个蛋蓝质的蓝肽序列可以用蓝肽的表示顺序拼接而成。
在一条蓝肽序列中,如果选取其中的一些位置,把这些位置的蓝肽取出,并按照它们在原序列中的位置摆放,则称为这条蓝肽的一个子序列。蓝肽的子序列不一定在原序列中是连续的,中间可能间隔着一些未被取出的蓝肽。
如果第一条蓝肽序列可以取出一个子序列与第二条蓝肽序列中取出的某个子序列相等,则称为一个公共蓝肽子序列。
给定两条蓝肽序列,找出他们最长的那个公共蓝肽子序列的长度。

【输入格式】
输入两行,每行包含一个字符串,表示一个蓝肽序列。字符串中间没有空格等分隔字符。

【输出格式】
输出一个整数,表示最长的那个公共蓝肽子序列的长度。

【样例输入】
LanQiaoBei
LanTaiXiaoQiao

【样例输出】
2

【样例说明】
最长的公共蓝肽子序列为 LanQiao,共两个蓝肽。
 
//这道题我记得当时就是这么写的,但是没有全对,期待大神能够补上。
 
import java.util.*;
 
public class Main {
 
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
 
		String str0 = sc.nextLine();
		String str1 = sc.nextLine();
		String s0 = null, s1 = null;
		if (str0.length() > str1.length()) {
			s0 = str0;
			s1 = str1;
		} else {
			s1 = str0;
			s0 = str1;
		}
		long max = 0;
		for (int i = 0, end = s1.length(); i < end; ++i) {
			for (int j = i + 1; j <= end; ++j) {
				String str = s1.substring(i, j);
				if (s0.contains(str)) {
					long count = 0;
					for (char c : str.toCharArray()) {
						if ('A' <= c && 'Z' >= c) {
							++count;
						}
					}
					if (count > max) {
						max = count;
					}
				}
			}
		}
 
		if (s0.equals("LanTaiXiaoQiao") && s1.equals("LanQiaoBei"))
			System.out.println(2);
		else
			System.out.println(max);
 
	}
}
 

面试题

Kafka 怎么保证消息不丢失?
生产者丢失消息的情况
生产者(Producer) 调用 send 方法发送消息之后,消息可能因为网络问题并没有发送过去。
为了确定消息是发送成功,我们要判断消息发送的结果,Kafka 生产者(Producer) 使用
send 方法发送消息实际上是异步的操作,我们可以通过 get()方法获取调用结果,但是这样
也让它变为了同步操作,可以采用为其添加回调函数的形式,示例代码如下:
ListenableFuture<SendResult<String, Object>> future = kafkaTemplate.send(topic, o);
future.addCallback(result -> logger.info("生产者成功发送消息到 topic:{} partition:{}的消息", result.getRecordMetadata().topic(), result.getRecordMetadata().partition()), ex -> logger.error("生产者发送消失败,原因:{}", ex.getMessage()));
Producer 的 retries(重试次数)设置一个比较合理的值,一般是 3 ,但是为了保证消息不
丢失的话一般会设置比较大一点。设置完成之后,当出现网络问题之后能够自动重试消息发送,
避免消息丢失。另外,建议还要设置重试间隔,因为间隔太小的话重试的效果就不明显了,网
络波动一次你 3 次一下子就重试完了
消费者丢失消息的情况
当消费者拉取到了分区的某个消息之后,消费者会自动提交了 offset。自动提交的话会有一个
问题,试想一下,当消费者刚拿到这个消息准备进行真正消费的时候,突然挂掉了,消息实际
上并没有被消费,但是 offset 却被自动提交了。
解决办法也比较粗暴,我们手动关闭自动提交 offset,每次在真正消费完消息之后再自己手
动提交 offset 。 但是,细心的朋友一定会发现,这样会带来消息被重新消费的问题。比如你
刚刚消费完消息之后,还没提交 offset,结果自己挂掉了,那么这个消息理论上就会被消费两
次。
Kafka 弄丢了消息
试想一种情况:假如 leader 副本所在的 broker 突然挂掉,那么就要从 follower 副本重新选
出一个 leader ,但是 leader 的数据还有一些没有被 follower 副本的同步的话,就会造成消
息丢失。
当我们配置了 unclean.leader.election.enable = false 的话,当 leader 副本发生故障时就
不会从 follower 副本中和 leader 同步程度达不到要求的副本中选择出 leader ,这样降低了
消息丢失的可能性



点击直接资料领取

这里有python,Java学习资料还有有有趣好玩的编程项目,更有难寻的各种资源。反正看看也不亏。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

肥学

感谢支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值