前言:
👏作者简介:我是笑霸final,一名热爱技术的在校学生。
📝个人主页:个人主页1 || 笑霸final的主页2
📕系列专栏:《数据结构与算法》
📧如果文章知识点有错误的地方,请指正!和大家一起学习,一起进步👀
🔥如果感觉博主的文章还不错的话,👍点赞👍 + 👀关注👀 + 🤏收藏🤏
目录
- 随堂习题-排序(冒泡排序)
- 随堂习题-排序(选择排序)
- 随堂习题-排序(插入排序)
- 随堂习题-二分查找某数
- 随堂习题-查找某个位置
- 随堂习题-局部最小值问题
- 随堂习题-一个数出现奇数次
- 随堂习题-两个数出现奇数次
- 随堂习题-(递归)数组中的最大值
随堂习题-排序(冒泡排序)
给你一个n代表有n个数字,给出这n个数字,然后你需要使用冒泡排序将这些数字从小到大排好。
输入描述:
第一行输入一个n,代表有n个数字
第二行输入n个数
输出描述:
输出排序好后的n个数
示例1
输入:
4
4 3 2 1
输出:
1 2 3 4
代码
#include<iostream>
#include<vector>
using namespace std;
int main(){
int n=0;
cin>>n;
if(n<=0) return 0;
vector<int>nums(n);
for(int i=0;i<n;i++){
cin >> nums[i];
}
//冒泡
for(int i=n-1;i>0;i--){
for(int j=0;j<i;j++){
if(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;i<n;i++){
cout<< nums[i]<<" ";
}
return 0;
}
随堂习题-排序(选择排序)
给你一个n代表有n个数字,然后你需要使用选择排序将这些数字从小到大排好。
输入描述:
第一行输入一个n,代表有n个数字
第二行输入n个数
输出描述:
输出排序好后的n个数
示例1
输入:
4
4 3 2 1
输出:
1 2 3 4
代码
#include<iostream>
#include<vector>
using namespace std;
int main(){
int n=0;
cin>>n;
if(n<=0) return 0;
vector<int>nums(n);
for(int i=0;i<n;i++){
cin >> nums[i];
}
//选择排序
for(int i=0;i<n;i++){
int vauleMinIndex=i;
for(int j=i+1;j<n;j++){
if(nums[vauleMinIndex]>=nums[j]){
vauleMinIndex=j;
}
}
swap(nums[i], nums[vauleMinIndex]);
}
//输出
for(int i=0;i<n;i++){
cout<< nums[i]<<" ";
}
return 0;
}
随堂习题-排序(插入排序)
给你一个n代表有n个数字,然后你需要使用插入排序将这些数字从小到大排好。
输入描述:
第一行输入一个n,代表有n个数字
第二行输入n个数
输出描述:
输出排序好后的n个数
示例1
输入:
4
4 3 2 1
输出:
1 2 3 4
代码
#include<iostream>
#include<vector>
using namespace std;
int main(){
int n=0;
cin>>n;
if(n<=0) return 0;
vector<int>nums(n);
for(int i=0;i<n;i++){
cin >> nums[i];
}
//插入排序
for(int i=0;i<n-1;i++){
for(int j=1;j<n;j++){
if(nums[j]<nums[j-1]){
swap(nums[j],nums[j-1]);
}
}
}
//输出
for(int i=0;i<n;i++){
cout<< 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<iostream>
#include<vector>
using namespace std;
int main(){
int n=0,k=-1,tep=-1;
cin>>n;cin>>k;
if(n<=0) return 0;
vector<int>nums(n);
for(int i=0;i<n;i++) cin >> nums[i];
for(int i=0;i<n;i++){ //插入排序
for(int j=1;j<n;j++){
if(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];
}
}
}
//二分查找
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<<tep;
return 0;
}
随堂习题-查找某个位置
你需要输入一个n,一个数k,然后输入一个长度为n个大小的数组arr,然后你需要在arr上找满足>=K的最左位置,并且输出这个位置,如果不存在这个位置就输出-1。
输入描述:
第一行输入一个n,k
第二行输入长度为n个大小的数组arr
输出描述:
输出>=K的最左位置
示例1
输入:
5 1
0 0 2 4 6
输出:
2
代码
#include<iostream>
#include<vector>
using namespace std;
int main(){
int n=0,k=-1,tep=-1;
cin>>n;cin>>k;
if(n<=0) return 0;
vector<int>nums(n);
for(int i=0;i<n;i++) cin >> nums[i];
for(int i=0;i<n;i++){ //插入排序
for(int j=1;j<n;j++){
if(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];
}
}
}
//二分查找
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<<tep;
return 0;
}
随堂习题-局部最小值问题
定义局部最小的概念。arr长度为1时,arr[0]是局部最小。arr的长度为N(N>1)时,如果arr[0] < arr[1],那么arr[0]是局部最小;
如果arr[N-1]<arr[N-2],那么arr[N-1]是局部最小;如果0<i<N-1,既有arr[i] < arr[i-1],又有arr[i] < arr[i + 1],那么arr[i]
是局部最小。给定无序数组arr,已知arr中任意两个相邻的数都不相等,只需要返回arr中任意一个局部最小出现的位置即可,如果不存在这个位置就输出-1。
输入描述:
第一行输入一个n代表下面需要输入n个数
第二行输入n个元素,任意两个相邻的数都不相等
输出描述:
返回arr中任意一个局部最小出现的位置
示例1
输入:
6
6 2 3 1 5 6
输出:
1
代码
#include<iostream>
#include<vector>
using namespace std;
int main(){
int n=0;
cin>>n;
if(n<=0) {
cout << -1 << endl;
return 0;
}
vector<int>nums(n);
for(int i=0;i<n;i++) cin >> 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]<nums[mid+1]){
cout << mid << endl;
return 0;
}
else if( nums[mid]<nums[mid-1]){
//说明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
代码
#include<bits/stdc++.h>
using namespace std;
int main(){
int n=0;
cin>>n;
if(n<=0){
cout<<-1;
return 0;
}
vector<int> arr(n);
for(int i=0;i<n;++i)cin>>arr[i];
int x=0;
for(int i=0;i<n;++i){
x=x^arr[i];
}
cout<< x<<endl;
return 0;
}
随堂习题-两个数出现奇数次
给定一个数字arr,其中只有两个数字出现了奇数次,其它数字都出现了偶数次,按照从小到大顺序输出这两个数。
输入描述:
第一行输入一个n,
第二行输入n个数
输出描述:
输出出现奇数次的两个数,按照从小到大的顺序。
示例1
输入:
4
1 1 2 3
输出:
2 3
代码
#include<bits/stdc++.h>
using namespace std;
int main(){
int n=0;
cin>>n;
if(n<=0){
cout<<-1;
return 0;
}
vector<int> arr(n);
for(int i=0;i<n;++i)cin>>arr[i];
//如果所有的数异或运算 最后的值一定是出现奇数次的两个数的异或 并且一定不为0
//例如1111 和 1000 他们异或 为 0111
int eor=0;
for(int i=0;i<n;++i) eor^=arr[i];
//先找出这个结果最右边的那一位1
int rightOne = eor & (~eor + 1);//这样就得到一个二进制数 列 0001
//除了这两个数 其他数异或为0 所以 y^这两个数得到的数一定是其中一个
// 1111^ 1000^ 0001 满足交互律 1111^ 0001 ^ 1000 =0000^0001=0001
int onlyOne=0;
for(int i=0;i<n;++i){
//把和rightOne位置同为1的数异或 那么得到的数就是其中的一个答案
if( (rightOne & arr[i]) != 0){
onlyOne ^= arr[i];
}
}
int y= eor^onlyOne;
if(onlyOne<y){
cout<< onlyOne <<" "<< y;
}else{
cout<< y <<" "<< onlyOne;
}
return 0;
}
随堂习题-(递归)数组中的最大值
用递归方法找一个数组中的最大值
输入描述:
第一行输入一个n,代表数组的长度
第二行,输入n个数
输出描述:
输出这个数组中的最大值
示例1
输入:
5
1 2 3 4 5
输出:
5
代码
#include <iostream>
#include <vector>
using 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];
//vector<int> arr(n);
for(int i = 0 ;i < n ; i++){
cin>>arr[i];
}
cout<< myMax(arr,0,n-1);
return 0;
}
注意
上述例题来自牛客网 https://www.nowcoder.com/