牛客網模擬測試 3 道程式設計題

2021-08-02 18:21:08 字數 1307 閱讀 7495

題目鏈結

給定 n 個整數,將 n 個整數排成一圈,首位相鄰,求出所有排列中相鄰的數的最大差的最小值

例如:98 100 103 105 四個數,排列成 98 103 105 100 這個排列,最大差是 5,是所有可能的排列中最大差最小的

對於已經排序好的數列 1 3 7 8 10 來說,我們從 2 個數開始排列,然後依次插入數列中的下乙個數

首先 對於 1 3 而言,下面在 1 3 中插入 7 ,很顯然要把 7 插入 1 和 3 中間,得到 1 7 3 這樣才能滿足最大差最小,那麼下乙個 8 應該插在什麼地方呢,應該是 7 和 3 之間,得到 1 7 8 3,同樣 10 應該插入 7 和 8 之間,得到 1 7 10 8 3。

假設對於乙個排序好的數列,對於數列的前 k 個數,我們通過某種排列使得最大差最小,發現原數列中的第 k 個數 和 k - 1 個數總是相鄰的,而且對第 k + 1 個數來說,總是將它插入第 k 個數和第 k - 1 個數之間,記前 k 個數的最大差的最小值為 f(k),那麼 k + 1 個數的最大差的最小值為 max(f(k), a[k+1] - a[k-1]),對 k 從 3 開始,可以得到實際上是求 max(a[k] - a[k-2])

關鍵的**如下

int max = 0;

for(int i = 2; i < n; i++)

按照上述的分析,其實可以構造出來這樣的序列,那麼這是乙個什麼樣的序列呢?

其實我自己最初的想法是對於乙個排序好的陣列,按照下標奇偶將陣列分成兩部分,第一部分從前往後,第二部分從後往前將資料填入新的陣列中,這樣就構造出了滿足最大差最小的排列

例如對數列 1 3 7 8 10 11 15,分成兩部分分別是 1 7 10 15 和 3 8 11,然後分別填入新的陣列

最後得到 1 7 10 15 11 8 3,計算這個數列的最大差即可

**如下

public

class mo1

arrays.sort(height);

int re = new

int[n];

int i = 0, j = n-1;

for (int ptr = 0; ptr < n; ptr+=2)

int max = 0;

for (int p = 0; p < n; p++) else

}system.out.println(max);}}

牛客網程式設計題

參考了排行榜大神 1.計算字串最後乙個單詞的長度,單詞以空格隔開 a raw input b a.split print len b 1 2.寫出乙個程式,接受乙個有字母和數字以及空格組成的字串,和乙個字元,然後輸出輸入字串中含有該字元的個數。不區分大小寫 a raw input lower b r...

牛客網刷題31 2道題)

給定乙個32位整數n,返回該整數二進位制形式1的個數。輸入乙個整數,代表n,n為32為整數。輸出乙個整數,代表n的二進位制表示式中1的個數。示例1 1 1示例2 2 31 時間複雜度o 1 o 1 額外空間複雜度o 1 o 1 進製轉換 位運算把輸入的資料轉成二進位制字串。把轉換後的二進位制字串與1...

牛客網刷題29 2道題)

有乙隻兔子,從出生後第3個月起每個月都生乙隻兔子,小兔子長到第三個月後每個月又生乙隻兔子,假如兔子都不死,問每個月的兔子總數為多少?統計出兔子總數。param monthcount 第幾個月 return 兔子總數 public static int gettotalcount int monthc...