抛砖引玉之非零段划分

这里先来看一道CCF的题。

题目描述

A1,A2,…,An是一个由 n 个自然数(非负整数)组成的数组。我们称其中 Ai,…,Aj 是一个非零段,当且仅当以下条件同时满足:
·1≤i≤j≤n;
·对于任意的整数 k,若 i≤k≤j,则 Ak>0;
·i=1 或 Ai-1=0;
·j=n 或 Aj+1=0。
下面展示了几个简单的例子:
·A = [3, 1, 2, 0, 0, 2, 0, 4, 5, 0, 2] 中的 4 个非零段依次为 [3, 1, 2]、[2]、[4, 5] 和 [2];
·A = [2, 3, 1, 4, 5] 仅有 1 个非零段;
·A = [0, 0, 0] 则不含非零段(即非零段个数为 0)。
现在我们可以对数组 A 进行如下操作:任选一个正整数 p,然后将 A 中所有小于 p 的数都变为 0。试选取一个合适的 p,使得数组 A 中的非零段个数达到最大。若输入的 A 所含非零段数已达最大值,可取 p = 1,即不对 A 做任何修改。

  • “白速得”与全民刷牙的习惯

    创造一条习惯的两个基本规律

    1. 找到一种简单又明显的暗示
    2. 清楚地说明有哪些奖赏

    暗示-垢膜

    奖赏-漂亮的牙齿

    从而形成了固定活动-刷牙

  • “纺必适”的除异味策略

    暗示-烟味

    奖赏-清除身上的烟味

    暗示-宠物气味

    奖赏-房子闻起来不像是个狗窝了

    然而失败了,经常吸烟的人往往对烟味不敏感,家里养宠物的人也早已习惯的宠物的气味。

    原因:产品身上的暗示无法被最需要它的人察觉。

  • 满足潜意识的成就感

    为什么习惯如此强大?它们能够创造出神经渴求。(看到暗示就会产生获得奖赏的成就感。)在大部分的时间你,这些渴求是逐渐产生的,而我们确实没有意识到它们的存在,所以往往看不到它们的影子。

    习惯是这样产生的:把暗示、惯常行为和奖赏拼在一起,然后培养一种渴求来驱动这一回路。

    例如吸烟:烟民看到一包万宝路,那么烟民的大脑就会开始预期尼古丁的味道。单是看到香烟就足够让大脑产生对尼古丁渴求的冲动。

    如果你现在每天早上起来晨跑,那你就得选择一个简单的暗示(比如早餐前绑好跑鞋的鞋带或者把运动衣放在床边)和一个清晰的奖赏(可以通过记录你的运动英里数来获得成就感,或者在跑步中产生大量的内啡肽。)

    若想养成习惯,暗示必须除了能够触发惯常行为,还必须能够触发人们对即将到来的奖赏的渴求

  • 渴求驱动习惯

    渴求是创造新习惯方法的基本要素。

    任何人都可以用这个基本的方法来创造自己的习惯。

    想多多锻炼?选择一个暗示(比如每次一醒来就去健身房),然后找一个奖赏(比如每次健身后来一杯奶昔)。想想奶昔或者你会感觉到身体里涌现的内啡肽。让自己去预期奖赏的出现,最终这种渴求会让你每天更想去健身。

    一旦顾客开始预期牙膏会出现泡沫,习惯就形成了。是渴求在驱动着习惯。

如果要养成每天看书的习惯

  • 暗示:书桌/办公桌放一本今天要看的书
  • 惯常行为:读书30分钟左右,做笔记
  • 预期奖赏:写博客发表自己的笔记

如果要养成每天跳绳的习惯

  • 暗示:每天出门前把运动鞋和跳绳准备好
  • 惯常行为:回家以后先换衣服,去跳绳20分钟
  • 预期奖赏:看到自己的运动时间,PAI增长,分享运动记录到朋友圈

在看到暗示的时候,要去预期奖赏,逐渐培养对奖赏的渴求。最终,在准备读书的时候,就能预期到发表到博客的成就感;在换衣服准备运动的时候,就能预期到PAI增长和分享运动记录的成就感,此时渴求就建立了。

很久之前便已经关注刘未鹏前辈的博客了,但是一直没有抽出时间来看,今天正好有时间看了下几篇文章,也节选一部分来提醒自己时刻保持思考。

什么才是你的不可替代性和核心竞争力 – 刘未鹏

http://mindhacks.cn/2009/01/14/make-yourself-irreplacable/

长话短说,我相信以下的知识技能组合是具有相当程度的不可替代性的

  1. 专业领域技能:成为一个专业领域的专家,你的专业技能越强,在这个领域的不可替代性就越高。这个自是不用多说的。
  2. 跨领域的技能:解决问题的能力,创新思维,判断与决策能力,Critical-Thinking,表达沟通能力,Open Mind 等等。
  3. 学习能力:严格来说学习能力也属于跨领域的技能,但由于实在太重要,并且跨任何领域,所以独立出来。如何培养学习能力,到目前为止我所知道的最有效的办法就是持续学习和思考新知识。
  4. 性格要素:严格来说这也属于跨领域技能,理由同上。一些我相信很重要的性格要素包括:专注、持之以恒、自省(意识到自己的问题所在的能力,这是改进自身的大前提)、好奇心、自信、谦卑(自信和谦卑是不悖的,前者是相信别人能够做到的自己也能够做到,后者是不要总认为自己确信正确的就一定是正确的,Keep an open mind)等等。

前两天有个小朋友问我,lombok插件本地必须安装才可以用,那线上是怎么运行的?虽然知道lombok注解是在编译器生效,但还是一知半解,所以决定查下相关资料总结一下。

首先我们使用lombok是通过注解的方式来实现的,但是在idea并未安装插件的时候,使用自动生成的方法编译器是会报错的。这是因为lombok是使用编译时注解实现的。IDEA 的 lombok 插件不会处理你的代码,只是告诉静态代码分析工具,这个某些方法已经被注解处理程序实现了,检查时不要报错。

Java中的注解分为两类

  • 运行时注解(程序运行时通过反射得到我们注解的信息)
  • 编译时注解(程序在编译期间通过注解处理器进行处理)

而lombok需要插件的原因是因为编译器编译时通过操作AST(抽象语法树)改变字节码生成。(JAVA的语法树可以理解为java文件的dom模型)

这里谈谈一些在实际开发中遇到的几个问题。

2.3.监控告警

  1. 【强制】线上服务机器必须有基础监控报警,包含CPU、IO、内存、磁盘、coredump、端口
  2. 【强制】线上服务必须有基础的服务监控,包括接口qps、fatal数量、耗时

基础监控报警,目前可能未配置报警。服务超时、异常等报警有配置。

这里写一下最近在Code Review中遇到的一些问题。

  1. 遵循良好的日志规范。

    • 例如:日志打印logStr act=函数名 msg=信息 入参={} 出参{}
  2. 使用Objects.nonNull, Objects.isNull,CollectionUtils来判断对象是否为空,集合是否为空(增强代码可读性)

最近不记得在哪里看到这样一段话, 觉得言之有理便收藏了下来。

可以试一下这样的一个思维训练:
我现在在做的事情,换一个大佬来,能做的比我更好吗?
如果可以,那最可能是在哪方面做的比我好?
如果知道哪方面,那现在的我可以去做的更好吗?
如果想不出答案,就多和别人,和主管,和大牛同事讨论这几个问题,往往都能发现即便在开发的日常业务有也蕴含着无限的可能性。

当然这里不是我们去思考就可以解决问题,但是思考的过程很重要,会产生无限的可能性。

关于Jedis的坑

今天分享一个白衣大大在微博中说明的关于Jedis的坑

“基础架构部之jedis中坑人的maxIdle参数”,jedis用的是apache commons pools做连接池。

连接池大小由minIdle,maxIdle,maxTotal三个参数控制。头一个和末一个好理解,就是连接池的最小和最大值,而maxIdle就比较坑人了,连接用完后,如果连接池小于maxIdle,就放回连接池,大于就直接扔掉。

又有这么一个应用,把三个值分别设为2,10,40,当压力来了,10个连接不够用了,就要频繁创连接,执行完一个命令就丢掉,下一个命令再创,再丢,cps(new connection per second) 的值,等于没有在原来10条连接里处理的qps,我们称为连接风暴。

这时候redis可遭罪了,单线程又要处理命令,又要处理连接创建,两头忙两头不是人(redis 6独立的io线程可以改善么?)

所以,maxIdle应该就和maxTotal同一个值,别开放出去让人配了。

另外一开始池里也没有minIdle所指定的最少连接数,可以应用启动时做一下预热。

当时看到这个以后,由于我们的项目中也在用Jedis于是去检查了一下参数是如何设置的,maxIdle确实和maxTotal同一个值,但是配置并不规范,连接池的参数都写在了代码中,而非配置文件。

从”零”开始已经一个月了,总结一下自己在这段时间学到的东西吧。 虽然很基础,但是总要有一个慢慢积累的过程。

Java8流处理语法

这里简单介绍几个我用过的语法。

1
2
3
4
5
6
7
8
9
10
// 取出entity中的某个属性
List<String> studentNames = list.stream().map(student -> student.getName()).collect(Collectors.toList());

// 取出符合条件的实体
List<Student> students = list.stream().filter(student -> student.getAge() >= 18).collect(Collectors.toList());

// 更简洁的方式遍历集合(注意,若list为null,会抛出NPE)
list.forEach(student -> {
//do something
});

题目描述

炎热的夏日,KC 非常的不爽。他宁可忍受北极的寒冷,也不愿忍受厦门的夏天。最近,他开始研究天气的变化。他希望用研究的结果预测未来的天气。
经历千辛万苦,他收集了连续 N(1 ≤ N≤ 10^6) 的最高气温数据。
现在,他想知道最高气温一直上升的最长连续天数。

输入格式

第 1 行:一个整数 N 。1≤N≤10^6
第 2 行:N个空格隔开的整数,表示连续 N 天的最高气温。0 ≤ 最高气温 ≤10^9。

某同学写了以下的查询sql,通过每次对limit的offset进行增大,取到不同批数据做处理,比如,第一次是limit 0,100,第二次是limit100,100,现在该同学发现,随着offset的增大,sql变得越来越慢,这个时候让你进行优化,你会怎么做呢?

1
2
3
4
5
6
create table 'account'{
'id' bigint(20) not null auto_increment,
'account' varchar(100) not null,
'balance' decimal(10,0) not null,
primary key('id')
}engine=innoDB;
1
select * from account limit ?,?

  1. 未加请求头时,会返回404,故添加header。
  2. 分析网页http://muchong.com/f-430-1为第一页,http://muchong.com/f-430-2为第二页
  3. 使用utf-8对网页内容解码时,会出现乱码。查看网页源代码, charset="gbk" ,故改为gbk编码。
  4. 通过查看元素得到标题,时间的标签和class。
  5. 写入markdown文件,方便打开查看。

  1. 希腊字母
显示 公式 显示 公式
\alpha \beta
\gamma \delta
\epsilon \zeta
\eta \theta
\iota \kappa
\lambda \mu
\nu \xi
\pi \rho
\sigma \tau
\upsilon \phi
\chi \psi
\omega

尾递归

如果一个函数中所有递归形式的调用都出现在函数的末尾,我们称这个递归函数是尾递归的。当递归调用是整个函数体中最后执行的语句且它的返回值不属于表达式的一部分时,这个递归调用就是尾递归。例如:return f(n-1);return n + f(n-1) ;则不是。

以求阶乘为例,一般写法如下,如果这个函数调用的深度太深,很容易会有爆栈的危险。

区块链名词解释

  • 矿工

    给比特币网络提交的转账的请求,需要等矿工来打包处理。

  • 挖矿

    争相计算获得记账权的过程形象地比喻成“挖矿”,竞争挖矿的人或组织,叫”矿工“。

  • 算力

    可简单理解为计算能力。每秒能做多少次哈希碰撞,就是其”算力“的代表。

引言

  • 机器学习是什么?

    Tom Mitchell对于机器学习的定义:一个程序被认为能从经验 E 中学习,解决任务 T,达到性能度量值P,当且仅当,有了经验 E 后,经过 P 评判,程序在处理 T 时的性能有所提升。

  • 监督学习

    监督学习中的数据中是提前做好了分类的信息的,如垃圾邮件检测中,他的训练样本是提前存在分类的信息,也就是对垃圾邮件和非垃圾邮件的标记信息。监督学习中,他的训练样本中是同时包含有特征和标签信息的。监督学习中,比较典型的问题就是分类问题(Classfication)回归问题(Regression)。它们两者最主要的特点就是分类算法中的标签是离散的值,就像上面说的邮件分类问题中的标签为{1, -1},分别表示了垃圾邮件和非垃圾邮件,而回归算法中的标签值一般是连续的值,如预测一个人的年龄,一般要根据身高、性别、体重等标签,这是因为年龄是连续的正整数。

来自:jack.yujun - 博客园
链接:http://www.cnblogs.com/jackyuj/archive/2010/11/24/1886553.html

  • 前言:

    在新增的Concurrent包中,BlockingQueue很好的解决了多线程中,如何高效安全“传输”数据的问题。通过这些高效并且线程安全的队列类,为我们快速搭建高质量的多线程程序带来极大的便利。本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景。

一、为什么在连接数据库时要使用连接池

数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出。 一个数据库连接对象均对应一个物理数据库连接,每次操作都打开一个物理连接,使用完都关闭连接,这样造成系统的 性能低下。 数据库连接池的解决方案是在应用程序启动时建立足够的数据库连接,并讲这些连接组成一个连接池(简单说:在一个“池”里放了好多半成品的数据库联接对象),由应用程序动态地对池中的连接进行申请、使用和释放。对于多于连接池中连接数的并发请求,应该在请求队列中排队等待。并且应用程序可以根据池中连接的使用率,动态增加或减少池中的连接数。 连接池技术尽可能多地重用了消耗内存地资源,大大节省了内存,提高了服务器地服务效率,能够支持更多的客户服务。通过使用连接池,将大大提高程序运行效率,同时,我们可以通过其自身的管理机制来监视数据库连接的数量、使用情况等。

题目

地上有一个m行n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标列坐标数位之和大于k的格子。

例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?

签名(signature)

1
2
public class HashMap<K,V> extends AbstractMap<K,V>
implements Map<K,V>, Cloneable, Serializable

可以看到HashMap继承了

  • 标记接口Cloneable,用于表明HashMap对象会重写java.lang.Object#clone()方法,HashMap实现的是浅拷贝(shallow copy)。
  • 标记接口Serializable,用于表明HashMap对象可以被序列化