- 博客(76)
- 资源 (6)
- 收藏
- 关注
原创 可以用作栈和队列的模型
整数可以用作简单的栈来使用,整数0,入栈加1,出栈减1。这种方式只能用作使用栈进行简单判断的地方,不适用于使用栈来存放数据。 比如判断括号是否匹配正确,(()()),这样的就是正确的,())( )),这样的就是不正确的,且只能判断一种括号的。 因为只是为了判断括号是否正确,所以用栈来做,但同时由于没有数据需要存放,使用真正的栈就会浪费空间。所以使用整数来充当一个栈。这个栈只要入栈、出栈和栈内元
2017-07-12 16:53:09 167
原创 leetcode 3-最长无重复字符的子字符串
子字符串 substring 是连续的 处理数组、字符串的问题,通常滑动窗口都是一个值得去考虑的方案。 Given “abcabcbb”, the answer is “abc”, which the length is 3.以这个为例,用一个map存放字符和索引值,然后就可以用O(1)的时间去判断一个字符是否出现过,如果没有出现过,最大长度加1。如果出现了,并且如果这个字符出现在当前窗口的起始
2017-07-11 13:39:20 764
原创 解题常用工具
A sliding window is an abstract concept commonly used in array/string problems. A window is a range of elements in the array/string which usually defined by the start and end indices, i.e. [i, j) (left
2017-07-11 13:16:27 194
原创 java 回调机制
从字面上理解就是,我调用你的方法,你反过来又调用我的方法,就是你来我往。而你反过来又调用我的方法通常称之为回调函数,放在一个专门的接口里面,需要回调机制的类就需要实现这个接口,而且在我调用你的方法的时候,需要把我或者我的某个实例再传递给你,你再通过这个实例调用我的回调函数。interface CallBack { void callback();}class Me implements C
2017-07-07 13:39:56 67
原创 Markdown编辑器
欢迎使用Markdown编辑器写博客本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦:Markdown和扩展Markdown简洁的语法代码块高亮图片链接和图片上传LaTex数学公式UML序列图和流程图离线写博客导入导出Markdown文件丰富的快捷键快捷键加粗 Ctrl + B 斜体 Ctrl + I 引用 Ctrl
2017-07-07 13:25:10 51
转载 Runtime & Properties 类
Properties类继承自HashTable,其key和value都是字符串。import java.util.Properties;public class Test_Systeminfo { public static void main(String[] args) { /*Properties p = System.getProperties(); p.
2017-06-21 10:31:30 254
转载 生成随机数的类Random和ThreadLocalRandom
java里有伪随机型和安全型两种随机数生成器,伪随机生成器根据特定公式将seed转换成新的伪随机数据的一部分,安全随机生成器在底层依赖到操作系统提供的随机事件来生成数据。安全随机生成器需要生成加密性强的随机数据的时候才用它生成速度慢如果需要生成大量的随机数据,可能会产生阻塞需要等待外部中断事件而伪随机生成器,只依赖于“seed”的初始值,如果给生成算法提供相同的seed,可以得到一样的伪随机
2017-06-21 10:04:18 9617 1
原创 leetcode-51/52-N皇后问题
使用回溯法的经典例子。 使用数组a存储皇后所在的位置,第0个皇后在的位置放在a[0],比如a[0]等于0,表示第0个皇后在第0行的第0列;a[1]=2,表示第1个皇后在第1行的第2列。数组的下标表示第几个皇后在第几行,数组值表示在第几列。首先要写一个用于判断皇后是否冲突的函数,这表示当往数组中写入一个皇后的位置时,要判断这个皇后是否和之前已经放好的皇后是否冲突,即要写入的值不等于之前任何一个数组的
2017-06-08 23:08:35 274
原创 T9-智能拼音
牛客网 HDU 1298 T9 字典树用于存储字典中各单词以及权值(可能性),每个节点只存储字符和权值,这是最简单的一种情况。而实际上还可以存储是否为单词结尾,有多少单词用作前缀等。 输入: hell 3 hello 4 idea 8 next 8 super 3 相同的前缀其权值相加,根据这个输入建立的字典树为: 对于按键盘上43556这几个数字,首先4对应ghi,hi都在字
2017-05-16 17:29:07 640
原创 leetcode-21-合并两个排好序的链表
public ListNode mergeTwoLists(ListNode l1, ListNode l2) { if (l1 == null) return l2; if (l2 == null) return l1; ListNode head = new ListNode(Math.min(l1.val, l2.val)); i
2017-05-15 22:14:26 265
原创 leetcode-20-合法的括号
public boolean isValid(String s) { if (s == null || s.length() == 0 || (s.length() & 1) == 1) return false; LinkedList<Character> list = new LinkedList<>(); char c = s.charAt(0)
2017-05-15 21:59:50 741
原创 leetcode-14-求字符串数组最长公共前缀
String的compareTo方法是按照字典顺序比较的。而Arrays.sort方法对对象数组按照自然顺序进行排序。 public static void sort(Object[] a) 该方法要求数组元素实现了Comparable接口,所以如果是对字符串数组进行排序,是按照字典顺序进行排序的。public String longestCommonPrefix(String[] strs) {
2017-05-15 21:16:27 1619
原创 leetcode-13-罗马数字转阿拉伯数字
M = 1000 D = 500 C = 100 L = 50 X = 10 V = 5 I = 1把数额较低的数字排在后面时,所表示的数字即其总和 把数额较低的数字排在前面时,所表示的数字为后者减去前者之值 数字顺序自左向右读。public int romanToInt(String s) { int res = getVal(s.charAt(0));
2017-05-15 20:01:11 292
原创 leetcode-28-匹配字符串位置(KMP)
首先是暴力算法,竟然也能AC,看来示例都不怎么长啊。public int strStr(String haystack, String needle) { for (int i = 0; i <= haystack.length() - needle.length(); i++) { int j; for (j = 0; j < nee
2017-05-14 21:07:21 268
原创 leetcode-10-正则表达式
abc .*abc 考虑这种情况,是匹配的。即带*号的可以理解是为备用情况,只有当不使用.*时后面无法匹配才使用.*,比如这种情况abc .*bc。
2017-05-14 16:42:34 407
原创 Linux
在终端进入root 在终端输入sudo -s,然后输入当前用户的密码,注意这时输入的密码不会显示在终端。注意所有输入的密码都不会显示在终端,而且也不会出现点或者星号。创建新用户 首先进入root,然后使用adduser 用户名 命令,之后根据提示操作即可。不同用户之间切换的命令,比如从root切换到wangsong,使用exit。切换到root使用sudo -s2. curl -
2017-05-09 09:10:11 194
原创 剑指offer
16 反转链表//递归方式Node * reverseList(List head){ //如果链表为空或者链表中只有一个元素 if(head == NULL || head->next == NULL) { return head; } else { //先反转后面的链表,走到链表的末端结点 Nod
2017-05-08 09:24:30 83
原创 系列:1到1000中包含8的个数
排列组合问题分析: 不包含8的数的每一位都不是8,1到999是三位数,每位都不是8,只能由0到7和9构成,所以不包含8的数字的个数为9^3个。那么包含8的数字的个数为1000-9^3 = 271 编程验证: int x = 0; for (int i = 1; i <= 1000; i++) { if (String.valueOf(i).contains("8")
2017-05-07 22:10:30 9494 1
原创 leetcode 62-所有可行的路径数
放在高中来做,是一道简单的排列组合的问题。 横着需要走n-1步,竖着需要走m-1步。一共需要走m+n-2步,结果就是或者。 就是m+n-2步中找出m-1来竖着走,剩下的横着走。 这里涉及到计算阶乘,12的阶乘约4亿多,13的阶乘约62亿多,题目m和n最大是100,所以这里计算阶乘需要使用大数类。代码:public int uniquePaths(int m, int n) {
2017-05-07 18:48:29 584
原创 leetcode 5-最长回文子字符串
题目: 给定一字符串,找出里面的最长的回文子字符串,结果不唯一。首先暴力法不说了,时间复杂度为O(n^3),因为遍历每个子字符串需要两层循环,在内层循环中判断是否为回文串又是一层循环。1 . 动态规划时间复杂度是O(n^2)思路:由小的子串逐渐扩展为大的子串,实际上和中心扩展法一样,只不过这里使用了table来保存每个子串是否为回文串。但是和中心扩展法不同的是,DP思想会判断所有的子串,而中心扩展是
2017-05-07 14:58:57 348
原创 leetcode 111-二叉树最小深度
最小深度定义为根节点到最近叶子节点的深度分析: 空树,最小深度为0 左右子树都为空,最小深度为1 左右子树不都为空,左右子树中有空树的情况,最小深度一定是在非空树中产生,因为最小深度定义为到最近叶子节点的深度。一旦左右子树有空的情况,这边的深度就可以置为正无穷,表示最小深度不可能再这里产生。然后分别计算左右子树的最小深度,使用递归策略。代码:public int minDepth(TreeNo
2017-05-06 12:57:49 2351
原创 leetcode 110-判断一棵树是否为平衡二叉树
平衡二叉树的定义: 空树或者左右子树的高度差不超过1且左右子树也是平衡二叉树。需要用到计算深度的方法:public int depth(TreeNode root) { if (root == null) return 0; int left = depth(root.left); //计算左子树的深度 int right = depth(root.right); //计算
2017-05-06 12:23:46 1792
原创 关于方法中的参数是引用的情况
在刷leetcode中一道关于使用增序排列的数组构建一颗平衡二叉树的时候,犯了一个致命的错误,那就是对方法的参数这个局部变量理解不透彻导致的。java中只有按值传递,没有按引用传递。 举个例子就是,a是指向A类的某个实例对象的引用,f方法需要一个A类的实例作为参数,把a作为参数传递到f方法中 A a = new A(); f方法的定义:void f(A a) 注意这里f方法的参数是a,这个a
2017-05-06 11:38:56 332
转载 海量数据常用技巧之位图法
介绍 位图的基本概念是用一个位(bit)来标记某个数据的存放状态,一个bit只能表示两种状态,所以不适合用来表示多状态(缺点1)。如果要表示多状态,需要用多个bit,但此时位图的性能会大打折扣,复杂度却增加了。由于采用了位为单位来存放数据,所以节省了大量的空间。一般把这种方法称为位图法,即Bitmap。 BitSet 正因为位图运算在空间方面(指的是海量数据的存储)的优越性,很多语言都有直接对
2017-05-03 12:03:21 1658
原创 建造者模式
本质是流程不变,而每个流程实现的具体细节则是经常变化的。好处就是保证了流程不会变化,流程既不会增加,也不会遗漏或者流程次序错误,这是非常重要的。建造者模式是将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创造不同的表示。建造者模式通常包括下面几个角色: 1 Builder 给出一个抽象接口,以规范产品对象的各个组成成分的构建。这个接口规定要实现复杂对象的哪些部分的创建,并不涉及具体的对
2017-04-27 22:42:04 53
原创 使用匿名内部类初始化集合类
List<String> list = new ArrayList<String>(){ { add("a"); } };这种写法,是使用匿名内部类,继承自ArrayList,同时菱形运算符里的String不能省略,否则Eclipse会提示错误'<>' cannot be used with anonym
2017-04-25 22:54:37 2745
原创 java API中常用方法
java.util.Objects类 since 1.7public static <T> T requireNonNull(T obj) //此方法设计用来在方法或构造方法中验证参数引用是否为空,为空,抛出NullPointerException,不为空,返回参数objpublic static boolean isNull(Object obj)//since 1.8//obj为
2017-04-25 11:46:03 2920
原创 leetcode 40-Combination Sum II
public List<List<Integer>> combinationSum2(int[] candidates, int target) { List<List<Integer>> list = new ArrayList<>(); List<Integer> temp = new ArrayList<>(); Arrays.sort(cand
2017-04-24 12:20:54 92
原创 leetcode 39-Combination Sum
和40题非常相似 自己写的代码 非常耗时间 (版本一)public List<List<Integer>> combinationSum(int[] candidates, int target) { List<List<Integer>> list = new ArrayList<>(); List<Integer> temp = new ArrayList<>(
2017-04-23 19:03:36 176
原创 leetcode 78-Subsets
使用回溯思想,以[1,2,3]为例,深搜 + 剪枝 进入第一层,[1],符合(剪枝的结果是符合),加入结果集;进入第二层,2,[1,2],符合(剪枝的结果是符合),加入结果集;进入第三层,3,[1,2,3],符合(剪枝的结果是符合),加入结果集;回溯到第二层,但没有进入第三层的路径了。 所以回溯到第一层,进入第二层,3,[1,3],符合(剪枝的结果是符合),加入结果集;同理也没有路径了。 所以
2017-04-23 14:47:54 184
原创 leetcode 17-Letter Combinations of a Phone Number
1. 使用队列例如输入23,需要输出ad,ae,af,bd,be,bf,cd,ce,cf 首先根据第一个数字2,将它对应的字母加入队列,如下图所示根据第二个数字3,将它对应的字母依次和队列中现有的元素组合,并加入新的队列。取出a,将3对应的d、e、f依次和a组合,并加入队列,同理b和c做同样操作。如下图所示java代码如下 public List<String> letterCombination
2017-04-23 12:54:25 386
原创 leetcode 36(后续继续更新)
考虑时间复杂度,牺牲空间换取时间,只需要遍历二维数组一遍,同时完成行、列和小九宫格的判断。使用Set结合,难点在于每个小九宫格坐标如何进行计算。九宫格坐标如下图所示分析坐标,可知行号每3个 i 就会对应加3,每3个j对应加1。列号是每3个i就会重复,每3个j就会重复。 所以 行号 计算 (i / 3) * 3 + j / 3 列号计算 (i % 3)* 3 + j % 3
2017-04-22 22:15:32 265
原创 程序算法零碎
(1)判断一个int整型是奇数还是偶数 ① 采用和1进行与操作 (a & 1) == 0 为0 是偶数,为1是奇数,注意一定要带括号,因为 == 的优先级高于 & ② 采用取余操作 a % 2 == 0 为0 是偶数, 为1是奇数,不用带括号,因为 % 的优先级高于 == 注意不要和1进行比较(a % 2 == 1)因为当a是负整数时结果为0或者-1,出现错误
2017-04-20 22:44:52 192
转载 5个人站队,每个人不在原位置有多少种站法
首先我们把人数推广到 n个人,即n个人排成一列,重新站队时,各人都不站在原来的位置上。设满足这样的站队方式有an种,现在我们来通过合理分步,恰当分类找出递推关系: 第一步:第一个人不站在原来的第一个位置,有n-1种站法。 第二步:假设第一个人站在第2个位置,则第二个人的站法又可以分为两类:第一类,第二个人恰好站在第一个位置,则余下的n-2个人有an-2种站队方式;第二类,第二个人不站在第一个位置,则
2017-04-20 22:29:48 7075
原创 leetcode 30
leetcode 30题意:给定一个字符串s和一个字符串数组words,找出s中所有以words中全部元素拼接成的字符串作为子串的起始索引并返回。
2017-04-19 22:07:47 749 1
《Python编程入门(第3版based Python3.x).pdf
2017-05-05
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人