第一周练习——认识复杂度和简单排序算法-创新互联
目录前言:
创新互联建站是工信部颁发资质IDC服务器商,为用户提供优质的成都天府联通服务器托管服务
👏作者简介:我是笑霸final,一名热爱技术的在校学生。
📝个人主页:个人主页1 || 笑霸final的主页2
📕系列专栏:《数据结构与算法》
📧如果文章知识点有错误的地方,请指正!和大家一起学习,一起进步👀
🔥如果感觉博主的文章还不错的话,👍点赞👍 + 👀关注👀 + 🤏收藏🤏
- 随堂习题-排序(冒泡排序)
- 随堂习题-排序(选择排序)
- 随堂习题-排序(插入排序)
- 随堂习题-二分查找某数
- 随堂习题-查找某个位置
- 随堂习题-局部最小值问题
- 随堂习题-一个数出现奇数次
- 随堂习题-两个数出现奇数次
- 随堂习题-(递归)数组中的大值
给你一个n代表有n个数字,给出这n个数字,然后你需要使用冒泡排序将这些数字从小到大排好。
输入描述:
第一行输入一个n,代表有n个数字
第二行输入n个数
输出描述:
输出排序好后的n个数
示例1
输入:
4
4 3 2 1
输出:
1 2 3 4
代码
#include#includeusing namespace std;
int main(){int n=0;
cin>>n;
if(n<=0) return 0;
vectornums(n);
for(int i=0;icin >>nums[i];
}
//冒泡
for(int i=n-1;i>0;i--){for(int j=0;jif(nums[j]>nums[j+1]){nums[j] =nums[j] ^ nums[j+1];
nums[j+1]=nums[j] ^ nums[j+1];
nums[j] =nums[j] ^ nums[j+1];
}
}
}
//输出
for(int i=0;icout<< nums[i]<<" ";
}
return 0;
}
随堂习题-排序(选择排序)给你一个n代表有n个数字,然后你需要使用选择排序将这些数字从小到大排好。
输入描述:
第一行输入一个n,代表有n个数字
第二行输入n个数
输出描述:
输出排序好后的n个数
示例1
输入:
4
4 3 2 1
输出:
1 2 3 4
代码
#include#includeusing namespace std;
int main(){int n=0;
cin>>n;
if(n<=0) return 0;
vectornums(n);
for(int i=0;icin >>nums[i];
}
//选择排序
for(int i=0;iint vauleMinIndex=i;
for(int j=i+1;jif(nums[vauleMinIndex]>=nums[j]){vauleMinIndex=j;
}
}
swap(nums[i], nums[vauleMinIndex]);
}
//输出
for(int i=0;icout<< nums[i]<<" ";
}
return 0;
}
随堂习题-排序(插入排序)给你一个n代表有n个数字,然后你需要使用插入排序将这些数字从小到大排好。
输入描述:
第一行输入一个n,代表有n个数字
第二行输入n个数
输出描述:
输出排序好后的n个数
示例1
输入:
4
4 3 2 1
输出:
1 2 3 4
代码
#include#includeusing namespace std;
int main(){int n=0;
cin>>n;
if(n<=0) return 0;
vectornums(n);
for(int i=0;icin >>nums[i];
}
//插入排序
for(int i=0;ifor(int j=1;jif(nums[j]swap(nums[j],nums[j-1]);
}
}
}
//输出
for(int i=0;icout<< nums[i]<<" ";
}
return 0;
}
随堂习题-二分查找某数给你一个n代表有一个长度为n的有序数组,然后给你一个k,你需要判断这个k是否在数组里面,
如果存在就返回这个数从左往右第一次出现位置的下标,如果不存在输出-1。
输入描述:
第一行输入一个n,k,其中n代表有n个数字,k代表你需要查找的元素
第二行输入n个数
输出描述:
如果在数组里面找到了k,输出k所在的下标(注:如果数组中k出现了多次,请输出最小的下标!),如果k不在,就输出-1
示例1
输入:
7 0
0 1 2 3 4 5 6
输出:
0
代码
#include#includeusing namespace std;
int main(){int n=0,k=-1,tep=-1;
cin>>n;cin>>k;
if(n<=0) return 0;
vectornums(n);
for(int i=0;i>nums[i];
for(int i=0;i//插入排序
for(int j=1;jif(nums[j]//交换两个数
nums[j] = nums[j] ^ nums[j-1];
nums[j-1]= nums[j] ^ nums[j-1];
nums[j] = nums[j] ^ nums[j-1];
}
}
}
//二分查找
int l=0,r=n-1;
while(l<= r){int mid = l + ((r -l ) >>1);
if(nums[mid]< k) l=mid+1;
if(nums[mid] >k) r=mid-1;
if(nums[mid] == k){//查重
if(nums[mid-1]< nums[mid]){tep = mid;
}
r= mid-1;
}
}
cout<
随堂习题-查找某个位置你需要输入一个n,一个数k,然后输入一个长度为n个大小的数组arr,然后你需要在arr上找满足>=K的最左位置,并且输出这个位置,如果不存在这个位置就输出-1。
输入描述:
第一行输入一个n,k
第二行输入长度为n个大小的数组arr
输出描述:
输出>=K的最左位置
示例1
输入:
5 1
0 0 2 4 6
输出:
2
代码
#include#includeusing namespace std;
int main(){int n=0,k=-1,tep=-1;
cin>>n;cin>>k;
if(n<=0) return 0;
vectornums(n);
for(int i=0;i>nums[i];
for(int i=0;i//插入排序
for(int j=1;jif(nums[j]//交换两个数
nums[j] = nums[j] ^ nums[j-1];
nums[j-1]= nums[j] ^ nums[j-1];
nums[j] = nums[j] ^ nums[j-1];
}
}
}
//二分查找
int l=0,r=n-1;
while(l<= r){int mid = l + ((r -l ) >>1);
if(nums[mid]< k) l=mid+1;
if(nums[mid] >k){r=mid-1;
tep=mid;
}
if(nums[mid] == k){tep=mid;
//查重
if(nums[mid-1] >nums[mid]){tep = mid;
}
r= mid-1;
}
}
cout<
随堂习题-局部最小值问题定义局部最小的概念。arr长度为1时,arr[0]是局部最小。arr的长度为N(N>1)时,如果arr[0]< arr[1],那么arr[0]是局部最小;
如果arr[N-1] 是局部最小。给定无序数组arr,已知arr中任意两个相邻的数都不相等,只需要返回arr中任意一个局部最小出现的位置即可,如果不存在这个位置就输出-1。
输入描述:
第一行输入一个n代表下面需要输入n个数
第二行输入n个元素,任意两个相邻的数都不相等
输出描述:
返回arr中任意一个局部最小出现的位置
示例1
输入:
6
6 2 3 1 5 6
输出:
1
代码
#include#includeusing namespace std;
int main(){int n=0;
cin>>n;
if(n<=0) { cout<< -1<< endl;
return 0;
}
vectornums(n);
for(int i=0;i>nums[i];
//开头局部最小
if(n==1 || nums[0]< nums[1]){cout<< 0<< endl;
return 0;
}
if(n==2 && nums[0]>nums[1]){cout<< 1<< endl;
return 0;
}
//末尾局部最小
if (nums[n-1]< nums[n-2]){cout<< n - 1<< endl;
return 0;
}
//二分查找
int l=0,r=n-1;
while(l<= r){int mid = l + ((r -l ) >>1);
if(nums[mid]< nums[mid-1] && nums[mid]cout<< mid<< endl;
return 0;
}
else if( nums[mid]//说明mid+1也小于于mid 所以局部最小值应该在右边
l=mid+1;
}
else r=mid-1;
}
cout<<-1;
return 0;
}
随堂习题-一个数出现奇数次一个数组中有一种数出现了奇数次,其他数都出现了偶数次,怎么找到这一个数?
输入描述:
第一行输入一个n代表,有个n个长度大小的数组
第二行输入一个长度为n的数组
输出描述:
输出这个数组中出现奇数次的数
示例1
输入:
5
1 1 1 2 1
输出:
2
代码
#includeusing namespace std;
int main(){ int n=0;
cin>>n;
if(n<=0){ cout<<-1;
return 0;
}
vectorarr(n);
for(int i=0;i>arr[i];
int x=0;
for(int i=0;i x=x^arr[i];
}
cout<< x<
随堂习题-两个数出现奇数次给定一个数字arr,其中只有两个数字出现了奇数次,其它数字都出现了偶数次,按照从小到大顺序输出这两个数。
输入描述:
第一行输入一个n,
第二行输入n个数
输出描述:
输出出现奇数次的两个数,按照从小到大的顺序。
示例1
输入:
4
1 1 2 3
输出:
2 3
代码
#includeusing namespace std;
int main(){ int n=0;
cin>>n;
if(n<=0){ cout<<-1;
return 0;
}
vectorarr(n);
for(int i=0;i>arr[i];
//如果所有的数异或运算 最后的值一定是出现奇数次的两个数的异或 并且一定不为0
//例如1111 和 1000 他们异或 为 0111
int eor=0;
for(int i=0;i //把和rightOne位置同为1的数异或 那么得到的数就是其中的一个答案
if( (rightOne & arr[i]) != 0){onlyOne ^= arr[i];
}
}
int y= eor^onlyOne;
if(onlyOne cout<< onlyOne<<" "<< y;
}else{ cout<< y<<" "<< onlyOne;
}
return 0;
}
随堂习题-(递归)数组中的大值用递归方法找一个数组中的大值
输入描述:
第一行输入一个n,代表数组的长度
第二行,输入n个数
输出描述:
输出这个数组中的大值
示例1
输入:
5
1 2 3 4 5
输出:
5
代码
#include#includeusing namespace std;
//递归
int myMax(int arr[],int l,int r){if(l==r){return arr[l];
}
int mid=l+((r-l)>>1);
int leftmax=myMax(arr,l,mid);
int rightmax=myMax(arr,mid+1,r);
return leftmax >rightmax ? leftmax : rightmax;
}
int main(){int n;
cin>>n ;
if(n<=0) return 0;
int *arr = new int[n];
//vectorarr(n);
for(int i = 0 ;i< n ; i++){cin>>arr[i];
}
cout<< myMax(arr,0,n-1);
return 0;
}
注意
上述例题来自牛客网 https://www.nowcoder.com/
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧
网站名称:第一周练习——认识复杂度和简单排序算法-创新互联
网站链接:http://myzitong.com/article/dpepje.html