if執行結構的小感悟

2021-10-08 12:24:47 字數 2994 閱讀 4800

前景是這樣的,我在leetcode刷題的時候,無意中複習了一下執行結構的區別,接下來看**:

這是乙個排列演算法,陣列中只有0、1、2,採用三指標進行排序

邏輯結構就是判斷當前的指標是0還是1還是2,各種情況有對應的操作,我這裡使用的是if判斷

// an highlighted block

public

class

urldemo1

; int p_0 =

0; int p_2 = nums.length-1;

//0、2的指標,因為兩邊都沒排好,所有指標都放在最左端和最右端

int cur =0;

//當前指標

//當cur與p_2重合時,代表已經排好了

int temp =0;

//交換器

while

(cur <= p_2)

//2.要麼當前指標是1,cur移動,無其他操作,因為我們只要把0、2排好,1自然就排好了

if(nums[cur]==1

)//3.要麼當前指標是2,cur指標資料和p_2資料交換,把2調進2邊界,p_0左移動

//這種情況cur不能移動因為有可能換過來的是1

if(nums[cur]==2

)}system.out.

println

(arrays.

tostring

(nums));

}

接下來看排列結果

這裡發現排列結果和預想的0,0,1,1,2,2]不一樣,接下來為了更清楚交換的執行過程我做了一些改動,執行結果如下

這裡可以發現,執行**過程中進行了五次交換,按照上面演算法的設計應該是執行四次才對,就是當cur指標與p_2指標重合的時候,不發生任何交換,直接cur指標移動即可

可是為什麼這裡的**發生來交換,原因在於多if執行結構和if…else if …else執行結構的區別,

多個if是一次操作中對每個if都要進行判斷,else if是只要滿足了乙個if,就不會對其他的if做判斷

像上面這種多if的判斷,它是每個判斷都要走一遍的,就是假設上cur指標指向0,然後語句將0改為了1,這時它不是跳出整個判斷,而是進入了下面的條件判斷,進入了1的條件判斷,如果在1的條件判斷執行語句中1改為了2,那麼它又會接著進入下乙個2的條件判斷,基於這點分析上面演算法的第五次交換,在第四次交換完成後cur為1,p_2為2,cur指標移動,cur為2,這時已經排列完成,但是此時並沒有跳出整個語句判斷而是進入了判斷cur是否為2的條件判斷,進行了交換

為了驗證這裡的分析,我把2的條件判斷和1的條件判斷進行了位置交換,如下

//這時候有三種情況

//1.要麼當前指標是0,cur指標資料和p_0資料交換,把0調進0邊界,cur移動,p_0右移動

if(nums[cur]==0

)//3.要麼當前指標是2,cur指標資料和p_2資料交換,把2調進2邊界,p_0左移動

//這種情況cur不能移動因為有可能換過來的是1

if(nums[cur]==2

)//2.要麼當前指標是1,cur移動,無其他操作,因為我們只要把0、2排好,1自然就排好了

if(nums[cur]==1

)

此時再看執行結果

符合演算法的設想,交換了四次排序完成,上面的原因分析成立

接下來進行總結,其實多if和if…eslf if…else的邏輯結構是一樣的,但是在實際使用中執行的結構卻是有差別的,這時選用哪種條件結構,就考驗對需求的判斷了,就像上面的演算法,實際上我只是需要每次迴圈判斷一種情況符號後就結束整個條件判斷了,而不是每次判斷了全部條件,才退出整個條件判斷,所有上面的演算法結構是不符合我的需要的

這裡應該改為

public

class

urldemo1

; int p_0 =

0; int p_2 = nums.length-1;

//0、2的指標,因為兩邊都沒排好,所有指標都放在最左端和最右端

int cur =0;

//當前指標

//當cur與p_2重合時,代表已經排好了

int temp =0;

//交換器

while

(cur <= p_2)

//2.要麼當前指標是1,cur移動,無其他操作,因為我們只要把0、2排好,1自然就排好了

else

if(nums[cur]==1

)//3.要麼當前指標是2,cur指標資料和p_2資料交換,把2調進2邊界,p_0左移動

//這種情況cur不能移動因為有可能換過來的是1

else

system.out.

println

("cut="

+cur+

"-----"

+"p_2="

+p_2)

; system.out.

println

("cut="

+nums[cur]

+"-----"

+"p_2="

+nums[p_2]);

system.out.

println

("temp="

+temp);}

system.out.

println

(arrays.

tostring

(nums));

}}

執行結果

有興趣的朋友可以去看leetcode的原題題號75,顏色分類

實習小感悟

我熱愛的專業領域是軟體測試。在校期間,我還不知道軟體測試有專門的學科領域,第一次熟悉是從找實習工作開始。當時面試了幾家測試開發,被面試官問的一頭霧水,他們主要問的測試相關理論知識,我卻乙個也答不上來,因為我在學校一點都沒有接觸到。被打擊之後,我放棄找工作,決定先補充自己,我去圖書館借閱幾本軟體測試相...

管理上的小感悟

偶然的機會,和華為的高手切磋了一下。讓我對華為有了新的認識。朋友說 華為在組織層面無疑是非常成功的,外面的企業和組織,不管看懂看不懂,都按照華為的來!是啊,我呆過一些企業和組織,真的是這樣,一天到晚得學習華為的績效管理,學習華為的ipd 學習華為的人很多,成功得卻不多,為什麼呢?小時候,我們的老師說...

記筆記的小感悟

背景 當前社會,快速發展,新知識層出不窮,不學習就會落後。為了面對當前環境,終生學習的理念早已提出,對於不再年少的中年人來說,提高學習效率在終身學習中就顯得十分重要了,而做好筆記無疑是高效學習的一種必要手段。為什麼要做筆記 為了避免忘記。根據艾賓浩斯遺忘曲線,我們學到的新東西會隨著時間逐漸遺忘。人到...