昨天升了青铜,以为今天可以很快从青铜升成白银。
后来发现确实很容易,不过并不是对于我这种菜鸡。。。
挣扎了一天就刷了排序。
中途还向百忙之中的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;
}