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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

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

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

發(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):

/*** @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));}/*** 利用位運(yùn)算做加法** */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;} }

發(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é)果

/*** @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);} }
  • 這個(gè)犯法太蠢了,蠢哭了,上面通過(guò)不斷定義新對(duì)象來(lái)調(diào)用構(gòu)造方法來(lái)實(shí)現(xiàn)累加,下面來(lái)一個(gè)遞歸的惡心寫法
/*** @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());} }
  • 利用枚舉中的抽象方法,每個(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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。