強行刷段位第一天
昨天刷過了青銅,以為今天可以很快從白銀升成黃金。
後來發現確實很容易,不過並不是對於我這種菜雞。。。
掙扎了一天就刷了排序。
中途還向百忙之中的Kevin請教了一波。。。
真的是。。。覺得很容易的兩道題,偏偏想的很複雜,然後寫的亂亂的。
記錄一下吧~經驗才是最寶貴的。
排序第一題:
題目:
明明想在學校中請一些同學一起做一項問卷調查,為了實驗的客觀性,他先用計算機生成了N個1到1000之間的隨機整數(N≤100),對於其中重複的數字,只保留一個,把其餘相同的數去掉,不同的數對應著不同的學生的學號。然後再把這些數從小到大排序,按照排好的順序去找同學做調查。請你協助明明完成“去重”與“排序”的工作。
輸入描述:
有2行,第1行為1個正整數,表示所生成的隨機數的N個數:
第2行有N個用空格隔開的正整數,為所產生的隨機數。
輸出描述:
第1行為1個正整數M,表示不相同的隨機數的個數。第2行為M個用空格隔開的正整數,為從小
到大排好序的不相同的隨機數。
樣例輸入:
10
20 40 32 67 40 20 89 300 400 15
樣例輸出:
8
15 20 32 40 67 89 300 400
我的答案:
這個叫明明的小孩事兒可真多。
明明你是個大孩子了,要學會自己敲程式碼。
做這道題最開始的時候為了節省時間複雜度,設定了一個遞迴的去重函式,發現邊界控制起來複雜,順便還把遞迴結束條件寫錯了,跳不出來。
後來Kevin說可以用空間換時間。好吧,我記得上課的時候老師們總是強調空間資源是寶貴的。於是乎。。。第一思維是不要開新的陣列。。。
放棄找之前的錯誤,換成了犧牲一點點空間。
順順當當就出來了。。。
#include <iostream> using namespace std; int arr[100]; void pai(int arr[],int m) { int i=0,j=0; int temp; for(i=m-1;i>0;i--) for(j=0;j<i;j++) { if(arr[j]>arr[j+1]) { temp=arr[j]; arr[j]=arr[j+1]; arr[j+1]=temp; } } } int main() { int m=0,i=0,j=1,sum=1; cin >> m ; for(i=0;i<m;i++) cin>>arr[i]; pai(arr,m); int res[m]; res[0]=arr[0]; for(i=1;i<m;i++) { if(arr[i]!=arr[i-1]) { res[j]=arr[i]; j++; sum++; } } cout<<sum<<endl; for(i=0;i<sum;i++) cout<<res[i]<<" "; return 0; }
排序第二題:
題目:
給出n和n個整數,希望你從小到大給他們排序
輸入描述:
第一行一個正整數n
第二行n個用空格隔開的整數
輸出描述:
輸出僅一行,從小到大輸出n個用空格隔開的整數
樣例輸入:
3
3 1 2
樣例輸出:
1 2 3
資料範圍:
1<=n<=100000
我的答案:
這題上來就用了冒泡,可是隱隱的在心裡覺得那個n<=100000應該是個問題。但是問題是,不知道該在意時間複雜度還是空間複雜度。。
然後就試了一下冒泡。。然後就掛了。。部分樣例不通過。打了60分。我居然還挺高興,畢竟及格了。
後來用了sort函式
用sort要注意兩點:
1.要 #include <algorithm>
2.Sort函式有三個引數:(第三個引數可省略)如:sort(names, names+length, compare)
(1)第一個是要排序的陣列的起始地址。
(2)第二個是結束的地址(最後一位要排序的地址)
(3)第三個引數是排序的方法,可以是升序也可是降序(cmp),還可以不寫第三個引數,此時預設的排序方法是升序。
另外,跟Kevin請教了一下
正常來說,空間給的都很大,你可以直接計算一個int4個位元組,一般是陣列佔空間,其他的變數可以忽略不記。陣列每個元素比如是int的話就4個位元組,那麼陣列100就是100*4個位元組。
時間複雜度來說只看迴圈和遞迴就好,1s中大概100萬時間複雜度左右,比如n是1000的話可以用O(n^2)不可以O(n^3)
另外,n=5000,也可以O(n^2),大概在那個數量級。
如果n=100左右可以用,n^3。n>10000,就用nlogn。n>1000000,用n的。
程式碼就是下面這樣了,冒泡在上面那道粘過了,就只貼一下sort吧
#include <iostream>
#include <algorithm>
using namespace std;
int arr[100000];
int main()
{
int m,i;
cin >> m ;
for(i=0;i<m;i++)
cin>>arr[i];
sort(arr,arr+m);
for(i=0;i<m;i++)
cout<<arr[i]<<" ";
return 0;
}