手撕代碼題:
其他
數(shù)據(jù)結(jié)構(gòu)與算法中有那些奇技淫巧
位運(yùn)算裝逼指南 ---- 帶你領(lǐng)略位運(yùn)算的魅力單項(xiàng)列表實(shí)現(xiàn)加法運(yùn)算
舉例:list1:1->2->3; list2: 4->5->6->7;返回list:4->6->9->0
思路:用2個(gè)棧存儲(chǔ)兩個(gè)list,然后一起彈出衡便,并記錄進(jìn)位湿刽,然后把每一次計(jì)算的結(jié)果拼接成list返回即可
代碼:后續(xù)補(bǔ)充焦履。苗桂。蜡歹。夺艰。求一個(gè)整數(shù)二進(jìn)制表示中1的個(gè)數(shù)
最笨的方式是逐位取值黄痪,判斷是否為1;復(fù)雜度是O(n)
快速的方式是只找1的位置见秽,n&(n+1)是找到最右邊的1愉烙,然后n-n&(n+1)是舍棄最右邊的1,當(dāng)n變成0解取,即所有的1都找到了
代碼:
int n = 0b10001010010100;
int count = 0;
while(n != 0){
count++;
n -= n&(~n + 1);
}
System.out.println(count);
- Bit-map
海量數(shù)據(jù)下 BitMap 理解及應(yīng)用場(chǎng)景
如何只用2GB內(nèi)存從20億步责,40億,80億個(gè)整數(shù)中找到出 - 打家劫舍
- 找到數(shù)組中出現(xiàn)次數(shù)大于N/k的數(shù)
線程安全&不安全
volatile禀苦、AtomicInteger蔓肯、LongAdder、synchronize
· volatile解決多線程內(nèi)存不可見問題振乏。對(duì)于一寫多讀蔗包,是可以解決變量同步問題,但是如果多寫慧邮,同樣無(wú)法解決線程安全問題调限。如果是count++操作,使用如下類實(shí)現(xiàn):AtomicInteger count = new AtomicInteger(); count.addAndGet(1); 如果是JDK8误澳,推薦使用LongAdder對(duì)象旧噪,比AtomicLong性能更好(減少樂觀鎖的重試次數(shù))。
CAS是一個(gè)原子性操作理解線程安全與不安全
https://www.cnblogs.com/kubidemanong/p/9505944.html對(duì)象實(shí)例
對(duì)象實(shí)例由對(duì)象頭、實(shí)例數(shù)據(jù)組成,其中對(duì)象頭包括markword和類型指針崖咨,如果是數(shù)組队萤,還包括數(shù)組長(zhǎng)度;
Mark word
Mark word與鎖的關(guān)系鎖
鎖膨脹:
偏向鎖->輕量級(jí)鎖(自旋鎖、自適應(yīng)自旋鎖勾扭,也叫作非阻塞同步毡琉、樂觀鎖)->重量級(jí)鎖(又被叫做互斥鎖MutexLock、阻塞同步妙色、悲觀鎖)