5693. 字符串中第二大的数字
难度简单0
给你一个混合字符串 s
,请你返回 s
中 第二大 的数字,如果不存在第二大的数字,请你返回 -1
。
混合字符串 由小写英文字母和数字组成。
示例 1:
1 | 输入:s = "dfa12321afd" |
示例 2:
1 | 输入:s = "abc1111" |
提示:
1 <= s.length <= 500
s
只包含小写英文字母和(或)数字。
堆
topK问题,直接用堆
1 | class Solution { |
难度简单0
给你一个混合字符串 s
,请你返回 s
中 第二大 的数字,如果不存在第二大的数字,请你返回 -1
。
混合字符串 由小写英文字母和数字组成。
示例 1:
1 | 输入:s = "dfa12321afd" |
示例 2:
1 | 输入:s = "abc1111" |
提示:
1 <= s.length <= 500
s
只包含小写英文字母和(或)数字。topK问题,直接用堆
1 | class Solution { |
难度中等
你需要设计一个包含验证码的验证系统。每一次验证中,用户会收到一个新的验证码,这个验证码在 currentTime
时刻之后 timeToLive
秒过期。如果验证码被更新了,那么它会在 currentTime
(可能与之前的 currentTime
不同)时刻延长 timeToLive
秒。
请你实现 AuthenticationManager
类:
AuthenticationManager(int timeToLive)
构造 AuthenticationManager
并设置 timeToLive
参数。generate(string tokenId, int currentTime)
给定 tokenId
,在当前时间 currentTime
生成一个新的验证码。renew(string tokenId, int currentTime)
将给定 tokenId
且 未过期 的验证码在 currentTime
时刻更新。如果给定 tokenId
对应的验证码不存在或已过期,请你忽略该操作,不会有任何更新操作发生。countUnexpiredTokens(int currentTime)
请返回在给定 currentTime
时刻,未过期 的验证码数目。如果一个验证码在时刻 t
过期,且另一个操作恰好在时刻 t
发生(renew
或者 countUnexpiredTokens
操作),过期事件 优先于 其他操作。
示例 1:
1 | 输入: |
提示:
1 <= timeToLive <= 108
1 <= currentTime <= 108
1 <= tokenId.length <= 5
tokenId
只包含小写英文字母。generate
函数的调用都会包含独一无二的 tokenId
值。currentTime
的值 严格递增 。2000
次。1 | import java.util.HashMap; |
难度中等3
给你一个长度为 n
的整数数组 coins
,它代表你拥有的 n
个硬币。第 i
个硬币的值为 coins[i]
。如果你从这些硬币中选出一部分硬币,它们的和为 x
,那么称,你可以 构造 出 x
。
请返回从 0
开始(包括 0
),你最多能 构造 出多少个连续整数。
你可能有多个相同值的硬币。
示例 1:
1 | 输入:coins = [1,3] |
示例 2:
1 | 输入:coins = [1,1,1,4] |
示例 3:
1 | 输入:nums = [1,4,10,3,1] |
提示:
coins.length == n
1 <= n <= 4 * 10^4
1 <= coins[i] <= 4 * 10^4
1 | class Solution { |
[toc]
在JDK1.8之前使用Segment数组对桶进行分段,对每一段进行加锁
、
JDK1.8仍然采用了分段锁的思想,但实现方式更加简洁优美并且节约内存。
在JDK1.8中,使用CAS和Synchronized对要操作的部分加锁,因为是对于每个桶中的元素进行加锁,相比1.7,JDK1.8的实现降低了锁的粒度,提升了并发效率,减少了内存消耗。
synchronized思想如下代码所示,对于每个桶进行加锁:
1 |
|
1 |
|
sizeCtl > 0
时可分为两种情况:
sizeCtl
表示初始容量.sizeCtl = -1
: 表示正在初始化或者扩容阶段.
sizeCtl < -1
: sizeCtl
承担起了扩容时标识符(高16位)和参与线程数目(低16位)的存储
addCount
和helpTransfer
的方法代码中,如果需要帮助扩容,则会CAS替换为sizeCtl+1
sizeCtl-1
作者:孤酒
链接:https://juejin.cn/post/6844903763103186958
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
1 | // 一个标志是否扩容的标志位 |
1 | public ConcurrentHashMap() { |
1 | public int size() { |
1 | public V get(Object key) { |
1 | public V put(K key, V value) { |
1 | public KeySetView<K,V> keySet() { |
1 | // ConcurrentMap methods |
1 |
|
1 | /** |
1 | // 初始化table |
1 | // 正在迁移时向里面加入元素,此时先去帮助元素迁移,迁移完成后才去添加元素 |
1 |
|
1 | /** |
类似于LongAdder的加法,如果并发多的时候,直接加到每个空闲的Cell上面,最后对每一个Cell求和
1 | /* ---------------- Counter support -------------- */ |
1 | /* ---------------- Conversion from/to TreeBins -------------- */ |
1 |
|
1 |
|
1 |
|
1 | static <K,V> TreeNode<K,V> rotateRight(TreeNode<K,V> root, |
1 |
|
1 | static <K,V> TreeNode<K,V> balanceDeletion(TreeNode<K,V> root, |
HashSet的底层实现借用了HashMap的实现,也就是HashSet本身没有新建数据结构,使用HashMap和LinkedHashMap进行了一层包装,好像linkedHashMap只是使用在LinkedHashSet的时候用,其余时候还是用的HashMap.
1 | package java.util; |
1 | /** |
一个DNA序列由A/C/G/T四个字母的排列组合组成。G和C的比例(定义为GC-Ratio)是序列中G和C两个字母的总的出现次数除以总的字母数目(也就是序列长度)。在基因工程中,这个比例非常重要。因为高的GC-Ratio可能是基因的起始点。
给定一个很长的DNA序列,以及要求的最小子序列长度,研究人员经常会需要在其中找出GC-Ratio最高的子序列。
本题含有多组样例输入。
1 | 输入一个string型基因序列,和int型子串的长度 |
1 | 找出GC比例最高的子串,如果有多个输出第一个的子串 |
示例1
1 | AACTGTGCACGACCTGA |
1 | GCACG |
1 | import java.util.*; |
将给出的链表中的节点每\ k k 个一组翻转,返回翻转后的链表
如果链表中的节点数不是\ k k 的倍数,将最后剩下的节点保持原样
你不能更改节点中的值,只能更改节点本身。
要求空间复杂度 \ O(1) O(1)
例如:
给定的链表是1\to2\to3\to4\to51→2→3→4→5
对于 \ k = 2 k=2, 你应该返回 2\to 1\to 4\to 3\to 52→1→4→3→5
对于 \ k = 3 k=3, 你应该返回 3\to2 \to1 \to 4\to 53→2→1→4→5
示例1
1 | {1,2,3,4,5},2 |
1 | {2,1,4,3,5} |
1 | import java.util.*; |
难度中等271
根据 逆波兰表示法,求表达式的值。
有效的算符包括 +
、-
、*
、/
。每个运算对象可以是整数,也可以是另一个逆波兰表达式。
说明:
示例 1:
1 | 输入:tokens = ["2","1","+","3","*"] |
示例 2:
1 | 输入:tokens = ["4","13","5","/","+"] |
示例 3:
1 | 输入:tokens = ["10","6","9","3","+","-11","*","/","*","17","+","5","+"] |
提示:
1 <= tokens.length <= 104
tokens[i]
要么是一个算符("+"
、"-"
、"*"
或 "/"
),要么是一个在范围 [-200, 200]
内的整数逆波兰表达式:
逆波兰表达式是一种后缀表达式,所谓后缀就是指算符写在后面。
( 1 + 2 ) * ( 3 + 4 )
。( ( 1 2 + ) ( 3 4 + ) * )
。逆波兰表达式主要有以下两个优点:
1 2 + 3 4 + *
也可以依据次序计算出正确结果。注意出栈的第一个数字是第二个操作数,而出栈的第二个数字才是第一个操作数(栈是后进先出的)
1 | class Solution { |
难度中等29收藏分享切换为英文接收动态反馈
给你一个正整数数组 nums
,请你移除 最短 子数组(可以为 空),使得剩余元素的 和 能被 p
整除。 不允许 将整个数组都移除。
请你返回你需要移除的最短子数组的长度,如果无法满足题目要求,返回 -1
。
子数组 定义为原数组中连续的一组元素。
示例 1:
1 | 输入:nums = [3,1,4,2], p = 6 |
示例 2:
1 | 输入:nums = [6,3,5,2], p = 9 |
示例 3:
1 | 输入:nums = [1,2,3], p = 3 |
示例 4:
1 | 输入:nums = [1,2,3], p = 7 |
示例 5:
1 | 输入:nums = [1000000000,1000000000,1000000000], p = 3 |
提示:
1 <= nums.length <= 105
1 <= nums[i] <= 109
1 <= p <= 109
1 | 两数a, b 对 p 同余, 则 (a - b) % p = 0. |
1 |
|
难度中等66收藏分享切换为英文接收动态反馈
现有一个房间,墙上挂有 n
只已经打开的灯泡和 4 个按钮。在进行了 m
次未知操作后,你需要返回这 n
只灯泡可能有多少种不同的状态。
假设这 n
只灯泡被编号为 [1, 2, 3 …, n],这 4 个按钮的功能如下:
3k+1
的灯泡的状态反转(k = 0, 1, 2, …)示例 1:
1 | 输入: n = 1, m = 1. |
示例 2:
1 | 输入: n = 2, m = 1. |
示例 3:
1 | 输入: n = 3, m = 1. |
注意: n
和 m
都属于 [0, 1000].
1 | class Solution { |
tag:
缺失模块。
1、请确保node版本大于6.2
2、在博客根目录(注意不是yilia根目录)执行以下命令:
npm i hexo-generator-json-content --save
3、在根目录_config.yml里添加配置:
jsonContent: meta: false pages: false posts: title: true date: true path: true text: false raw: false content: false slug: false updated: false comments: false link: false permalink: false excerpt: false categories: false tags: true