Algorithm
leecode-119 杨辉三角 II
题目描述
给定一个非负索引 k,其中 k ≤ 33,返回杨辉三角的第 k 行。
示例:
输入: 3
输出: [1,3,3,1]
解题思路
例如输入索引k = 3, 对应是第 3 + 1 = 4行,得出第4行共有4个值,且每个值为
第一个值为: 1
第二个值为: (n - 1) / 1 = (4 - 1) / 1 = 3
第三个值为: (n - 1) / 1 * (n -2) / 2 = (n - 1)(n - 2)/ (1 * 2) = (4-1)(4-2)/(12) = 3
第四个值为: (n - 1) / 1 * (n - 2) / 2 * (n-3)/3 = (n-1)(n-2)(n-3)/(123) =
- (4-1)(4-2)(4-3)/(12*3) = 1
由此得出规律:
索引为n-1的行为n,且该行共有n个值(n > 1),得出第n行每个值为:
后一个值等于前一个值然后乘以(n - i) / i
即numVal = (n - i) / i * res.get(i - 1)
public List<Integer> getRow(int rowIndex) {
List<Integer> res = new ArrayList<>(rowIndex + 1);
for (int index = 0; index < numRows; index++){
if (index == 0){
res.add(1);
}else {
long eachValOfRow = (long) res.get(index - 1) * (long) (numRows - index) / index;
res.add((int) eachValOfRow);
}
}
return res;
}
Review
本周主要回顾下springboot项目中如何搭建两套kafka集群,因本周开发时候遇到需要监听其他项目的kafka消息,和自己的项目出现消费冲突,继而学习了kafka环境配置及多个集群的搭建。
第一步:新建其他项目kafka配置文件kafka.properties
第二步:定义第二个kafka的实现类
@Configuration
@PropertySource("classpath:kafka.properties")
//@EnableKafka
public class KafkaCarConsumerConfig {
@Value("${kafka.consumer.servers}")
private String servers;
@Value("${kafka.consumer.enable.auto.commit}")
private boolean enableAutoCommit;
@Value("${kafka.consumer.session.timeout}")
private String sessionTimeout;
@Value("${kafka.consumer.auto.commit.interval}")
private String autoCommitInterval;
@Value("${kafka.consumer.group.id}")
private String groupId;
@Value("${kafka.consumer.auto.offset.reset}")
private String autoOffsetReset;
@Bean
public KafkaListenerContainerFactory<ConcurrentMessageListenerContainer<String, String>> kafkaCarListenerContainerFactory() {
ConcurrentKafkaListenerContainerFactory<String, String> factory = new ConcurrentKafkaListenerContainerFactory<>();
factory.setConsumerFactory(consumerCarFactory());
factory.getContainerProperties().setPollTimeout(1500);
return factory;
}
public ConsumerFactory<String, String> consumerCarFactory() {
return new DefaultKafkaConsumerFactory<>(consumerCarConfigs());
}
public Map<String, Object> consumerCarConfigs() {
Map<String, Object> propsMap = new HashMap<>();
propsMap.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, servers);
propsMap.put(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG, enableAutoCommit);
propsMap.put(ConsumerConfig.AUTO_COMMIT_INTERVAL_MS_CONFIG, autoCommitInterval);
propsMap.put(ConsumerConfig.SESSION_TIMEOUT_MS_CONFIG, sessionTimeout);
propsMap.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
propsMap.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
propsMap.put(ConsumerConfig.GROUP_ID_CONFIG, groupId);
propsMap.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, autoOffsetReset);
return propsMap;
}
}
第三步:实现监听类(注意:containerFactory的值必须和第二步骤中的bean名称一致)
@KafkaListener(topics={"FTC-RESULT"},containerFactory="kafkaCarListenerContainerFactory")
public void consumer(ConsumerRecord<?,?> record){
//消息消费解析
}
方法二推荐通过
生产者工厂方法: producerFactory()
生产者KafkaTemplate :kafkaTemplate()
消费者的工厂方法:consumerFactory()
消费者的监听容器工厂方法: kafkaListenerContainerFactory()
链接
Tips
Jsch简介
JSch 是SSH2的一个纯Java实现。它允许你连接到一个sshd 服务器,常用的有三种通道,即ChannelShell、ChannelExec、ChannelSftp,前两类用于执行命令(命令可以是shell语句,也可以是python xxx.py),后一种是用于上传下载文件。
使用步骤:
1、new一个JSch对象;
2、从JSch对象中获取Session,用于连接,并设置连接信息(根据SSH的连接原理,有两种方式,一是用户名+密码,二是用户名+privatekey+passphrase,第二种方式要在第1步设置,即jsch.addIdentity(xxx));
3、使用session对象调用opnChannel(“xxx”)打开通信信道,并连接;
4、使用不同的channel进行操作
这里介绍一个文件通过sftp上传下载的实现
public static void downloadSftp(String srcFile, String targetFile,Properties properties) throws JSchException, IOException {
Jsch jsch = new Jsch();
Session session = null;
String sftpUser = properties.getProperty("config.sftp.user_load");
String sftpPassword = properties.getProperty("config.sftp.password_load");
String sftpHost = properties.getProperty("config.sftp.host");
int sftpPort = Integer.parseInt(properties.getProperty("config.sftp.port"));
try{
session = jsch.getSession(sftpUser,sftpHost,sftpPort);
session.setPassword(sftpPassword);
sshConfig.put("StrictHostKeyChecking", "no");
session.setConfig(sshConfig);
session.setTimeout(30000);
session.connect();
ChannelSftp channel = (ChannelSftp)session.openChannel("sftp");
channel.connect();
new File(targetFile).getParentFile().mkdirs();
new File(targetFile).createNewFile();
channel.get(srcFile,new File(targetFile).getAbsolutePath());
channel.get(srcFile,targetFile);
channel.exit();
} catch(SftpException e){
logger.error("download error! File:{} does not exist.",srcFile);
}finally {
if(session != null && session.isConnected()){
session.disconnect();
}
}
}
我们在写 shell 脚本的时候通常会需要用 ssh 登录到远程服务器执行一些命令。
这个时候就懵逼了,我 ssh 直接执行过去了,怎么去应答这个询问啊。 这个时候就需要知道 ssh 有一个非交互方式登录 StrictHostKeyChecking
主机公钥确认 StrictHostKeyChecking
1、StrictHostKeyChecking=no 最不安全的级别,当然也没有那么多烦人的提示了,相对安全的内网测试时建议使用。如果连接server的key在本地不存在,那么就自动添加到文件中(默认是known_hosts),并且给出一个警告。
2、StrictHostKeyChecking=ask 默认的级别,就是出现刚才的提示了。如果连接和key不匹配,给出提示,并拒绝登录。
3、StrictHostKeyChecking=yes 最安全的级别,如果连接与key不匹配,就拒绝连接,不会提示详细信息。
JSch包实现SFTP上传、下载
JSch基本使用
Share
我好像从来没有给自己人生一个非常明确的定位,喜欢什么就去接触什么,自我介绍的时候我会说我喜欢新鲜的事物,我不抵触任何陌生的领域,因为我想去看到更全貌的世界。可至今26岁的我依然说不出自己未来是一个什么定位,我安慰自己说可能看到的东西还是不够,经历还是太少,但内心又告诉自己不该是这样的,比如说拍照这件事,摄影从我上大学开始进入我的生活,俗话说师姐领进门,修行在各人,从开始的新闻类摄影,追求的真实有故事有情节的画面,到后期开始自己玩摄影。那时候用自己奖学金买了第一台索尼微单,用到上半年因镜头问题无法感应传感器,这个过程一直在探索自己到底喜欢拍什么,也一直在思考自己对于摄影的兴趣到底有多深,可好像一直在我身上有个致命的缺点就是,无论对待什么都没有足够的激情,导致什么都喜欢却什么都不精,我喜欢可我投入的不够,我总是能认识到自己可改正起来却好像无比困难。近期巨款购入了一款索尼A7M3,想着希望借此来推动自己一把 ,加大激情的马力,试着让自己的摄影技术往另外一个阶段去上升,充分发挥出这款相机的价值,但摄影题材貌似依然还是不确定,那就去尝试好,工作之后貌似自己拖延症也在慢慢改变,不止工作上也希望自己的兴趣爱好上也能行动起来。
2020年已经进入到下半年了,我还是希望自己和他都能有所改变吧,和他一起努力成为更丰富更有能力的人。多看书多运动多拍照~