All
用队列实现栈-LeetCode225
2019 年 11 月 24 日
题目描述 使用队列实现栈的下列操作: push(x) – 元素 x 入栈 pop() – 移除栈顶元素 top() – 获取栈顶元素 empty() – 返回栈是否为空 注意:
你只能使用队列的基本操作– 也就是 push to back, peek/pop from front, size, 和 is empty 这些操作是合法的。 你所使用的语言也许不支持队列。 你可以使用 list 或者 deque(双端队列)来模拟一个队列 , 只要是标准的队列操作即可。 你可以假设所有操作都是有效的(例如, 对一个空的栈不会调用 pop 或者 top 操作)。
解题思路 使用两个队列
将元素添加到第一个队列中。
在获取元素时,将第一个队列中除了最后一个元素都添加到第二个队列中,剩下的这个就是要返回的元素。
将两个队列进行交换,这样在添加元素时都能放到第一个队列中。
使用一个变量来存储最后一个元素,这样在调用 top 方法时直接返回这个变量即可。
使用一个队列
添加元素时添加到队列中,然后将队列中的元素除了最后一个再重新放入一遍
在获取元素和查看元素时都拿第一个即可
用栈实现队列-LeetCode232
2019 年 11 月 24 日
题目描述 使用栈实现队列的下列操作:
push(x) – 将一个元素放入队列的尾部。 pop() – 从队列首部移除元素。 peek() – 返回队列首部的元素。 empty() – 返回队列是否为空。 示例:
MyQueue queue = new MyQueue();
queue.push(1); queue.push(2);
queue.peek(); // 返回 1 queue.pop(); // 返回 1 queue.empty(); // 返回 false 说明:
你只能使用标准的栈操作 – 也就是只有 push to top, peek/pop from top, size, 和 is empty 操作是合法的。 你所使用的语言也许不支持栈。你可以使用 list 或者 deque(双端队列)来模拟一个栈,只要是标准的栈操作即可。 假设所有操作都是有效的 (例如,一个空的队列不会调用 pop 或者 peek 操作)
解题思路 栈(先进后出)来实现队列(先进先出)。
可以用两个栈来实现,第一个栈存储,当进行 peek 或 pop 操作时,将第一个栈内元素按照先进后出的原则拿出来放到第二个栈里面。这时第二个栈里面在取就是我们总的第一个元素。
两两交换链表中的节点—LeetCode24
2019 年 11 月 21 日
题目描述 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
示例:
给定 1->2->3->4, 你应该返回 2->1->4->3. 可以看出,链表每两个一组交换了前后位置,然后再跟其他元素按照原有顺序连接。
StringBuilder为什么线程不安全?
2019 年 11 月 17 日
在脉脉上看到一篇文章,StringBulider 为什么线程不安全,然后想了一下,确实不知道。
之前问string 相关问题,只了解了 string 不可变,stringbuffer 线程安全,stringbuilder 线程不安全。但却没有搞清楚为什么是不安全的,今天就去看了一下 stringbuilder 的源码,来了解一下原因。
首先来测试一下多线程下的不安全问题:
1 2 3 4 5 6 7 8 9 10 public static void main(String[] args) { StringBuilder stringBuilder = new StringBuilder(); for (int i = 0; i < 100000; i++) { new Thread(() -> stringBuilder.append("a")).start(); } System.out.println(stringBuilder.length()); } 这个方法最终的理想结果应该是 100000,但是当我们多运行几次,发现他的结果出错了!结果变成了99999或者更小的数值。有时候甚至还抛出了数组越界异常(概率极小)。
整数反转—LeetCode7
2019 年 11 月 15 日
题目描述 给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
示例 1:
输入: 123 输出: 321 示例 2:
输入: -123 输出: -321 示例 3:
输入: 120 输出: 21 注意:
假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231, 231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。
题目中给出了条件,我们只能存储32位有符号整数,如果溢出后则返回0,避免出现溢出错误
TreeMap源码学习
2019 年 11 月 12 日
之前看过了HashMap,LinkedHashMap的源码,这次来看一下TreeMap的源码。
从这个名字就能看出,TreeMap底层使用的是树来进行存储的。
变量 1 2 3 4 5 6 7 8 9 //比较器,用于左右子树的判断。 //正常情况下,左子树为 1,父节点为 2,右子树为 3。如果比较器设置 3<1<2。则左子树为3,父节点为 1,右子树为 2。 private final Comparator<? super K> comparator; //根节点 private transient Entry<K,V> root; //容量 private transient int size = 0; //修改的次数,在迭代和序列化时用到 private transient int modCount = 0; 看一下 root 节点的数据结构:
1 2 3 4 5 6 7 8 9 10 static final class Entry<K,V> implements Map.Entry<K,V> { K key; V value; Entry<K,V> left; Entry<K,V> right; Entry<K,V> parent; boolean color = BLACK; ... } 由于有一个color=BLACK属性,所以底层数据结构应该是红黑树
回文数—LeetCode9
2019 年 11 月 07 日
题目描述 判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
示例 1:
输入: 121 输出: true 示例 2:
输入: -121 输出: false 解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。 示例 3:
输入: 10 输出: false 解释: 从右向左读, 为 01 。因此它不是一个回文数。 进阶:
你能不将整数转为字符串来解决这个问题吗?
从示例2中可以看出,负数不是回文数,可以先对此进行判断。
而提示中有一个提示,能否不使用字符串来解决这个问题,那么使用字符串肯定是可以解决这个问题的。
翻转二叉树—LeetCode226
2019 年 11 月 01 日
二叉搜索树的范围和-LeetCode938
2019 年 10 月 31 日
题目描述 给定二叉搜索树的根结点 root,返回 L 和 R(含)之间的所有结点的值的和。
二叉搜索树保证具有唯一的值。
示例 1:
输入:root = [10,5,15,3,7,null,18], L = 7, R = 15 输出:32 示例 2:
输入:root = [10,5,15,3,7,13,18,1,null,6], L = 6, R = 10 输出:23
提示:
树中的结点数量最多为 10000 个。 最终的答案保证小于 2^31。
三数之和—LeetCode15
2019 年 10 月 25 日
题目描述 给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?
请你找出所有满足条件且不重复的三元组。
注意:答案中不可以包含重复的三元组。
示例:
给定数组 nums = [-1, 0, 1, 2, -1, -4],
满足要求的三元组集合为: [ [-1, 0, 1], [-1, -1, 2] ]
这个题目中有一个条件,答案中不可以包含重复的三元组,即给定的数组中会有重复值,所以答案可能会存在重复答案,当答案存在时,不在添加到答案中