第一周练习——认识复杂度和简单排序算法
创始人
2024-03-12 23:53:04
0

前言
👏作者简介:我是笑霸final,一名热爱技术的在校学生。
📝个人主页:个人主页1 || 笑霸final的主页2
📕系列专栏:《数据结构与算法》
📧如果文章知识点有错误的地方,请指正!和大家一起学习,一起进步👀
🔥如果感觉博主的文章还不错的话,👍点赞👍 + 👀关注👀 + 🤏收藏🤏

在这里插入图片描述

请添加图片描述

目录

  • 随堂习题-排序(冒泡排序)
  • 随堂习题-排序(选择排序)
  • 随堂习题-排序(插入排序)
  • 随堂习题-二分查找某数
  • 随堂习题-查找某个位置
  • 随堂习题-局部最小值问题
  • 随堂习题-一个数出现奇数次
  • 随堂习题-两个数出现奇数次
  • 随堂习题-(递归)数组中的最大值

随堂习题-排序(冒泡排序)

给你一个n代表有n个数字,给出这n个数字,然后你需要使用冒泡排序将这些数字从小到大排好。

输入描述:

第一行输入一个n,代表有n个数字
第二行输入n个数

输出描述:

输出排序好后的n个数


示例1
输入:

4
4 3 2 1

输出:

1 2 3 4

代码

#include
#include
using 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
#include
using 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
#include
using 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
#include
using 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
#include
using 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
#include
using 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

代码

#include
using namespace std;int main(){int n=0;cin>>n;if(n<=0){cout<<-1;return 0;}vector arr(n);for(int i=0;i>arr[i];int x=0;for(int i=0;ix=x^arr[i];}cout<< x<

随堂习题-两个数出现奇数次

给定一个数字arr,其中只有两个数字出现了奇数次,其它数字都出现了偶数次,按照从小到大顺序输出这两个数。

输入描述:

第一行输入一个n,
第二行输入n个数

输出描述:

输出出现奇数次的两个数,按照从小到大的顺序。


示例1
输入:

4
1 1 2 3

输出:

2 3

代码

#include
using namespace std;int main(){int n=0;cin>>n;if(n<=0){cout<<-1;return 0;}vector arr(n);for(int i=0;i>arr[i];//如果所有的数异或运算 最后的值一定是出现奇数次的两个数的异或 并且一定不为0 //例如1111 和 1000 他们异或 为 0111int eor=0;for(int i=0;i//把和rightOne位置同为1的数异或 那么得到的数就是其中的一个答案if( (rightOne & arr[i]) != 0){onlyOne ^= arr[i];}}int y= eor^onlyOne;if(onlyOnecout<< onlyOne <<" "<< y;}else{cout<< y <<" "<< onlyOne;}return 0;}

随堂习题-(递归)数组中的最大值

用递归方法找一个数组中的最大值

输入描述:

第一行输入一个n,代表数组的长度
第二行,输入n个数

输出描述:

输出这个数组中的最大值


示例1
输入:

5
1 2 3 4 5

输出:

5

代码

#include 
#include 
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 arr(n);for(int i = 0 ;i < n ; i++){cin>>arr[i];}cout<< myMax(arr,0,n-1);return 0;
}

注意
上述例题来自牛客网 https://www.nowcoder.com/

相关内容

热门资讯

美国2年期国债收益率上涨15个... 原标题:美国2年期国债收益率上涨15个基点 美国2年期国债收益率上涨15个基...
汽车油箱结构是什么(汽车油箱结... 本篇文章极速百科给大家谈谈汽车油箱结构是什么,以及汽车油箱结构原理图解对应的知识点,希望对各位有所帮...
嵌入式 ADC使用手册完整版 ... 嵌入式 ADC使用手册完整版 (188977万字)💜&#...
重大消息战皇大厅开挂是真的吗... 您好:战皇大厅这款游戏可以开挂,确实是有挂的,需要了解加客服微信【8435338】很多玩家在这款游戏...
盘点十款牵手跑胡子为什么一直... 您好:牵手跑胡子这款游戏可以开挂,确实是有挂的,需要了解加客服微信【8435338】很多玩家在这款游...
senator香烟多少一盒(s... 今天给各位分享senator香烟多少一盒的知识,其中也会对sevebstars香烟进行解释,如果能碰...
终于懂了新荣耀斗牛真的有挂吗... 您好:新荣耀斗牛这款游戏可以开挂,确实是有挂的,需要了解加客服微信8435338】很多玩家在这款游戏...
盘点十款明星麻将到底有没有挂... 您好:明星麻将这款游戏可以开挂,确实是有挂的,需要了解加客服微信【5848499】很多玩家在这款游戏...
总结文章“新道游棋牌有透视挂吗... 您好:新道游棋牌这款游戏可以开挂,确实是有挂的,需要了解加客服微信【7682267】很多玩家在这款游...
终于懂了手机麻将到底有没有挂... 您好:手机麻将这款游戏可以开挂,确实是有挂的,需要了解加客服微信【8435338】很多玩家在这款游戏...