强行刷段位第一天

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Mirror1997/article/details/85697942

昨天刷过了青铜,以为今天可以很快从白银升成黄金。

后来发现确实很容易,不过并不是对于我这种菜鸡。。。

挣扎了一天就刷了排序。

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

猜你喜欢

转载自blog.csdn.net/Mirror1997/article/details/85697942