Java: Set API
Java Set概述Set 继承自集合(Collection),该集合不能包含相同的元素。 Set 里面进行元素是否相同的判定是通过 Object 类自带的equals()实现。 Set 最多可存储一个 null 元素。 Set 只是一个抽象的接口,具体的使用还要用具体的实现,如HashSet、TreeSet等。 常用方法因为 Set 继承自集合 Collection,所以具有集合的方法。 方法 描述 int size() 返回Set里面存储的元素个数。 boolean isEmpty() 如果没有元素,返回true。 boolean add(E e) 如果Set里面没有包含元素e,就将其加入。 boolean addAll(Collection<? extends E>c) 如果指定集合中的元素不存在Set中,就将其加入Set。如果该Collection也是一个Set,相当于对这两个Set取并集。 boolean contains(Object o) 是否包含特定的元素 o。即对Set里面的任意元素e执行判定(o==null?e==n...
Leetcode 无重复字符的最长子串(String 练习 02)
题目给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。 示例1:123输入: "abcabcbb"输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。 示例2:123输入: "bbbbb"输出: 1解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。 示例3:1234输入: "pwwkew"输出: 3解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。 请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。 思路 1暴力法,用Set记录检查的无重复的最长子串。 123456789101112131415161718192021class Solution { public int lengthOfLongestSubstring(String s) { char[] chars = s.toCharArray(...
Leetcode 969.煎饼排序
题目给定数组 A,我们可以对其进行煎饼翻转:我们选择一些正整数 k <= A.length,然后反转 A 的前 k 个元素的顺序。我们要执行零次或多次煎饼翻转(按顺序一次接一次地进行)以完成对数组 A 的排序。 返回能使 A 排序的煎饼翻转操作所对应的 k 值序列。任何将数组排序且翻转次数在 10 * A.length 范围内的有效答案都将被判断为正确。 示例 1:123456789输入:[3,2,4,1]输出:[4,2,4,3]解释:我们执行 4 次煎饼翻转,k 值分别为 4,2,4,和 3。初始状态 A = [3, 2, 4, 1]第一次翻转后 (k=4): A = [1, 4, 2, 3]第二次翻转后 (k=2): A = [4, 1, 2, 3]第三次翻转后 (k=4): A = [3, 2, 1, 4]第四次翻转后 (k=3): A = [1, 2, 3, 4],此时已完成排序。 示例 2:12345输入:[1,2,3]输出:[]解释:输入已经排序,因此不需要翻转任何内容。请注意,其他可能的答案,如[3,3],也将被接受。 思路煎饼反转就是以数组中心索引位置为轴...
JVM如何回收对象
如何判断对象是否要回收?对象回收的依据——是否被有效引用?引用的可分为强引用(Strong Reference)——指向new 对象的引用、软引用(Soft Reference)——有用但没必要的引用、弱引用(Weak Reference)——没有必要的引用、虚引用(Phantom Reference)——为了在对象被回收时获得系统通知。 强引用只要存在就不回收;软引用只有在内存即将不足的情况下才回收;弱引用及虚引用随便回收。 怎么判断对象是否被有效引用? 引用计数法。如果对象的引用计数器为0,则表示该对象可以回收。但是存在互相引用无法清理的情况。 可达性分析法。通过创建一个成为“GC Root”的对象作为搜索根节点,向下搜索。如果对象到该对象之间没有引用链关联,则该对象可回收。 对象死亡的判决书再对象确定没有引用的情况下,还需要判断其finalize方法没有被覆盖或者已经被执行一次(该方法只能执行一次),满足这两个条件,GC才会回收该对象。 如果finalize方法被覆盖,则将该对象加入一个 “F-Queue”队列中,由虚拟机创建的、优先级低的Finalizer的线程...
Leetcode 638.大礼包
题目在LeetCode商店中, 有许多在售的物品。 然而,也有一些大礼包,每个大礼包以优惠的价格捆绑销售一组物品。 现给定每个物品的价格,每个大礼包包含物品的清单,以及待购物品清单。请输出确切完成待购清单的最低花费。 每个大礼包的由一个数组中的一组数据描述,最后一个数字代表大礼包的价格,其他数字分别表示内含的其他种类物品的数量。 任意大礼包可无限次购买。 示例1:1234567输入: [2,5], [[3,0,5],[1,2,10]], [3,2]输出: 14解释: 有A和B两种物品,价格分别为¥2和¥5。大礼包1,你可以以¥5的价格购买3A和0B。大礼包2, 你可以以¥10的价格购买1A和2B。你需要购买3个A和2个B, 所以你付了¥10购买了1A和2B(大礼包2),以及¥4购买2A。 示例2:1234567输入: [2,3,4], [[1,1,0,4],[2,2,1,9]], [1,2,1]输出: 11解释: A,B,C的价格分别为¥2,¥3,¥4.你可以用¥4购买1A和1B,也可以用¥9购买2A,2B和1C。你需要买1A,2B和1C,所以你付了¥4买了1A和1B(大礼包1)...
Java 运行时数据区域
定义Java虚拟机把所管理的内存划分为不同的区域,总称为运行时数据区域。 数据区域用途各不相同,有的随虚拟机启动而存在,有的随线程的生命周期存在。 根据《Java虚拟机规范(Java SE7版)》规定,Java虚拟机将数据区域划分为:程序计数器、Java虚拟机栈、本地方法栈、Java堆、方法区(运行时常量池)。 程序计数器• 线程私有,每个线程都有一个用来记录字节码执行位置。 • 一块内存区域,java虚拟机规范中唯一没有规定OutOfMemoryError的区域。 • java字节码解释器通过改变计数器的值实现分支、跳转、循环、异常处理、线程恢复等操作。 • 如果执行的是Java方法,则存储的是虚拟机字节码指令地址;如果是Native方法,则存储为空。 Java虚拟机栈• 所谓的栈内存指的就是Java虚拟机栈。 • Java方法的运行,都会生成一个栈帧,用来存储执行Java方法的局部变量、操作数栈、动态链接、方法出口等信息。 • 一个Java方法的执行到结束,对应为一个栈帧的出栈与入栈。 • 虚拟机栈可以为固定内存,也可动态扩展。如果线程请求栈深度大于虚拟机深度,则会报Sta...
Leetcode 1046.最后一块石头的重量
题目有一堆石头,每块石头的重量都是正整数。 每一回合,从中选出两块最重的石头,然后将它们一起粉碎。假设石头的重量分别为 x 和 y,且 x <= y。那么粉碎的可能结果如下: 如果 x == y,那么两块石头都会被完全粉碎;如果 x != y,那么重量为 x 的石头将会完全粉碎,而重量为 y 的石头新重量为 y-x。最后,最多只会剩下一块石头。返回此石头的重量。如果没有石头剩下,就返回 0。 提示121 <= stones.length <= 301 <= stones[i] <= 1000 思路(排序 -> 选最大及第二大做差 -> 更新数组 -> 排序)(循环 length-1 次) ->最大的为结果 代码1234567891011class Solution { public int lastStoneWeight(int[] stones) { int len = stones.length; for(int i=len-1; i>=1; i--){...
Leetcode 647.回文子串
题目给定一个字符串,你的任务是计算这个字符串中有多少个回文子串。 具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被计为是不同的子串。 示例1:123输入: "abc"输出: 3解释: 三个回文子串: "a", "b", "c". 示例2:123输入: "aaa"输出: 6说明: 6个回文子串: "a", "a", "a", "aa", "aa", "aaa". 注意:1输入的字符串长度不会超过1000。 思路 + 代码回文子串的内部一定是回文子串,因此关键在于重复利用回文子串已经统计过的数值。 可采用双指针由回文子串向两端同时检测的方法。 分为偶数回文子串与奇数回文子串。 123456789101112131415161718class Solution { private int sum = 0; public int ...
Leetcode 983.最低票价
题目在一个火车旅行很受欢迎的国度,你提前一年计划了一些火车旅行。在接下来的一年里,你要旅行的日子将以一个名为 days 的数组给出。每一项是一个从 1 到 365 的整数。 火车票有三种不同的销售方式: 一张为期一天的通行证售价为 costs[0] 美元;一张为期七天的通行证售价为 costs[1] 美元;一张为期三十天的通行证售价为 costs[2] 美元。通行证允许数天无限制的旅行。 例如,如果我们在第 2 天获得一张为期 7 天的通行证,那么我们可以连着旅行 7 天:第 2 天、第 3 天、第 4 天、第 5 天、第 6 天、第 7 天和第 8 天。 返回你想要完成在给定的列表 days 中列出的每一天的旅行所需要的最低消费。 示例1:12345678输入:days = [1,4,6,7,8,20], costs = [2,7,15]输出:11解释: 例如,这里有一种购买通行证的方法,可以让你完成你的旅行计划:在第 1 天,你花了 costs[0] = $2 买了一张为期 1 天的通行证,它将在第 1 天生效。在第 3 天,你花了 costs[1] = $7 买了一张为期 ...
Leetcode 11.盛最多水的容器
题目给定 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。 说明: 你不能倾斜容器,且 n 的值至少为 2。 思路 + 代码方法1:暴力破解法 即遍历所有情况,找到最优解。 123456789101112class Solution { public int maxArea(int[] height) { int len = height.length; int res = 0; for(int i=1; i<len; i++){ for(int j=0; j<i; j++){ res = Math.max((i-j)*Math.min(height[i], height[j]),res); } ...



