第一周练习——认识复杂度和简单排序算法

news2024/10/2 12:34:46

前言
👏作者简介:我是笑霸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/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/54409.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Mediapipe学习记录

学习文档 1、Google MediaPipe&#xff1a;设备端机器学习【完整解决方案】背后的技术实现 - 极术社区 - 连接开发者与智能计算生态 2、【转载】Google MediaPipe&#xff1a;设备端机器学习【完整解决方案】背后的技术实现 3、MediaPipe框架结构 - 走看看 Handtracking封装…

qt creator 设置 项目依赖关系

qt creator中有两种设置项目依赖关系的方式。 1、对于有依赖的项目&#xff0c;如果工程比较简单&#xff0c;可以将所有项目放到一个空的项目下&#xff0c;然后显示地指定从属关系&#xff0c;参考&#xff1a;qmake TEMPLATE subdirs_丘上人的博客-CSDN博客 2、通过qt cre…

leecode#Excel表列序号#组合两个表

题目描述&#xff1a; 给你一个字符串 columnTitle &#xff0c;表示 Excel 表格中的列名称。返回 该列名称对应的列序号 。 分析&#xff1a; 法1&#xff0c;进制转换 这道题要求将Excel 表中的列名称转换成相对应的列序号。由于Excel 表的列名称由大写字母组成&#xff…

vue学习53~60(Vue组件化编程)

2 Vue组件化编程 2.1 模块与组件、模块化与组件化 2.1.1 模块 理解:向外提供特定功能的js程序,一般就是一 个js文件为什么: js 文件很多很复杂作用:复用js,简化js的编写,提高js运行效率 2.1.2 组件 理解:用来实现局部(特定)功能效果的代码集合(html/css/js/image…)为什么…

正大国际期货:外盘期货交易中常见的五类技术分析方法

外盘期货交易中&#xff0c;技术分析是必不可少的&#xff0c;技术分析是指以市场行为为研究对象&#xff0c;以判断市场趋势并跟随趋势的周期性变化来进行一切金融衍生物交易决策的方法的总和。常用的技术方法大体上可以分五大类&#xff1a;指标类、切线类、形态类、波浪类、…

安卓程序逆向与防护

安卓程序逆向与防护实际用处代码打包生成apk的步骤程序基础逆向步骤程序基础防御代码混淆针对逆向工具的防御手段ProguardSO文件防止二次打包程序进阶逆向攻击实战练习逆向简易安卓程序实际用处 1.当想要获得一款前后端分离的安卓程序的数据时&#xff0c;一般会考虑抓包后端传…

Kanzi:关于kanzi的一点杂谈

概述&#xff1a; 做过开发的小伙伴在初次接触Kanzi Studio 这个开发工具时&#xff0c;可能有点摸不着头脑&#xff0c;由于 它不像Android studio 也 不像QT &#xff0c;而且最大的一个区别是&#xff1a;kanzi基本不用写代码逻辑来控制程序显示UI&#xff0c;但是Android …

做外贸一定要知道的20条经验教训

做外贸你必须知道的20课&#xff0c;由米贸搜为你整理如下: 1.在工厂里&#xff0c;客人抱怨价格太高的时候&#xff0c;我总是说一分钱一分货&#xff0c;质量好的回复。进入一家贸易公司后&#xff0c;我知道价格才是硬道理&#xff0c;尤其是大客人。对价格的考虑肯定高于对…

1776年美国才建国,那一年中国在干什么?

时代淘汰你&#xff0c;都不会跟你打一声招呼。时代的残酷性&#xff0c;对人如此&#xff0c;对国家也是这般。美国的历史是太嫩了&#xff0c;在1776年才得以建国。但在这年&#xff0c;美国踏上了工业化革命的节奏&#xff0c;走上了扬帆起航之旅&#xff0c;逐步成为了超级…

JavaIO流处理笔记(万字总结)

学习视频561-JavaSE进阶-IO流概述_哔哩哔哩_bilibili 目录 IO流概述 IO流的分类 IO流四大家族 FileInputStream初步(并非最终方法) FileInputStream循环读(并非最终方法) 往byte数组中读 FileInputStream最终版 FileInputStream的其他常用方法 FileOutputStream的使用…

Kamiya丨Kamiya艾美捷抗冷休克结构域蛋白E1说明书

Kamiya艾美捷抗冷休克结构域蛋白E1化学性质&#xff1a; 物种反应性&#xff1a;人类其他未知物种。 Ig同种型&#xff1a;正常兔全血抗体 免疫原&#xff1a;表达重组CSDE1&#xff08;Met1~Val245&#xff09;在大肠杆菌中 格式&#xff1a;500g/mL多克隆抗体在0.01M PBS…

【Redis】List类型和底层原理

文章目录List类型1.List介绍1.1常用命令2.List底层实现3.ziplist剖析3.1ziplist结构3.2创建一个空的ziplist3.3ziplist的元素节点结构3.4ziplisqt的连锁更新3.5ziplist的缺陷4.quicklist剖析4.1quicklist表头结构5.List的应用场景----消息队列5.1保证消息保序5.2处理重复的消息…

Ubuntu搭建本地web站点,并内网穿透实现公网访问

本次教程我们通过搭建Apache服务&#xff0c;部署一个简单的静态样例站点&#xff0c;并使用cpolar内网穿透将内网样例站点发布到公网来进行演示。 1. 设置 Apache Web 服务器 1.1 安装Apache Web sudo apt-get install apache2 -y1.2 启动Apache Web sudo service apache2…

[附源码]计算机毕业设计springboot校园招聘微信小程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

[附源码]计算机毕业设计自行车租赁管理系统Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

CSS盒子模型

&#x1f353;个人主页&#xff1a;bit.. &#x1f352;系列专栏&#xff1a;Linux(Ubuntu)入门必看 C语言刷题 数据结构与算法 HTML和CSS3 目录 1.盒子模型 1.2盒子模型&#xff08;Box Model&#xff09;组成 1.3边框&#xff08;border&#xff09; 1.4 表格的…

异常概述、常见异常 、自定义异常 、重载重写的异常区别

1.异常概述 程序运行过程中任何打断程序正常流程的情况称为异常或错误。比如:文件打不开、网络中断、操作符越界、类加载找不到等。 Java程序在执行过程中所发生的异常事件可分为两类&#xff1a; public class Test {public static void main (string [] args){stri…

靶向嵌合体PEG-ethoxycarbonyl-propanoic/Dodecaethylene glycol

蛋白水解靶向嵌合体(proteolysis targeting chimeras,PROTACs)通过连接基团将靶蛋白配体与E3连接酶配体利用化学键连接,将E3连接酶“募集”到靶蛋白附近,并利用细胞内的泛素-蛋白酶体系统,实现靶蛋白的泛素化标记和蛋白降解。靶蛋白一旦被降解,PROTACs分子便游离出来,参与到下一…

[附源码]JAVA毕业设计基于vue技术的汽车维修检测系统设计与实现(系统+LW)

[附源码]JAVA毕业设计基于vue技术的汽车维修检测系统设计与实现&#xff08;系统LW&#xff09; 目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&…

【水光互补优化调度】基于非支配排序遗传算法的多目标水光互补优化调度(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…