日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

数据结构与算法--这个需求很简单怎么实现我不管(发散思维)

發布時間:2023/12/4 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据结构与算法--这个需求很简单怎么实现我不管(发散思维) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

發散思維

  • 程序員是一個高危職業,最近動不動就聽到誰誰誰猝死,誰誰誰過勞暈倒,所以面對奇葩問題,我們要淡定,

  • 開發中被產品虐,說的最多的一句話就是這個需求很簡單,怎么實現我不管

  • 找工作被面試官虐,你不能用這個,不能用哪個,還得給我答案

  • 最近碰到了這種奇葩的題目:

  • 第一眼看這種問題,心里一萬頭草泥馬鵬騰而過,陷入沉默中,我表示很慌

  • 這種問題一看就不按常理出牌,不能用常規思路去應對,要不然會被氣死,這也是發散思維的重要吧(我覺得就是腦筋急轉彎),也許是為了考察你心態,不能輕言放棄
  • 我們還是來分析一下這個問題吧:
    • 四則運算不能用,那還能用啥,能想到的只有位運算了吧,總不可能取余,取模運算能搞定加法吧
    • 二進制只有 與, 或,非,異或,沒思路,還是從十進制開始分析吧
    • 例如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),就得到最終結果

  • 那么加法又回到了第一個步驟

  • 經過如上分析,很顯然是一個遞歸或者循環 位運算的問題,那么就能通過位運算得到 加法的解法了

  • 遇到這種問題還是要穩住,不要慌,那么我們有如下實現:

/*** @author liaojiamin* @Date:Created in 16:39 2021/7/8*/ public class SummationForBit {public static void main(String[] args) {System.out.println(sumForBit(12,13));}/*** 利用位運算做加法** */public static int sumForBit(int num1, int num2){int sum = 0;int curry = 0;do{sum = num1 ^ num2;curry = (num1 & num2)<<1;num1 = sum;num2 = curry;}while (curry != 0);return sum;} }

發散思維二

  • 求1+2+3+…+n要求不能用乘法,除法,for,while,if,else,switch,case,以及調節判斷語句;

  • 臥槽不就是不能寫所有邏輯還要求解嗎,能用的邏輯操作都給你禁了還要求和。一般我們求等差數列,一般都是用公式(n+1)*n/2,或者循環,或者遞歸,但是封死了if, for, while,遞歸循環都不行了,你遞歸總得有終止條件吧

  • 這是何等的臥槽,那么還是有辦法的,不讓用循環,那就只能寫n次加法了,還不能用邏輯操作,那么就必須定義實例就執行邏輯,就是構造方法了

  • 通過構造方法執行邏輯,然后構造n次,得到結果

/*** @author liaojiamin* @Date:Created in 14:49 2021/7/8*/ public class Summation {private static int sum;public void setNumber(int result){sum = result;}public Summation(int result, int number){setNumber(result);sum+=number;}public int getNumber(){return sum;}public static void main(String[] args) {int s1 = new Summation(0,1).getNumber();int s2 = new Summation(s1,2).getNumber();int s3 = new Summation(s2,3).getNumber();int s4 = new Summation(s3,4).getNumber();int s5 = new Summation(s4,5).getNumber();int s6 = new Summation(s5,6).getNumber();int s7 = new Summation(s6,7).getNumber();int s8 = new Summation(s7,8).getNumber();int s9 = new Summation(s8,9).getNumber();int s10 = new Summation(s9,10).getNumber();int s11 = new Summation(s10,11).getNumber();System.out.println(s7);} }
  • 這個犯法太蠢了,蠢哭了,上面通過不斷定義新對象來調用構造方法來實現累加,下面來一個遞歸的惡心寫法
/*** @author liaojiamin* @Date:Created in 15:16 2021/7/8*/ public enum SummationRecursion {LAST_4(4){@Overridepublic int mySumResult(){return this.getSummation() + LAST_3.mySumResult();}},LAST_3(3){@Overridepublic int mySumResult(){return this.getSummation() + LAST_2.mySumResult();}},LAST_2(2){@Overridepublic int mySumResult(){return this.getSummation() + LAST_1.mySumResult();}},LAST_1(1){@Overridepublic int mySumResult(){return 1;}};private int summation;public int getSummation() {return summation;}public void setSummation(int summation) {this.summation = summation;}SummationRecursion(int summation){this.summation = summation;}public abstract int mySumResult();public static void main(String[] args) {System.out.println(SummationRecursion.LAST_4.mySumResult());} }
  • 利用枚舉中的抽象方法,每個抽象方法都調用下個層級的抽象方法,最終的跳出條件是 LAST_1 的抽象方法直接返回的1,類似一個遞歸的操作來求解。

  • 我看了這種代碼都想吐,居然是自己寫的。

  • 以上這些問題,都是提醒我們,當被限制的無以復加的時候,感覺啥都不能做了,我們應該發揮腦筋急轉彎的創造力,打開新的思路,不要慫就是干,這就是發散思維的精髓。

上一篇:數據結構與算法–我們來玩丟手絹(約瑟夫環問題)
下一篇:數據結構與算法–死磕二叉樹

總結

以上是生活随笔為你收集整理的数据结构与算法--这个需求很简单怎么实现我不管(发散思维)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。