360校招題之小明看花

2021-09-26 08:10:44 字數 1434 閱讀 3178

小明有乙個花園,花園裡面一共有m朵花,對於每一朵花,都是不一樣的,小明用1~m中的乙個整數表示每一朵花。

他很喜歡去看這些花,有一天他看了n次,並將n次他看花的種類是什麼按照時間順序記錄下來。

記錄用a[i]表示,表示第i次他看了a[i]這朵花。

小紅很好奇,她有q個問題,問[l,r]的時間內,小明一共看了多少朵不同的花兒,小明因為在忙著欣賞他的花兒,所以想請你幫他回答這些問題。

輸入描述:

輸入兩個數n,m;(1<=n<=2000,1<=m<=100);分別表示n次看花,m表示一共有m朵花兒。

接下來輸入n個數a[1]~a[n],a[i]表示第i次,小明看的花的種類;

輸入乙個數q(1<=q<=1000000);表示小紅的問題數量。

輸入q行 每行兩個數l,r(1<=l<=r<=n);表示小紅想知道在第l次到第r次,小明一共看了多少不同的花兒。

輸出描述:

一共q行

每一行輸出乙個數 表示小明在[l,r]的時間內看了多少種花。

示例1輸入

5 31 2 3 2 2

31 4

2 41 5輸出3

23本題目看似花哨其實核心很簡單,從輸入輸出開始看。

第一行:n,m。看了n次,有m朵花;

第二行:n個數,表示每次看到的是哪一朵;

第三行:常見的表達有幾組資料的q;

後面的q行:起始點和終點,l,r。

也就是說題目其實是說要找乙個列表裡從第l個數到第r個數之間不重複的數有多少個,這裡想到的是首先選取列表中的數,使用集合set()做乙個python裡的強制型別轉換求取所得set的長度即可。

然而發現還是老問題時間複雜度過大不明白為什麼又沒通過最終結果。

n,m =

tuple

(list

(map

(int

,input()

.split())

))flower =

list

(map

(int

,input()

.split())

)q =

int(

input()

)for i in

range

(q):

l,r =

tuple

(list

(map

(int

,input()

.split())

))res = flower[l-

1:r]

print

(len

(set

(res)))

'''您的**已儲存

執行超時:您的程式未能在規定時間內執行結束,請檢查是否迴圈有錯或演算法複雜度過大。

case通過率為86.67%

'''

目前博主並沒有找出合適的優化方法。

360校招筆試題(C 小明買菜)

大致題意 小明拿n元錢去買菜,一共買x種菜,但是必須要在y種菜裡買一樣最貴的,問小明拿的錢夠不夠買菜。首先輸入n,然後輸入x,y x y 最後輸入y種菜每種菜的單價。例 輸入 8 3 4 2 1 4 3 輸出 yes大致思路 首先對輸入的y種菜的單價進行從小到大排序,用n減去最大的數和前x 1的小數...

校招題之數字翻轉

對於乙個整數x,定義操作rev x 為將x按數字翻轉過來,並且去除掉前導0。例如 如果 x 123,則rev x 321 如果 x 100,則rev x 1.現在給出整數x和y,要求rev rev x rev y 為多少?輸入為一行,x y 1 x y 1000 以空格隔開。輸出rev rev x ...

華為校招上機題

1.兔子爬洞問題 兔子白天爬出5公尺,晚上又掉下去2公尺。問給定洞的深度,兔子要爬多少天 include includeusing namespace std int str2int const char str int main int argc,char argv temp temp 10 st...