百度一道面試題引發的思考

2021-06-05 17:56:02 字數 1826 閱讀 3440

下面我將寫寫我對這道題的本質思考得到的三種方法(以下方法都對應函式的名字)。

一、sumget方法

這個題說只有乙個數是重複的,那撇開這個數,也就是說1到100的數都會出現,於是我把所有101個數相加起來,最後再減去1到100的和,不就出來了嗎?

二、flagget方法

做標記是乙個好方法。可以建立乙個陣列flags[100],初始化各元素都為0,然後對要求陣列遍歷,將flags陣列對應的元素置為1,如遍歷到50這個數了,那麼就令flags[50-1] = 1。於是在遍歷過程中看flags對應元素是否為1,如果為1,說明已經找到,可以結束了。

這種方法的時間和空間複雜度也是o(n)。不足之處就是要申請乙個陣列,如果陣列比較大的話就完了。

三、jumpget方法

這種方法是對flagget方法的改進,不用建立陣列,唯一的區別在於它將原陣列改變了。

有點不太好說,舉例子比較形象化。比如初始陣列為numbers,numbers[23]值為71,那麼我就jump到numbers[71-1]處,得知它的值為15,那麼將numbers[71-1]令為0,再jump到numbers[15-1]處,如此反覆,直到jump到乙個為0的位置,說明之前已經jump來了,在jump到這裡,就說明我這次jump的數字就是那個重複的數字。等等,有個問題。如何選擇jump的第乙個位置呢?如果選擇的numbers[23]值為24,那不是原地jump嗎?而且有可能出現這樣的迴圈,如:numbers[23]=71,numbers[70]=15,numbers[14]=24。其實,有乙個位置是其他位置都jump不到的,那就是numbers[100],因為沒有數會等於101。所以以這個位置為初始點是最好的,它不會回來,那種迴圈的點它又進不去,那就只有一種可能,通過不同的位置jump到同一位置。於是找到答案了。

這種方法的時間和空間複雜度也是o(n)。

附上源**吧。

#include #include #include #include #define num 100

using namespace std;

int sumget(int numbers[num+1])

int flagget(int numbers[num+1])

searchnums++;

flags[numbers[i]-1] = 1;

} cout << "searchnums = " << searchnums << endl;

return num;

}int jumpget(int numbers[num+1])

cout << endl << "jumpnums = " << jumpnums << endl;

return lastjump;

}int main()

numbers[num] = num;

srand(unsigned(time(null)));

random_shuffle(numbers, numbers+num+1);

for (int i = 0; i <= num; i++)

cout << numbers[i] << " ";

cout << endl;

cout << "sumget get :" << sumget(numbers) << endl;

cout << "flagget get :" << flagget(numbers) << endl;

cout << "jumpget get :" << jumpget(numbers) << endl;

return 0;

}

linux之父linus說的好,「做簡單的事,做到完美」。也不太確定是不是他說的,確實很有道理。

一道百度面試題

給出乙個整型陣列num,對其中的每個元素,輸出在它左側且比它小的最近元素,要求時間複雜度為o n 例如int num 2無左側最近元素 4左側最近的是2 1沒有 3左側最近的是1.分析 建立乙個棧,然後將陣列中的元素從右至左依次壓入棧中。對每個元素,入棧前先檢查棧頂元素是否比它大,若是的話,則該元素...

一道百度面試題

下面這段 是把中英文混合字串 漢字用兩個位元組表示,特點是第乙個位元組的最高位為1 中的大寫字母轉化為小寫字母,請找出其中的bug,注意各種異常情況。for char piterator szword piterator 0 piterator else if piterator a piterat...

百度一道面試題

我這裡複製的是原話,當然順序是不一定的,很多拿到題目第一反應就是用map,當然可以解決,但是效率不高。還有人覺得應該用演算法 我是沒想到用啥演算法好.還有覺得應該先排序.還有覺得用位圖.bitmap 等等方法!我都覺得麻煩,思維方式就是,從節省時間考慮,從陣列來看,我們都得遍歷一次陣列裡面的元素,那...