簡記平衡點問題的實現及改進

2021-08-25 01:39:32 字數 1680 閱讀 7120

從論壇上看到乙個平衡點的考題,問題如下:

[quote]

1.平衡點問題

平衡點:比如int numbers = ; 25前面的總和為24,25後面的總和也是24,25這個點就是平衡點;假如乙個陣列中的元素,其前面的部分等於後面的部分,那麼這個點的位序就是平衡點

要求:返回任何乙個平衡點

[/quote]

跟帖中有人採用了求和,然後從頭遍歷的方法,馬背想換種思路,採用從頭尾向中間步進的方法,簡單實現了一下,第一版的**如下:

package org.eric;

/*** 測試找出平衡點。

* 平衡點:陣列中某乙個元素,其前面元素的總和和後面的元素總和相等,則此元素為平衡點。

* @author 馬背

*/public class balanceelement

int elements = new int;

findsomeonebalance(elements);

}public static void findsomeonebalance(int elements)

int pos = 0; //最終找到的平衡點的位置

int element = 0; //平衡點的值

int n = elements.length; //當前判斷剩餘的元素,初始值為元素總長度

int headpos = -1; //迴圈判斷中頭部元素位置

int tailpos = elements.length; //迴圈判斷中尾部元素位置

int head = 0; //頭部值的累加和

int tail = 0; //尾部值的累加和

boolean headstep = true; //頭部累加在迴圈判斷中下一步是否前進

boolean tailstep = true; //尾部累加在迴圈判斷中下一步是否前進

//迴圈判斷

do if (tailstep)

if (head < tail) else if (head > tail) else

} while (n > 1);

//輸出結果

if (pos != 0) else }}

此實現馬上就發現有重要的bug,當head和tail相等的時候,中間可能還有不止乙個元素,即只是相等不能作為判斷平衡點的唯一標準,修改之後,第二版程式如下:

if (head < tail) else if (head > tail) else if(n==1)

考慮到一些特殊情況,例如:陣列中可能存在多個平衡點、兩個平衡點相鄰等,進一步修改到第三版:

if (head < tail) else if (head > tail) else if (n == 1 || n == 0)

最後針對上面這個版本,馬背測試了一些模擬資料,暫時沒有發現問題:

[list]

[*][*]

[*][/list]

附最後第三版源**:

快速排序的相關實現及改進

啊,快速排序,大名鼎鼎,能稱之為快速的,那就一定有它的道理。那,現在好好學習了一下,看了網上很多版本的實現以及各路教材的講解,還是 挖坑填數 好理解一些,然後左右查詢,使得pivot的左邊比它小,右邊的數比它大 這個函式一般叫做partition 函式,在很多場景用得上,比如還有乙個求陣列前k大數,...

24點問題的程式實現

題目 24點用一筆連起來但只能用橫線和豎線進行連線,最右邊第二行的圓圈處不能用線進行連線 如圖所示 思路 用遞迴實現,設計乙個遞迴函式tf 進行查詢下乙個節點並連線以第一行第一列的點為 1,1 第二行第一列為 2,1 編好每個點的座標,在tf函式中先查詢於自身節點相鄰的且可以連線的點然後進行連線,然...

我寫哈夫曼樹的一點心得及改進

一 首先,討論並比較基於字元的壓縮與基於單詞的壓縮 1.基於字元的壓縮所用的儲存空間固定,但由於每個字元都要編碼,相比基於單詞的壓縮在文章字數較少時更加適用 3.對於不同的文章,應綜合考慮,或者在大量統計的基礎上得出普適規律 4.無論是基於字元的壓縮還是基於單詞的壓縮如果應用k叉樹,則空間利用率都會...