数据结构与算法--这个需求很简单怎么实现我不管(发散思维)
發(fā)散思維
-
程序員是一個(gè)高危職業(yè),最近動(dòng)不動(dòng)就聽(tīng)到誰(shuí)誰(shuí)誰(shuí)猝死,誰(shuí)誰(shuí)誰(shuí)過(guò)勞暈倒,所以面對(duì)奇葩問(wèn)題,我們要淡定,
-
開(kāi)發(fā)中被產(chǎn)品虐,說(shuō)的最多的一句話就是這個(gè)需求很簡(jiǎn)單,怎么實(shí)現(xiàn)我不管
-
找工作被面試官虐,你不能用這個(gè),不能用哪個(gè),還得給我答案
-
最近碰到了這種奇葩的題目:
-
第一眼看這種問(wèn)題,心里一萬(wàn)頭草泥馬鵬騰而過(guò),陷入沉默中,我表示很慌
- 這種問(wèn)題一看就不按常理出牌,不能用常規(guī)思路去應(yīng)對(duì),要不然會(huì)被氣死,這也是發(fā)散思維的重要吧(我覺(jué)得就是腦筋急轉(zhuǎn)彎),也許是為了考察你心態(tài),不能輕言放棄
- 我們還是來(lái)分析一下這個(gè)問(wèn)題吧:
- 四則運(yùn)算不能用,那還能用啥,能想到的只有位運(yùn)算了吧,總不可能取余,取模運(yùn)算能搞定加法吧
- 二進(jìn)制只有 與, 或,非,異或,沒(méi)思路,還是從十進(jìn)制開(kāi)始分析吧
- 例如24 + 19 =43,加法,各個(gè)位數(shù)相加,得到對(duì)應(yīng)的位數(shù)的值,有進(jìn)位則將進(jìn)位添加到高位去
- 總的來(lái)說(shuō)就兩步:
- 第一步做加法 得到 33
- 第二步做進(jìn)位9+4 有進(jìn)位 10, 所以33 + 10 = 43
- 同理是否可以運(yùn)用到二進(jìn)制中呢,我們用二進(jìn)制也做如下分析:
- 如上圖,如果我們用這種方式 標(biāo)識(shí):
- 24 : 0001 1000 , 19: 0001 0011, 相加后得到 0010 1011 與結(jié)果相符,因?yàn)槎M(jìn)制中并沒(méi)有這么相加的
- 但是二模擬加法的話并沒(méi)有一個(gè)操作符完成,那么還按以上步驟進(jìn)行:
- 先做加法,在做進(jìn)位,加法怎么實(shí)現(xiàn), 二進(jìn)制中 0+1 = 1 ,1+0 =1 ,0+0=0, 1+1 =0, 和異或居然是一樣的,那么我們可以通過(guò) num1 ^ num2 得到相加的結(jié)果
-
因?yàn)橹挥卸际? 的位數(shù)才有進(jìn)位,并且在高位相加,找到都是1 的位,我們?cè)谥暗奈贿\(yùn)算文中提到過(guò),用與操作,剩下的就都是1 的位數(shù) 1 ^ 1 = 1, 在左移就將1 移動(dòng)到高位,num1 & num2 << 1
-
那么我們只要將這兩個(gè)在相加 (num1 ^ num2) + (num1 & num2 << 1),就得到最終結(jié)果
-
那么加法又回到了第一個(gè)步驟
-
經(jīng)過(guò)如上分析,很顯然是一個(gè)遞歸或者循環(huán) 位運(yùn)算的問(wèn)題,那么就能通過(guò)位運(yùn)算得到 加法的解法了
-
遇到這種問(wèn)題還是要穩(wěn)住,不要慌,那么我們有如下實(shí)現(xiàn):
發(fā)散思維二
-
求1+2+3+…+n要求不能用乘法,除法,for,while,if,else,switch,case,以及調(diào)節(jié)判斷語(yǔ)句;
-
臥槽不就是不能寫所有邏輯還要求解嗎,能用的邏輯操作都給你禁了還要求和。一般我們求等差數(shù)列,一般都是用公式(n+1)*n/2,或者循環(huán),或者遞歸,但是封死了if, for, while,遞歸循環(huán)都不行了,你遞歸總得有終止條件吧
-
這是何等的臥槽,那么還是有辦法的,不讓用循環(huán),那就只能寫n次加法了,還不能用邏輯操作,那么就必須定義實(shí)例就執(zhí)行邏輯,就是構(gòu)造方法了
-
通過(guò)構(gòu)造方法執(zhí)行邏輯,然后構(gòu)造n次,得到結(jié)果
- 這個(gè)犯法太蠢了,蠢哭了,上面通過(guò)不斷定義新對(duì)象來(lái)調(diào)用構(gòu)造方法來(lái)實(shí)現(xiàn)累加,下面來(lái)一個(gè)遞歸的惡心寫法
-
利用枚舉中的抽象方法,每個(gè)抽象方法都調(diào)用下個(gè)層級(jí)的抽象方法,最終的跳出條件是 LAST_1 的抽象方法直接返回的1,類似一個(gè)遞歸的操作來(lái)求解。
-
我看了這種代碼都想吐,居然是自己寫的。
-
以上這些問(wèn)題,都是提醒我們,當(dāng)被限制的無(wú)以復(fù)加的時(shí)候,感覺(jué)啥都不能做了,我們應(yīng)該發(fā)揮腦筋急轉(zhuǎn)彎的創(chuàng)造力,打開(kāi)新的思路,不要慫就是干,這就是發(fā)散思維的精髓。
上一篇:數(shù)據(jù)結(jié)構(gòu)與算法–我們來(lái)玩丟手絹(約瑟夫環(huán)問(wèn)題)
下一篇:數(shù)據(jù)結(jié)構(gòu)與算法–死磕二叉樹(shù)
總結(jié)
以上是生活随笔為你收集整理的数据结构与算法--这个需求很简单怎么实现我不管(发散思维)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 面部刮痧后长痘痘怎么回事
- 下一篇: 数据结构与算法--再来聊聊数组