All
整数的各位积和之差—LeetCode1281
2020 年 02 月 19 日
题目描述 给你一个整数 n,请你帮忙计算并返回该整数「各位数字之积」与「各位数字之和」的差。
示例 1:
输入:n = 234 输出:15 解释: 各位数之积 = 2 * 3 * 4 = 24 各位数之和 = 2 + 3 + 4 = 9 结果 = 24 - 9 = 15 示例 2:
输入:n = 4421 输出:21 解释: 各位数之积 = 4 * 4 * 2 * 1 = 32 各位数之和 = 4 + 4 + 2 + 1 = 11 结果 = 32 - 11 = 21
提示:
1 <= n <= 10^5
猜数字-LeetCodeLCP1
2020 年 02 月 14 日
题目描述 小A 和 小B 在玩猜数字。小B 每次从 1, 2, 3 中随机选择一个,小A 每次也从 1, 2, 3 中选择一个猜。他们一共进行三次这个游戏,请返回 小A 猜对了几次?
输入的guess数组为 小A 每次的猜测,answer数组为 小B 每次的选择。guess和answer的长度都等于3。
示例 1:
输入:guess = [1,2,3], answer = [1,2,3] 输出:3 解释:小A 每次都猜对了。
示例 2:
输入:guess = [2,2,3], answer = [3,2,1] 输出:1 解释:小A 只猜对了第二次。
限制:
guess的长度 = 3 answer的长度 = 3 guess的元素取值为 {1, 2, 3} 之一。 answer的元素取值为 {1, 2, 3} 之一。
链表中的倒数第K个节点-LeetCodeM22
2020 年 02 月 08 日
题目描述 输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。例如,一个链表有6个节点,从头节点开始,它们的值依次是1、2、3、4、5、6。这个链表的倒数第3个节点是值为4的节点。
示例:
给定一个链表: 1->2->3->4->5, 和 k = 2.
返回链表 4->5.
基于Docker的MySQL主从复制环境搭建
2020 年 01 月 30 日
1. 前言 之前的程序架构可能是这样的一种形式:
当程序体量扩大后,我们进行扩展,可能会扩展多个后台服务实例,但数据库还是只有一个,所以系统的瓶颈还是在数据库上面,所以这次的主要任务就是对数据库进行扩展,主要形式为:扩展多台数据库实例,实现读写分离,对于一些写的任务分配到主数据库,对于读的任务使用子数据库进行读取。从而提高系统性能。
修改后的架构如下所示:
好用的一些软件
2020 年 01 月 29 日
Mybatis是如何防止SQL注入的,不用Mybatis如何实现SQL注入
2020 年 01 月 06 日
Mybatis这个框架在日常开发中用的很多,比如面试中经常有一个问题:$和#的区别,它们的区别是使用#可以防止SQL注入,今天就来看一下它是如何实现SQL注入的。
什么是SQL注入 在讨论怎么实现之前,首先了解一下什么是SQL注入,我们有一个简单的查询操作:根据id查询一个用户信息。它的sql语句应该是这样:select * from user where id = 。我们根据传入条件填入id进行查询。
如果正常操作,传入一个正常的id,比如说2,那么这条语句变成select * from user where id =2。这条语句是可以正常运行并且符合我们预期的。
但是如果传入的参数变成 '' or 1=1,这时这条语句变成select * from user where id = '' or 1=1。让我们想一下这条语句的执行结果会是怎么?它会将我们用户表中所有的数据查询出来,显然这是一个大的错误。这就是SQL注入。
Java位运算符详解
2019 年 12 月 24 日
前言 之前了解过位运算符,左移<<等于乘以2,右移>>等于除以2。但是我在看jdk源码的时候发现了一个>>>三个符号的,不明白这是什么意思,就去搜了一下,发现还挺多的知识点的,就整理了一下。
首先我们知道,我们编写的程序最终都是在计算机底层进行的,计算机底层也仅支持0、1两种符号。所以当时网上有个键盘只有0、1两个键,那才是大佬用的键盘。扯远了。。。
先来复习一下java的基本类型都占多少字节,占多少位(1字节等于8位):
类型 字节数 位数 大小范围 byte 1 8 -2^8^~2^8^-1 short 2 16 -2^16^~2^16^-1 int 4 32 -2^32^~2^32^-1 long 8 64 -2^64^~2^64^-1 float 4 double 8 char 2 16 一个char类型可以存储一个汉字 boolean 1 true or false 移位操作是把数据看作二进制数,然后将其向左或向右移动若干位的运算。在Java中,移位操作符包含三种:<<左移运算符,>>带符号右移运算符,>>>无符号右移运算符。这三种操作符都只能作用于long,int,short,byte这四种基本整形类型上和char类型上。其他类型如double都无法使用位运算符,大家可以在ide中自行试验一下。
在java中,第一位用来表示数字的正负,第一位为零时表示正数,第一位为1时表示负数。我们拿最简单的8位byte类型举例:0000 0000表示0,0111 1111这个表示最大值(2^8^-1),再进行加一后就变成了1000 0000这时就变成了最小值(-2^8^)。再加一后变成1000 0001这时的值为-127。也就是从0到最大值然后转为最小值,然后再从最小值向零靠近。
手写红黑树的简单实现
2019 年 12 月 24 日
基于《算法》一书的红黑树的插入和删除。看过不同的教材,也有不同的实现方式,但是最终的结果也大致相同,感觉这个比较容易理解,就采用这种的方式来进行简单实现。
定义树节点的实体类型 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 private static final boolean RED = true; private static final boolean BLACK = false; /** * 红黑树的节点结构 * 保存的值,左节点,右节点以及颜色(true为红色,false为黑色) * 默认添加一个红节点 * * @param <E> */ static final class RedBlackTreeNode<E extends Comparable<E>> { E val; RedBlackTreeNode<E> left; RedBlackTreeNode<E> right; boolean color = RED; RedBlackTreeNode(E val) { this.val = val; } } 这里简单的定义了一下红黑树,并且只有节点,并不是map这样的k-v结构。如果定义k-v结构到时比较的时候比较k即可。
用了泛型,并且要支持比较(继承自Comparable),不然无法比较大小进行插入。
然后定义了一个值,左节点和右节点,然后颜色默认为红色。
再增加一个构造函数即可
Java古老的集合类之Vector
2019 年 12 月 23 日
今天继续来看一下Java中古老的集合类-Vector
变量 1 2 3 4 5 6 //容器存储实体的底层数据结构,Vector也是使用数组来进行存储的 protected Object[] elementData; //实体的数量 protected int elementCount; //每次扩容时增加的长度,当为0是扩容原数组长度的两倍 protected int capacityIncrement; 从上面的变量可以得知,Vector也是使用数组来进行底层的数据存储,并且还设置了扩容容量。
Java关键字-transient
2019 年 12 月 22 日
最近在看源码的时候看到一个关键字transient,之前对这个字没有印象,所以就去看了一下它的作用。
transient的作用 首先放上来着维基百科的解释:
Java 提供自动序列化,需要以java.io.Serializable接口的实例来标明对象。实现接口将类别标明为“可序列化”,然后Java在内部处理序列化。在Serializable接口上并没有预先定义序列化的方法,但可序列化类别可任意定义某些特定名称和签署的方法,如果这些方法有定义了,可被调用运行序列化/反序列化部分过程。该语言允许开发人员以另一个Externalizable接口,更彻底地实现并覆盖序列化过程,这个接口包括了保存和恢复对象状态的两种特殊方法。
在默认情况下有三个主要原因使对象无法被序列化。其一,在序列化状态下并不是所有的对象都能获取到有用的语义。例如,Thread对象绑定到当前Java虚拟机的状态,对Thread对象状态的反序列化环境来说,没有意义。其二,对象的序列化状态构成其类别兼容性缔结(compatibility contract)的某一部分。在维护可序列化类别之间的兼容性时,需要额外的精力和考量。所以,使类别可序列化需要慎重的设计决策而非默认情况。其三,序列化允许访问类别的永久私有成员,包含敏感信息(例如,密码)的类别不应该是可序列化的,也不能外部化。上述三种情形,必须实现Serializable接口来访问Java内部的序列化机制。标准的编码方法将字段简单转换为字节流。
原生类型以及永久和非静态的对象引用,会被编码到字节流之中。序列化对象引用的每个对象,若其中未标明为transient的字段,也必须被序列化;如果整个过程中,引用到的任何永久对象不能序列化,则这个过程会失败。开发人员可将对象标记为暂时的,或针对对象重新定义的序列化,来影响序列化的处理过程,以截断引用图的某些部分而不序列化。Java并不使用构造函数来序列化对象。
从上面的最后一段可以了解,如果没有添加transient关键字,则会被进行序列化。也就是说添加了这个关键字后就不会被序列化。
接下来我们将用一个例子来测试一下