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