lc3226_使两个整数相等的位更改次数 The Infinite-LST Future w/ FP Lee (Sanctum) Solana LST java迁移golang时rand库问题
Algorithm
lc3226_使两个整数相等的位更改次数
思路:
直接遍历32位整数,如果当前位不同,则计数器+1。
当然如果 n 的位为0,而 k 的位为1,则不可能相等,直接返回-1。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
impl Solution {
pub fn min_changes ( n : i32 , k : i32 ) -> i32 {
let mut cnt = 0 ;
for i in 0 .. 32 {
if ( n & ( 1 << i )) != ( k & ( 1 << i )) {
if ( n & ( 1 << i )) == 0 {
return - 1 ;
}
cnt += 1 ;
}
}
cnt
}
}
题解 的位运算更快,因为题意知道 k 是 n 的二进制子集,有 n & k = k
否则为-1。
然后位异或得到差值,然后统计差值中1的个数。
1
2
3
4
5
6
7
8
impl Solution {
pub fn min_changes ( n : i32 , k : i32 ) -> i32 {
match n & k == k {
true => ( n ^ k ). count_ones () as i32 ,
false => - 1 ,
}
}
}
Review
The Infinite-LST Future w/ FP Lee (Sanctum)
VIDEO
怕听不懂,开了英文字幕,但是尽量不看字幕去练习的。
这里是 Sanctum 联合创始人 FP Lee 的采访。
他认为多个池争来争去没意思,还是需要一个统一平台,打通不同的质押池。
并且不想像 Lido 取出要等14天,想提供直接取出的机制。
Lee 有趣地比喻了多个LST类比稳定币 USDT,USDC,说应该要 USDT,USDC 这类稳定币一样方便,而不应该太多障碍。
主持人问了一个好问题,如果长持sol的人,为啥要用LST而不是native stake。
Lee: LST比native stake没有任何方面的缺点,只有有点,还能defi,还能很快赎回。
Router: A_Sol(A_Sol) swap to B_Sol(B_LST). 自动化了多个 Stake account withdraw and deposite 等步骤。
因为这种 Sanctum 平台化的存在,而不是成为一个寡头或者让单一池做大过多,就没有像 ETH 的 Lido 一样导致中心化的危险,而更加去中心化,让 Solana 的 PoS 机制更加安全。
LS-NFT 确实挺好,比无脑抄的图片 NFT 有价值和意义多了,burn out 就相当于典当 LS-NFT 来换取回 SOL。
这些 LS-NFT 可以跟着 sol 一起升值,利好长期持有者。
如何应对死亡螺旋,因为币圈没有熔断机制,这种一般是巨大问题才会死亡螺旋,这种应该会基金会出来处理解决。
Tips
Solana LST
Share
java迁移golang时rand库问题
java的 Random
库是线程安全的(内部有锁),而golang的 math/rand
库不是线程安全的。
如果不加锁,可能 goroutine 并发时,会随机数生成过程导致 panic。
1
2
3
4
5
6
7
8
9
10
panic: runtime error: index out of range [-2]
goroutine 53591696 [running]:
math/rand.(*rngSource).Uint64(...)
/usr/local/go/src/math/rand/rng.go:249
math/rand.(*rngSource).Int63(0x1b10188?)
/usr/local/go/src/math/rand/rng.go:234 +0x85
math/rand.(*Rand).Int63(...)
/usr/local/go/src/math/rand/rand.go:96
# ...
所以java迁移golang时,需要给 math/rand
的使用 sync.Mutex
加锁。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
package main
import (
"fmt"
"math/rand"
"sync"
"time"
)
var (
src = rand . NewSource ( time . Now (). UnixNano ())
rng = rand . New ( src )
lock sync . Mutex
)
func generateUniqueID () uint64 {
lock . Lock ()
defer lock . Unlock ()
return rng . Uint64 ()
}
func Int63 () int64 {
lock . Lock ()
defer lock . Unlock ()
return rng . Int63 ()
}
func Intn ( n int ) int {
lock . Lock ()
defer lock . Unlock ()
return rng . Intn ( n )
}
func Float64 () float64 {
lock . Lock ()
defer lock . Unlock ()
return rng . Float64 ()
}