P1059 明明的隨機數 陣列排序與刪除重複值

2021-10-04 12:31:29 字數 3058 閱讀 1647

這是一道很簡單的題,但是在**提交時出現了re(執行錯誤),以此記錄,同時還學習到了兩種優秀的題解也一併放上。

明明想在學校中請一些同學一起做一項問卷調查,為了實驗的客觀性,他先用計算機生成了n個1到1000之間的隨機整數(n≤100),對於其中重複的數字,只保留乙個,把其餘相同的數去掉,不同的數對應著不同的學生的學號。然後再把這些數從小到大排序,按照排好的順序去找同學做調查。請你協助明明完成「去重」與「排序」的工作。

輸入格式

輸入有兩行,第1行為1個正整數,表示所生成的隨機數的個數n

第2行有n個用空格隔開的正整數,為所產生的隨機數。

輸出格式

輸出也是兩行,第1行為1個正整數m,表示不相同的隨機數的個數。

第2行為m個用空格隔開的正整數,為從小到大排好序的不相同的隨機數。

輸入輸出樣例

輸入 #1

10

2040

3267

4020

89300

40015

輸出 #1

8

1520

3240

6789

300400

首先說我錯誤的以及修改部分

所以題目其實就是分為兩個部分排序+刪除

所以我很快就書寫了乙份選擇排序+迴圈刪除鄰位重複的**

有問題的兩個部分如下

1.主函式

int

main()

2.刪除函式

void

deletenum

(int arr,

int&num)

}return

;}

**提交的執行結果如下圖(大紅大紫

第一組測試資料本地並沒有問題給出的卻是re

於是我注意到了上面兩個部分,首先是刪除,當我刪除重複值時如果遇到連續多個相同2

2232

23當arr[i]等於第乙個2時,根據函式會刪除第二個2,把第三個2放到第二個2的位置

然後i++ 就不會再判定第乙個2與第三個2的重複了,而是考慮2與3是否重複了

所以只需要加上乙個刪除後讓i減減即可。

void

deletenum

(int arr,

int&num)

}return

;}

此時提交如下圖(紫的依舊紫)

這說明是陣列結構問題很可能是new空間引起的執行錯誤

int

main()

修改為arr[1000]後就正確了

接下來為兩種高效題解

一. set容器

set是數學中的集合,本來就不包括重複數字,而且滿足從小到大

我居然沒想到。

**如下 簡潔高效

主要注意迭代器輸出部分就行了

#include

using

namespace std;

intmain()

cout<

size()

<

for(flag=arr.

begin()

;flag!=arr.

end(

);flag++

) cout<

return0;

}

二. 桶排序法

很長時間沒有打**了,連最簡單的桶排序也都忘了

桶就相當於乙個計數陣列 開闢資料空間來標記每個數出現了多少次

輸出時候只需要輸出計數不是0的桶號不就行了

直接定義1001個桶計數(包含0-1000共1001個不同數)

不就簡單方便的完成了嗎?

#include

using

namespace std;

intmain()

;//初始化桶

for(

int i=

0;i)for

(int i=

0;i<=

1000

;i++

) cout<

for(

int i=

0;i<=

1000

;i++

) cout<

return0;

}

最後是自己最早寫的憨憨解法完整版:選擇排序+迴圈刪除
#include

using

namespace std;

void

selectsort

(int arr,

int num)

int temp=arr[i]

; arr[i]

=arr[min]

; arr[min]

=temp;

}return;}

void

deletenum

(int arr,

int&num)

}return;}

void

print_arr

(int arr,

int num)

intmain()

P1059 明明的隨機數

題目描述 明明想在學校中請一些同學一起做一項問卷調查,為了實驗的客觀性,他先用計算機生成了n個1到1000之間的隨機整數 n 100 對於其中重複的數字,只保留乙個,把其餘相同的數去掉,不同的數對應著不同的學生的學號。然後再把這些數從小到大排序,按照排好的順序去找同學做調查。請你協助明明完成 去重 ...

P1059 明明的隨機數

題目描述 明明想在學校中請一些同學一起做一項問卷調查,為了實驗的客觀性,他先用計算機生成了nn個11到10001000之間的隨機整數 n 100 n 100 對於其中重複的數字,只保留乙個,把其餘相同的數去掉,不同的數對應著不同的學生的學號。然後再把這些數從小到大排序,按照排好的順序去找同學做調查。...

P1059 明明的隨機數

明明想在學校中請一些同學一起做一項問卷調查,為了實驗的客觀性,他先用計算機生成了nn個11到10001000之間的隨機整數 n 100 n 100 對於其中重複的數字,只保留乙個,把其餘相同的數去掉,不同的數對應著不同的學生的學號。然後再把這些數從小到大排序,按照排好的順序去找同學做調查。請你協助明...