從論壇上看到乙個平衡點的考題,問題如下:
[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叉樹,則空間利用率都會...