「考研算法」
考研算法
前言
本系列文章涉及的算法内容,针对的是哈尔滨工业大学854科目。在本文中通过具体的算法题进行讲解相应算法。
今天涉及的算法主要有线性筛,十大排序中快速排序和归并排序。
后续会有动态规划的相关算法以及尝试模型的总结,如果对动态规划有兴趣的,可以看我之前的这篇文章,后边都是以这样的形式进行每个动态规划知识点的讲解。
链接如下:https://blog.csdn.net/qq_45992664/article/details/123341143?spm=1001.2014.3001.5502
一、线性筛算法
算法题目:筛质数
给定一个正整数 n,请你求出 1∼n中质数的个数。
输入格式
共一行,包含整数 n。
输出格式
共一行,包含一个整数,表示 1∼n中质数的个数。
数据范围
1 ≤ n ≤ 10^6
输入样例:
8
输出样例:
4
算法思路:
- 切记1不是质数
- 核心:把某一个合数用它的质因数进行筛走。
我们常见的筛法有:朴素筛法(O(LogN * N)),埃式筛法(O(N*log(logN)),线性筛法(O(N))。本文中选择时间复杂度最好的线性筛法。
算法代码:
#include <iostream>
using namespace std;
const int N = 1e6 + 5;
bool st[N];
int primes[N];
int cnt;
void getPrimes(int n){for(int i = 2; i <= n; ++i){if(!st[i]){primes[cnt++] = i;//把质数添加进去}//for循环每次进行从0开始到primes[j] * i ~ n,最大到nfor(int j = 0; primes[j] <= n / i; ++j){st[primes[j] * i] = true;if(i % primes[j] == 0){break;}}// 1. 如果 i % primes[j] == 0, 说明primes[j]是i的最小质因子,primes[j]一定是primes[j] * i 的最小质因子。// 2. 如果 i % primes[j] != 0, 说明primes[j]一定小于i的所有质因子,primes[j]一定是primes[j] * i 的最小质因子。}
}
int main(){int n;scanf("%d", &n);getPrimes(n);printf("%d\n", cnt);return 0;
}
今天的算法除了线性筛比较难点,剩下的排序算法都很简单,直接上代码,不再进行注释。
二、快速排序
算法题目: 快速排序
给定你一个长度为 n的整数数列。
请你使用快速排序对这个数列按照从小到大进行排序。
并将排好序的数列按顺序输出。
输入格式
输入共两行,第一行包含整数 n。
第二行包含 n个整数(所有整数均在 1∼10^9 范围内),表示整个数列。
输出格式
输出共一行,包含 n个整数,表示排好序的数列。
数据范围
1≤n≤100000
输入样例:
5
3 1 2 4 5
输出样例:
1 2 3 4 5
算法代码:
java版本
import java.util.Scanner;public class Main {public static void quicksort(long a[],int l,int r){if(l >= r)return;int i = l-1,j = r + 1;long x = a[(l + r)/2];while(i<j){do i++;while (a[i]<x);do j--;while (a[j]>x);if(i<j)swap(a,i,j);}quicksort(a,l,j);quicksort(a,j+1,r);}public static void swap(long[] a,int i,int j){long tmp = a[i];a[i] = a[j];a[j] = tmp;}public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt();long[] arr = new long[n];for (int i = 0;i < n;i++){arr[i] = sc.nextInt();}quicksort(arr,0,n-1);for (int i = 0;i < n;i++){System.out.print(arr[i] + " ");}}
}
C++版本
#include<iostream>using namespace std;const int N=1e6 + 10;
int a[N];
void quick_sort(int l,int r)
{if(l>=r) return ;int i=l-1,j=r+1,x=a[l+r>>1];while(i<j){do i++;while(a[i]<x);do j--;while(a[j]>x);if(i<j) swap(a[i],a[j]);}quick_sort(l,j);quick_sort(j+1,r);
}
int main()
{int n;cin>>n;for(int i=0;i<n;i++) scanf("%d",&a[i]);quick_sort(0,n-1);for(int i=0;i<n;i++) printf("%d ",a[i]);return 0;
}
三、归并排序
注:由归并排序衍生出的小和问题,逆序对的数量的问题,后边会进行一一讲解。
算法题目:归并排序
给定你一个长度为 n的整数数列。
请你使用快速排序对这个数列按照从小到大进行排序。
并将排好序的数列按顺序输出。
输入格式
输入共两行,第一行包含整数 n。
第二行包含 n个整数(所有整数均在 1∼10^9 范围内),表示整个数列。
输出格式
输出共一行,包含 n个整数,表示排好序的数列。
数据范围
1≤n≤100000
输入样例:
5
3 1 2 4 5
输出样例:
1 2 3 4 5
算法代码:
java版本
import java.io.*;
import java.util.Scanner;public class Main {public static void mergeSort(long[] arr){mergeSort(arr, 0, arr.length - 1);}public static void mergeSort(long[] arr, int l, int r){if(l >= r){return;}int mid = l + ((r - l) >> 1);mergeSort(arr, l, mid);mergeSort(arr, mid + 1, r);long[] help = new long[r - l + 1];int i = 0;int p1 = l;int p2 = mid + 1;while(p1 <= mid && p2 <= r){help[i++] = arr[p1] < arr[p2] ? arr[p1++] : arr[p2++];}while(p1 <= mid){help[i++] = arr[p1++];}while(p2 <= r){help[i++] = arr[p2++];}for(i = 0; i < help.length; ++i){arr[l + i] = help[i];}}public static void main(String[] args) throws IOException {BufferedReader in = new BufferedReader(new InputStreamReader(System.in));BufferedWriter out = new BufferedWriter(new OutputStreamWriter(System.out));String[] str1 = in.readLine().split(" ");int n = Integer.parseInt(str1[0]);//int k = Integer.parseInt(str1[1]);long[] arr = new long[n];String[] str2 = in.readLine().split(" ");for(int i = 0; i < n; i++){arr[i] = Integer.parseInt(str2[i]);}mergeSort(arr, 0, n - 1);for(int i = 0; i < n; i++){System.out.print(arr[i] + " ");}out.flush();out.close();in.close();}
}
C++版本
#include <algorithm>
#include <iostream>
using namespace std;
void merge_sort(int a[], int l, int r){if(l >= r){return;}int mid = l + ((r - l) >> 1);merge_sort(a, l, mid);merge_sort(a, mid + 1, r);int help[r - l + 1];int i = 0;int p1 = l;int p2 = mid + 1;while(p1 <= mid && p2 <= r){help[i++] = a[p1] < a[p2] ? a[p1++] : a[p2++];}while(p1 <= mid){help[i++] = a[p1++];}while(p2 <= r){help[i++] = a[p2++];}for(p1 = l, p2 = 0; p1 <= r; p1++, p2++){a[p1] = help[p2];}
}
int main(){int n;cin >>n;int a[n];for(int i = 0; i < n; i++){cin >> a[i];}merge_sort(a, 0, n - 1);for(int i = 0; i < n; i++){cout<< a[i] << " ";}return 0;
}
最后介绍一个有意思的算法:高精度阶乘
算法题目: 高精度阶乘
随意输入一个n,要求返回n的阶乘。
一、代码如下:
import java.util.Scanner;public class LargeIntegerFactorial {public static void main(String[] args){Scanner sc = new Scanner(System.in);long[] ans = new long[10001000];long n = sc.nextLong();ans[0] = 1;int l = 0;long num = 0;for(int i = 1; i<=n;++i){num = 0;for(int j = 0; j <= l; j++){num = num + ans[j] * i;ans[j] = num % 10;num /= 10;}while(num != 0){ans[++l] =num % 10;num /= 10;}}for(int i = l; i >= 0; --i){System.out.print(ans[i]);}return;}
}#### 代码解析:```java我们接下来把n设置为4,进行代码的实例演示以及解析{long[] ans = new long[10001000];//定义答案数组n = 4;//设置指定数字为4ans[0] = 1; //将答案数组的第一位设置为1int l = 0;//定义变量l,用来记录n!的数字有多少位long num = 0;//定义变量numfor(int i = 1; i<=n;++i)//核心代码,将在下边进行实例解析{num = 0;for(int j = 0; j <= l; j++){num = num + ans[j] * i;ans[j] = num % 10;num /= 10;}while(num != 0){ans[++l] =num % 10;num /= 10;} }{当i == 1时,j == 0, j <= l (0 <= 0), num = 0;num = num + ans[0] * i = 0 + 1 * 1 = 1;ans[0] = num % 10 = 1 % 10 = 1;num = num / 10 = 1 / 10 = 0;当i == 2时,j == 0,j <= l (0 <= 0),num = 0;num = num + ans[0] * i = 0 + 1 * 2 = 2;ans[0] = num % 10 = 2 % 10 = 2;num = num / 10 = 2 / 10 = 0;当i == 3时,j == 0,j <= l (0 <= 0),num = 0;num = num + ans[0] * i = 0 + 2 * 3 = 6;ans[0] = num % 10 = 6 % 10 = 6;num = num / 10 = 6 / 10 = 0;当i == 4时,j == 0,j <= l (0 <= 0),num = 0;num = num + ans[0] * i = 0 + 6 * 4 = 24;ans[0] = num % 10 = 24 % 10 = 4;num = num / 10 = 24 / 10 = 2;进入while循环,num = 2 != 0;ans[++l] = num % 10 = 2 % 10 = 2;(此时l == 1);ans[1] = 2;num = num / 10 = 2 / 10 = 0;当i == 5时,j == 0,j <= l (0 <= 1),num = 0;num = num + ans[0] * i = 0 + 4 * 5 = 20;ans[0] = num % 10 = 20 % 10 = 0;num = num / 10 = 2;当i == 5时,j == 1,j <= l (1 <= 1),num = 2;num = num + ans[1] * i = 2 + 2 * 5 = 12;ans[1] = num % 10 = 12 % 10 = 2;num = num / 10 = 12 / 10 = 1;进入while循环,num = 1 != 0;ans[++l] = num % 10 = 1 % 10 = 1;(此时l == 2);ans[2] = 1;num = num / 10 = 0;结束。}}
代码测试:
1.n = 1000
1000! = 402387260077093773543702433923003985719374864210714632543799910429938512398629020592044208486969404800479988610197196058631666872994808558901323829669944590997424504087073759918823627727188732519779505950995276120874975462497043601418278094646496291056393887437886487337119181045825783647849977012476632889835955735432513185323958463075557409114262417474349347553428646576611667797396668820291207379143853719588249808126867838374559731746136085379534524221586593201928090878297308431392844403281231558611036976801357304216168747609675871348312025478589320767169132448426236131412508780208000261683151027341827977704784635868170164365024153691398281264810213092761244896359928705114964975419909342221566832572080821333186116811553615836546984046708975602900950537616475847728421889679646244945160765353408198901385442487984959953319101723355556602139450399736280750137837615307127761926849034352625200015888535147331611702103968175921510907788019393178114194545257223865541461062892187960223838971476088506276862967146674697562911234082439208160153780889893964518263243671616762179168909779911903754031274622289988005195444414282012187361745992642956581746628302955570299024324153181617210465832036786906117260158783520751516284225540265170483304226143974286933061690897968482590125458327168226458066526769958652682272807075781391858178889652208164348344825993266043367660176999612831860788386150279465955131156552036093988180612138558600301435694527224206344631797460594682573103790084024432438465657245014402821885252470935190620929023136493273497565513958720559654228749774011413346962715422845862377387538230483865688976461927383814900140767310446640259899490222221765904339901886018566526485061799702356193897017860040811889729918311021171229845901641921068884387121855646124960798722908519296819372388642614839657382291123125024186649353143970137428531926649875337218940694281434118520158014123344828015051399694290153483077644569099073152433278288269864602789864321139083506217095002597389863554277196742822248757586765752344220207573630569498825087968928162753848863396909959826280956121450994871701244516461260379029309120889086942028510640182154399457156805941872748998094254742173582401063677404595741785160829230135358081840096996372524230560855903700624271243416909004153690105933983835777939410970027753472000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
计算时间是非常快的,大家可以对照这个链接下的1000!,来看看程序是否算对了,我大致看了下,没有问题。
链接如下:https://www.haomeili.net/JieCheng?JieCheng=1000
相关文章:

「考研算法」
考研算法 前言 本系列文章涉及的算法内容,针对的是哈尔滨工业大学854科目。在本文中通过具体的算法题进行讲解相应算法。 今天涉及的算法主要有线性筛,十大排序中快速排序和归并排序。 后续会有动态规划的相关算法以及尝试模型的总结,如果…...

Android Framework-操作系统基础
最近在看《深入理解Android内核设计思想(第2版)》,个人感觉很不错,内容很多,现将书里个人认为比较重要的内容摘录一下,方便后期随时翻看。 计算机体系结构 硬件是软件的基石,所有的软件功能最…...

美国最新调查显示 50% 企业已在用 ChatGPT,其中 48% 已让其代替员工,你怎么看?
美国企业开始使用ChatGPT,我认为这不是什么新闻。 如果美国的企业现在还不使用ChatGPT,那才是个大新闻。 据新闻源显示,已经使用chatGPT的企业中,48%已经让其代替员工工作。 ChatGPT的具体职责包括:客服、代码编写、招…...

[Java·算法·中等]LeetCode17. 电话号码的字母组合
每天一题,防止痴呆题目示例分析思路1题解1分析思路2题解2题目 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。…...
C#7/C#8/C#9 与dotnetSDK 以及dotnet framework对应关系
语言版本 对应的.net framework版本 对应的.net sdk版本 推荐使用的vs studio C#7.3 3.5、 4.0、 4.5 、4.5.1、 4.5.2 、4.6 、4.6.1、 4.6.2 4.7.1、 4.7.2 .netcore 2.0、.netcore2.1、 .netcore2.2 C#8.0 / F#4.7 不支持 .netcore 3.0、.netcore 3.1 C# 9.0 …...
jvm调优经验总结
最近一段时间很忙,忙到每天10点多11点下班还是感觉有很多事没有做完,不过倒也没有什么太过低落的情绪,有时候只安静的看一个视频,简单看点文字,或者平静的坐着,并没有太多想法。短时间的工作压力是可以接受…...
等保合规知识常见问题解答
Q1:什么是等级保护? 答:等级保护是指对国家重要信息、法人和其他组织及公民的专有信息以及公开信息和存储、传输、处理这些信息的信息系统分等级实行安全保护,对信息系统中使用的信息安全产品实行按等级管理,对信息系统…...

分享5款Windows同类软件中的翘楚
今天要给大家推荐的是5款软件,每个都是同类软件中的个中翘楚,请大家给我高调地使用起来,不用替我藏着掖着。1.沙盒工具——Sandboxie Sandboxie是一个电脑必备的沙盘工具,对于从网上下载的软件安装包、文件、视频、图片等等一切不…...
记--springboot-工具类中使用@Component、@Resource与@Value失效
写一个工具类 需要使用Resource注入RedisTemplate 使用Value获取application.properties配置文件中配置 并使用Component将该工具类交个spring管理 调试的时候RedisTemplate以及所有的变量全是是null 看了网上的各种解决方式五花八门 有的说出现问题的原因:Compon…...

手写一个react,看透react运行机制
适合人群 本文适合0.5~3年的react开发人员的进阶。 讲讲废话: react的源码,的确是比vue的难度要深一些,本文也是针对初中级,本意让博友们了解整个react的执行过程。 写源码之前的必备知识点 JSX 首先我们需要了解什么是JSX。…...
JS判断输入值是否为正整数,判断变量是否为数字
这篇文章将讨论如何确定一个变量是否代表 JavaScript 中的有效数字。 1.JS中的test是原来是JS中检测字符串中是否存在的一种模式,JS输入值是否为判断正整数代码: <script type”text/javascript”> function test() { var num document.getElem…...

Android开发八股文,Android也有自己的八股文了
前言别的行业都有自己的八股文,凭什么Android没有。2023春招即将来临,很多同学会问 Android开发的面试题有必要背吗?我的回答是:很有必要。你可以讨厌这种模式,但你一定要去背,因为不背你就进不了大厂。国内…...

你需要同款“Unreal项目自动化编译、打包和部署”方案吗?
在过往几期的UWA Pipeline最佳实践案例中,我们分享了如何通过Pipeline实现性能优化、性能管理、游戏内容验收和云真机系统的应用(实现批量真机设备的自动化测试,以及针对特效性能优化的方式),其实这些高效的方法并不局…...

电子技术——CMOS-AB类输出阶
电子技术——CMOS-AB类输出阶 本节我们研究CMOS-AB类输出阶。 经典配置 下图展示了一个经典的CMOS-AB类输出阶: 这个很像BJT二极管偏置版本的AB类输出阶,在这里二极管偏置变成了 Q1Q_1Q1 和 Q2Q_2Q2 偏置。不想BJT的情况,这里 QNQ_NQN…...

2023王道考研数据结构笔记第二章线性表
第二章 线性表 2.1 线性表的定义 2.1.1 线性表的基本概念 线性表是具有相同数据类型的n(n>0)个数据元素的有限序列,其中n为表长,当n0时线性表是一个空表。若用L命名线性表,则其一般表示为: L(a1,a2,...,ai,ai1,...,an)L(a_1…...

[chapter 11][NR Physical Layer][Layer Mapping]
前言:这里参考Curious Being系列 ,简单介绍一下NR 5G 物理层核心技术层映射.我们主要讲了一下what is layer Mapping, why need layer Mapping, how layer Mapping 参考文档:3GPP 38.211- 6.3.1.3 Layer mapping《5G NR Physical Layer | Cha…...

什么是工业物联网(IIoT)?
什么是工业物联网(IIoT)?工业物联网(IIoT) 被定义为一组设备和应用,允许大企业创建从核心到边缘的端到端连接环境。其还包括传统的物理基础设施,如集装箱和物流卡车,以收集数据,对事件做出反应,并在智能设备的帮助下做…...

「TCG 规范解读」PC 平台相关规范(4)
可信计算组织(Ttrusted Computing Group,TCG)是一个非盈利的工业标准组织,它的宗旨是加强在相异计算机平台上的计算环境的安全性。TCG于2003年春成立,并采纳了由可信计算平台联盟(the Trusted Computing Platform Alli…...

CSS背景属性之颜色渐变
颜色渐变 颜色渐变其实在网页设计中并不是特别常见, 但也不可避免的会出现导航栏是渐变色这种情况或者别的不是单一颜色的情况, 例如:这样的设计解决方案并不是只可以使用颜色渐变,我们可以使用两个div拼接,将文字放…...

IPv4地址细讲
文章目录一、IPv4地址简介二、IPv4地址的表示方法点分十进制记法三、IP地址的分类四、特殊IPv4地址:全 “0” 和全 “1”五、常用的三类IP地址使用范围六、五类IP地址的范围一、IPv4地址简介 IPv4地址分5类,每一类地址都由固定长度的字段组成࿱…...
uniapp中使用aixos 报错
问题: 在uniapp中使用aixos,运行后报如下错误: AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...

智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制
在数字化浪潮席卷全球的今天,数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具,在大规模数据获取中发挥着关键作用。然而,传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时,常出现数据质…...
今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存
文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...
稳定币的深度剖析与展望
一、引言 在当今数字化浪潮席卷全球的时代,加密货币作为一种新兴的金融现象,正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而,加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下,稳定…...
Pinocchio 库详解及其在足式机器人上的应用
Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库,专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性,并提供了一个通用的框架&…...

莫兰迪高级灰总结计划简约商务通用PPT模版
莫兰迪高级灰总结计划简约商务通用PPT模版,莫兰迪调色板清新简约工作汇报PPT模版,莫兰迪时尚风极简设计PPT模版,大学生毕业论文答辩PPT模版,莫兰迪配色总结计划简约商务通用PPT模版,莫兰迪商务汇报PPT模版,…...
从面试角度回答Android中ContentProvider启动原理
Android中ContentProvider原理的面试角度解析,分为已启动和未启动两种场景: 一、ContentProvider已启动的情况 1. 核心流程 触发条件:当其他组件(如Activity、Service)通过ContentR…...

五子棋测试用例
一.项目背景 1.1 项目简介 传统棋类文化的推广 五子棋是一种古老的棋类游戏,有着深厚的文化底蕴。通过将五子棋制作成网页游戏,可以让更多的人了解和接触到这一传统棋类文化。无论是国内还是国外的玩家,都可以通过网页五子棋感受到东方棋类…...

GraphQL 实战篇:Apollo Client 配置与缓存
GraphQL 实战篇:Apollo Client 配置与缓存 上一篇:GraphQL 入门篇:基础查询语法 依旧和上一篇的笔记一样,主实操,没啥过多的细节讲解,代码具体在: https://github.com/GoldenaArcher/graphql…...

PH热榜 | 2025-06-08
1. Thiings 标语:一套超过1900个免费AI生成的3D图标集合 介绍:Thiings是一个不断扩展的免费AI生成3D图标库,目前已有超过1900个图标。你可以按照主题浏览,生成自己的图标,或者下载整个图标集。所有图标都可以在个人或…...