不重複數字

2021-10-08 08:10:41 字數 1744 閱讀 5121

\operatorname

luogup

4305

給定 n

nn 個數,要求把其中重複的去掉,只保留第一次出現的數。

本題有多組資料。

第一行乙個整數 t

tt ,表示資料組數。

對於每組資料:

第一行乙個整數 n

nn 。

第二行 n

nn 個數,表示給定的數。

對於每組資料,輸出一行,為去重後剩下的數,兩個數之間用乙個空格隔開。

2111

21833

19236

5461

2345

6

1218

31965

4123

456

對於 30

%30\%

30% 的資料, n

≤100

n \le 100

n≤10

0 ,給出的數 ∈[0

,100

]\in [0, 100]

∈[0,10

0]。對於 60

%60\%

60% 的資料, n≤1

04

n \le 10^4

n≤10

4 ,給出的數 ∈[0

,104

]\in [0, 10^4]

∈[0,10

4]。對於 100

%100\%

100%

的資料, 1≤t

≤50

1 \le t\le 50

1≤t≤50

, 1≤n≤

5×10

41 \le n \le 5 \times 10^4

1≤n≤5×

104 ,給出的數在 32

3232

位有符號整數範圍內。

這道題是一道hash。

一般的hash會被卡掉(好像是的),我這裡用了一位大佬的方法,就是有重複的時候不加 1

11 ,而是加乙個很大的素數。(我用了 19260817

19260817

192608

17)還有,因為這個數可能是負數,我就把陣列數量翻倍,然後一半代表正數,一半代表負數。

#include

#include

#define mo 400000

#define ll long long

#define dazhishu 19260817

using

namespace std;

int t, n;

bool go0;

ll a[

50001

], in[

800005];

intmain()

continue;}

int hash = a[i]

% mo;

while

(in[hash + mo]!=0

&& in[hash + mo]

!= a[i]

) hash =

(hash + dazhishu)

% mo;

//找到它原來的位置或者新的位置

if(in[hash + mo]==0

)}printf

("\n");

//輸出換行

}return0;

}

不重複數字 unordered map

據說這道題加強了資料,卡普通雜湊,多模數雜湊,普通map,set 這時候就要祭出我們的大殺器 unordered map 定義和用法與普通map基本相同,只不過它的查詢是o 1 的 它的實現就是雜湊表 而普通map是o logn 的,那麼這道題就迎刃而解了 另 它還有個兄弟 unordered se...

JLOI2011 不重複數字

原題鏈結 題解題目大意 給出n個數,要求把其中重複的去掉,只保留第一次出現的數。最後按順序輸出 n 50000 然這題是個雜湊的典型題目 hash,我對於它的理解就是乙個桶 乙個數,當然並不是如此,有很多更好的hash函式可以更好的減少衝突,例如非十進位制數等。hash一般用來處理乙個元素是否在乙個...

「不重複數」問題

1 如果乙個數字十進位制表達時,不存在連續兩位相同,則稱之為 不重複數 例如,105 1234 12121都是不重複數,而11 100 1225不是。給定乙個正整數a,返回大於a的最小不重複數。a小於100000.示例 輸入 value 21099 返回 21201 本題的難點不在於判斷是否是不重複...