0%

一、题目

Valid Sudoku链接

题目要求:
Determine if a 9x9 Sudoku board is valid. Only the filled cells need to be validated according to the following rules:

  • Each row must contain the digits 1-9 without repetition.
  • Each column must contain the digits 1-9 without repetition.
  • Each of the 9 3x3 sub-boxes of the grid must contain the digits 1-9 without repetition.

每一行都不能重复1-9
每一列都不能重复1-9
每个33的小格子(99分为9个3*3)不能重复

二、解题分析

  • 每一行每一列的数据,我们可以通过遍历二维数组解决;
  • 每个33的怎么解决呢?还是遍历二维数组,循环大(99)的二维数组时,符合条件再循环小(3*3)数组;
  • 怎么判断没有重复?方法很多,这里通过数组下标计数,数组初始值为0,根据下标+1,+1之后如果发现>1那么返回错误;

开始解题的时候可以一个大循环解决一个小问题,后续再把循环合并即可;
开始的时候我是写了三个双重for循环:

  1. 解决行重复判断问题;
  2. 解决列重复判断问题;
  3. 解决子矩阵重复判断问题;

当发现每一步都可行之后,尝试着合并,以减少时间复杂度;

三、代码样例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
public static boolean isValidSudoku(char[][] board) {
// 处理 9 * 9
for (int i = 0; i < board.length; i++) {
int[] rowFlag = new int[10];
int[] columnFlag = new int[10];
for (int j = 0; j < board.length; j++) {
char row = board[i][j];
char column = board[j][i];
if (check(rowFlag, row)) {
return false;
}
if (check(columnFlag, column)) {
return false;
}
// 处理 3 * 3
if (i % 3 == 0 && j % 3 == 0) {
int[] smallFlag = new int[10];
for (int k = i; k < i + 3; k++) {
for (int l = j; l < j + 3; l++) {
char now = board[k][l];
if (check(smallFlag, now)) {
return false;
}
}
}
}
}
}
return true;
}

四、代码详情

可运行demo

Read more »

一、说明

做这件事的目的是为了了解一条数据库记录从创建到使用的一个情况;
查询分布时间计算方式采用Top Percentile方式,就是按一定排序的数据,前面xx%的最大值是多少;
TP999 1ms 代表某接口99.9%的响应都在1ms之内;

最终的目的也就是为了知道数据多久之后可以打入冷宫,使用廉价存储;
冷热数据分级处理有利于在性能和成本上达到一定的平衡;
如把内存缓存时间设置为tp90所处的时间,那么90%的数据都能快速返回,其它少量数据回源处理;

关键字
java格式化输出
java8
stream
parallelStream
分组
排序
DoubleSummaryStatistics数据分析
TP999

二、效果

日志源数据预览

1
19-10-24.14:47:12.721 [THREAD-22000-18-T-17] INFO  FacadeImpl        - response yw:jiaoyi, orderId:123456, time:2019-10-24T14:46:44
ywcountmin(ms)max(ms)tp50(ms)tp90(ms)tp99(ms)tp999(ms)
hisen1000110000206090130
hisen-1200216000165070110

ps 输出是格式化的数据,并不是表格,可以通过:

world->粘贴输出文本->插入->表格->文本转换成表格->空格

即可完成文字到表格转换

这种过程可能比较low,但是也需要时间去处理,过程中还得配合linux命令等整合文本;

三、代码

完整:github-CallerAnalyze.java
摘要如下:

Read more »

一些简单的黑产攻防介绍

  1. 修改前置摄像头,直接播放本地视频或者图片(色情诈骗、网约车司机人脸识别);
  2. 恶意注册靶机系统:黑卡猫池、群控、云控、箱控(12个主板,模拟120台手机);
  3. 模拟点击脚本在黑产中使用比例逐年增高,主要是效果好很难区分是否为真实用户;
  4. ROS软路由(可管理250个IP)、秒拨(每次拨号IP改变);
Read more »

很不错的一本书,作为程序员都值得去看一看,170+页周末一天可以看完, 还包括做笔记

医学专业已经建立起一套严密的辅导体系
软件行业建立一种包含学徒期、实习期、和长期指引的机制已是迫在眉睫

有人指导大多数人都可以快速的成长,节省很多走弯路的时间
当然,事在人为,只是说掌握了书中的那些要领,成为专业人员的几率更高,做更好的自己
如果从小学开始就一直有人引路并且自己也愿意跟着走的话,应该会很棒,现在也不晚,抓住时间就好

主要内容:
专业主义
学会说“不”,学会说“是”
编码的正确姿势
TDD
卡塔练习很重要,肌肉反应
验收测试(各方都一致同一的检验方式)
测试策略,自动化测试是趋势
时间管理,番茄工作法,注意力点数
预估的概念以及方法
压力,避免与面对
协作,学会与人交流
团队与项目,有凝聚力的团队战斗力强
软件开发如医生一样培训更佳
合适的工具事半功倍

Read more »

一、背景

业务当中多处用到线程池进行异步处理;
为了得知线程池设置是否合理,故需要增加线程池监控;
常见的实现方式:

  1. org.springframework.scheduling.concurrent.ScheduledExecutorTask
  2. org.springframework.scheduling.annotation.Scheduled

本文使用1的方式实现,主要是方便进行配置,可以托管多个任务;

二、效果预览

1
2
3
taskName:pool1-monitor. taskCount:820, completedTaskCount:820, largestPoolSize:30, poolSize:30, activeCount:0, corePoolSize:30, maximumPoolSize:50, queueSize:0
taskName:pool2-monitor. taskCount:1703, completedTaskCount:1703, largestPoolSize:30, poolSize:30, activeCount:0, corePoolSize:30, maximumPoolSize:50, queueSize:0
taskName:pool3-monitor. taskCount:820, completedTaskCount:448, largestPoolSize:30, poolSize:30, activeCount:30, corePoolSize:30, maximumPoolSize:50, queueSize:342

三、监控逻辑

代码如下:

Read more »

一、内容简介

这是一本人类大脑可塑性研究先驱与翘楚的故事书,正是让我们用触觉看到世界的巴赫-利塔这类先驱,使得我们正在成为来自地球的神。

二、读后感

这本书对我来讲还是很棒的,刷新了我对大脑的认知;
以前还停留在左右脑分工上,殊不知这是日本鬼子整出来的不严谨的概念;
看完书,感觉对个人技术、学习方面都有帮助,增加信心,因为之前错过了学校的大把学习时间;
运动和学习是互补的,前者产生新的神经干细胞,后者使它们的寿命延长;

这本书我是很推荐看的;
犹如最近看完的reids英文版文档;
每天看一点点,持续的刺激大脑相关区域,收获还是可以;
之前也咨询过英语比较好的同事;
反馈说目前想提高,就拿着领域内的文档硬看,坚持下来会有收获的;

每次看完书都会发个微博,避开朋友圈的尴尬,扩大散播范围,与更多的同好交流;

三、内容摘要

《重塑大脑,重塑人生》0822~0901
在持续不断噪声环境中长大的孩子都好动和吵闹,白噪声对大脑发育也有影响。

Read more »

零、相关介绍

关键错误信息:
java.lang.RuntimeException: RESTeasy Provider Factory is null, do you have the ResteasyBootstrap listener configured?
java.lang.RuntimeException: Illegal to inject a message body into a singleton into public com.alibaba.fastjson.support.jaxrs.FastJsonProvider(java.lang.String)

resteasy:JBoss的一个开源项目,提供一套完整的框架帮助开发人员构建RESTful Web Service和RESTful Java应用程序。
fastjson:由阿里开发的一个性能很好的Java JSON 解析器和生成器。

引起错误的依赖

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.58</version><!--改为:1.1.34.sec01相安无事-->
</dependency>
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-jaxrs</artifactId>
<version>2.2.1.GA</version>
</dependency>
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>jaxrs-api</artifactId>
<version>2.2.1.GA</version>
</dependency>
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-spring</artifactId>
<version>2.2.1.GA</version>
</dependency>

一、错误日志

本地启动Server报错

Read more »

零、本文背景

一个接口的关键指标应该就是响应速度,要想提高响应速度,结果在缓存中最好;
那么怎么确定一个合理的缓存时间,以平衡性能与成本呢?
我们可以通过记录业务请求,看读取缓存的时间分布,比如 99% 的请求都是 1天内;

近期在做日志分析,找到比较理想的一个缓存过期时间,使 90% 的查询都能被缓存覆盖;
发现有些同学不太懂 TP 指标,故写文记录一下。

一、性能指标含义

常见指标:TP50、TP80、TP90、TP99、TP999
正式解释:TP=Top Percentile,Top百分数,是一个统计学术语,与平均数、中位数都是一类;
通俗理解:TP99 100ms,99%的查询都能在100ms内返回;
本质理解:它是一个分位值,看数据的一个分布;

二、性能指标计算

计算方式:拿到所有请求耗时,升序排序,取 99% 位置的数据,就是 TP99;
比如说:拿 100 次请求的耗时,升序排序,取第 99 个的数据,就是TP99的值;

具体的代码方式就是,先算出耗时,放入 List ,然后排序,按指定的下标取值即可;

代码如下:

Read more »

零、本文背景

项目中看到有一个缓存接口存在多个实现类,
但是在代码中使用@Resource注解注入,
之前有了解过@Autowire @Resource的区别,
于是就尝试着搜索@@Resource,于是就有本文的总结了。

一、两个注解

1.1 @Autowire

1.1.1 Spring开发;
1.1.2 按照type来注入;

1.2 @Resource

1.2.1 JDK开发;
1.2.2 按照名称注入,若无,则按type来注入(未指定name的情况下);

二、后记

  1. 做事情要有计划,得主动;
  2. 需要想清楚自己想要什么样的生活,然后朝着目标奋斗;
  3. 使用现成的代码尽量搞清楚来龙去脉,可以学习知识,更能避免被坑;
  4. 每天的学习时间需要保证,坚持很重要;