程式設計之美2 3 尋找發帖水王

2021-06-25 22:49:21 字數 1163 閱讀 8183

這道題目由於不容易寫測試用例,所以,可以把題目轉換為:在乙個陣列中,有乙個數字出現的次數超過了陣列大小的一半,這和題目原意是一樣的。

這道題目的思想是我們同時去掉陣列中兩個不一樣的數字,那麼,陣列中原來存在的規律是不變的(僅針對這個題目)。

好吧,還是先給出函式宣告:

/*2.3 尋找發帖水王*/

bool dutverify(int*, int, int);

int dutfindnummorethanhalf(int*, int);

可以看到,函式宣告中多了乙個:dutverify,這個函式的作用是驗證,即我們一定可以在乙個不為空的陣列中找到乙個數字,但是,我們不能說明這個數字出現的次數就超過了陣列長度的一半,所以,考慮到演算法的健壯性,我們還是需要最後驗證一下。

由於注釋都已經寫在了**裡,這裡不多做解釋,貼**吧:

/*驗證有效函式*/

bool dutverify(int* a, int size, int result)

/*驗證出現的次數是否大於陣列長度的一半*/

if (count > (size / 2))

return true;

else

return false;

}/*這個題目轉換為陣列中存在某乙個數,這個數出現的次數大於陣列中元素個數的一半*/

/*全域性變數標識輸入引數是否有效*/

bool _dutfindnummorethanhalf = false;

int dutfindnummorethanhalf(int* a, int size)

int result;

int count = 0;

/* *這裡的思想是同時去掉兩個不一樣的數字,那麼陣列的「原型」不會改變,

*即大於一半的那個數字在當前的陣列中還是大於當前個數的一半

*/for (int i = 0; i < size; ++i)

else

}/*當得到這個數字之後,我們需要驗證這個數字是否出現的次數大於總個數的一半*/

bool res = dutverify(a, size, result);

if (res == true)

return result;

else

}

程式設計之美 2 3 尋找發帖「水王」

題目 尋找乙個id列表中,有乙個id超過了總數的一半,找出這個id 分析 可以對id進行排序,因為需要尋找的id超過了一半,所以該id列表id n 中,id n 2 一定是這個id值。複雜度為o nlgn 1 如果用排序這種方法解決的話,複雜度應該就維持在這個水平,不會降低。再思考一下,難道一定需要...

程式設計之美2 3 尋找發帖「水王」

題目1 找到陣列中出現次數超過一半的元素 解法 使用另外不到1 2的元素與所求元素進行抵消 整個陣列抵消不同的兩個數,則超過1 2的元素還是原來的元素 public class main public static int findnum int input throws exception if ...

程式設計之美 2 3 尋找發帖「水王」

1.簡述 原題 簡略的說,就是乙個id列表,其中每個id都可能重複出現,其中乙個id的重複出現個數超過了列表長度的一半。要求快速找到這個id。擴充套件 id列表中,有三個id,這三個id重複出現的次數,都超過了列表長度的1 4。要求快速找到這個id。2.思路 原題的思路是儲存乙個id和該id的計數,...