1. 程式人生 > >強行刷段位第一天

強行刷段位第一天

昨天刷過了青銅,以為今天可以很快從白銀升成黃金。

後來發現確實很容易,不過並不是對於我這種菜雞。。。

掙扎了一天就刷了排序。

中途還向百忙之中的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;
      
}