【算法笔记自学】入门篇(2)——算法初步
4.1排序

自己写的题解
#include <stdio.h>
#include <stdlib.h>void selectSort(int A[], int n) {for(int i = 0; i < n - 1; i++) { // 修正索引范围int k = i;for(int j = i + 1; j < n; j++) { // 修正索引范围if(A[j] < A[k]) {k = j;}}if (k != i) { // 仅在需要时进行交换int temp = A[i];A[i] = A[k];A[k] = temp;}}
}int main() {int n = 0;scanf("%d", &n);int A[n];for(int i = 0; i < n; i++) {scanf("%d", &A[i]);}selectSort(A, n); // 直接传递数组名for(int i = 0; i < n; i++) {if(i!=n-1){printf("%d ", A[i]);}else{printf("%d", A[i]);}}system("pause"); // 防止运行后自动退出,需头文件stdlib.hreturn 0;
}

自己写的题解
#include <stdio.h>
#include <stdlib.h>
void insertSort(int A[], int n) {for(int i=1;i<=n-1;i++){int temp=A[i],j=i;while(j>0&&temp<A[j-1]){A[j]=A[j-1];j--;}A[j]=temp;}
}int main() {int n = 0;scanf("%d", &n);int A[n];for(int i = 0; i < n; i++) {scanf("%d", &A[i]);}insertSort(A, n); // 直接传递数组名for(int i = 0; i < n; i++) {if(i!=n-1){printf("%d ", A[i]);}else{printf("%d", A[i]);}}system("pause"); // 防止运行后自动退出,需头文件stdlib.hreturn 0;
}
4.2散列

#include <stdio.h>
#include <stdlib.h>const int maxn = 100010;
int hashTable[maxn] = {0};int main() {int n, x;scanf("%d", &n);for (int i = 0; i < n; i++) {scanf("%d", &x);if (x >= 0 && x < maxn) { // 确保x在合法范围内hashTable[x]++;}}for (int i = 0; i < maxn; i++) { // 修正遍历范围if (hashTable[i] != 0) {printf("%d %d\n", i, hashTable[i]); // 修正输出格式}}system("pause"); // 防止运行后自动退出,需头文件stdlib.hreturn 0;
}

标答
#include <cstdio>
#include <cstring>const int MAXN = 26;
const int MAXL = 1001;
char str1[MAXL], str2[MAXL];
bool hashTable[MAXN] = {false};int getHashKey(char c) {return c - 'a';
}int main () {scanf("%s%s", str1, str2);int len1 = strlen(str1);int len2 = strlen(str2);for (int i = 0; i < len1; i++) {hashTable[getHashKey(str1[i])] = true;}for (int i = 0; i < len2; i++) {printf("%d", hashTable[getHashKey(str2[i])]);printf(i < len2 - 1 ? " " : "\n");}return 0;
}


#include <cstdio>const int MAXN = 26 * 26 * 26;
const int MAXL = 1001;
char str[MAXL];
int hashTable[MAXN] = {0};int getHashKey(char s[]) {return (s[0] - 'A') * 26 * 26 + (s[1] - 'A') * 26 + (s[2] - 'A');
}int main () {int n, m;scanf("%d", &n);for (int i = 0; i < n; i++) {scanf("%s", str);hashTable[getHashKey(str)]++;}scanf("%d", &m);for (int i = 0; i < m; i++) {scanf("%s", str);printf("%d", hashTable[getHashKey(str)]);printf(i < m - 1 ? " " : "\n");}return 0;
}
4.3递归



#include <stdio.h>
#include <stdlib.h>void print(int n) {if (n == 0) {printf("讲你妹的故事啊!快点去睡觉!!!\n");} else {printf("从前有座山,山上有座庙\n庙里有一个老和尚和一个小和尚\n睡前老和尚给小和尚讲故事:\n");print(n - 1);printf("然后老和尚和小和尚就睡觉啦\n");}
}int main() {int n;scanf("%d", &n);print(n);system("pause"); // 防止运行后自动退出,需头文件stdlib.hreturn 0;
}


#include <stdio.h>
#include <stdlib.h>int F(int n) {if(n==1)return 1;if(n==2)return 1;if(n>2)return F(n-1)+F(n-2);
}int main() {int n;scanf("%d", &n);printf("%d",F(n));system("pause"); // 防止运行后自动退出,需头文件stdlib.hreturn 0;
}


#include <stdio.h>
#include <stdlib.h>
const int maxn=11;
int n,P[maxn],hashTable[maxn]={false};
void generateP(int index){if(index==n+1){for(int i=1;i<=n;i++){printf("%d",P[i]);printf(i<n ? " " : "\n");}return;}for(int x=1;x<=n;x++){if(hashTable[x]==false){P[index]=x;hashTable[x]=true;generateP(index+1);hashTable[x]=false;}}
}int main() {n=3;scanf("%d",&n);generateP(1);system("pause"); // 防止运行后自动退出,需头文件stdlib.hreturn 0;
}
4.4贪心

#include <cstdio>
#include <algorithm>
using namespace std;
const int MAXN = 100000; // 箱子数量上限
int a[MAXN]; // 箱子数组
int main() {int n, maxW; // 箱子数量、载重scanf("%d%d", &n, &maxW);for (int i = 0; i < n; i++) { // 输入各箱子重量scanf("%d", &a[i]);}sort(a, a + n); // 将箱子按重量从小到大排序int num = 0, sum = 0; // 最大箱子数量、最大累计重量for (int i = 0; i < n; i++) { // 从小到大遍历箱子if (sum + a[i] <= maxW) { // 如果加上当前箱子的重量之后没有超过载重num++; // 最大箱子数量加1sum += a[i]; // 最大累计重量加上当前箱子的重量} else { // 如果超过载重,那么退出循环break;}}printf("%d %d", num, sum); // 输出最大箱子数量和最大累计重量return 0;
}

#include <cstdio>
#include <algorithm>
using namespace std;
const int MAXN = 10000;
struct Interval { // 区间结构体定义int l, r;
} interval[MAXN]; // 区间数组bool cmp(Interval a, Interval b) { // 区间的比较函数if (a.l != b.l) { // 如果左端点不同,那么按左端点从大到小return a.l > b.l;} else { // 否则,按右端点从小到大return a.r < b.r;}
}int main() {int n;scanf("%d", &n);for (int i = 0; i < n; i++) { // 输入n个区间的左右端点scanf("%d%d", &interval[i].l, &interval[i].r);}sort(interval, interval + n, cmp); // 将区间数组进行排序int num = 1, lastL = interval[0].l; // 排序后的第一个区间总是被选中for (int i = 1; i < n; i++) { // 遍历剩余的区间if (interval[i].r <= lastL) { // 如果和上一个选中的区间不相交lastL = interval[i].l; // 那么选中当前区间num++; // 并令选中的区间数量加1}}printf("%d", num); // 输出选中的区间数量return 0;
}
4.5二分法


#include <cstdio>
#include <algorithm>
using namespace std;
const int MAXN = 10000;
int binarySearch(int A[],int left,int right,int x)
{int mid;while(left<=right){mid=(left+right)/2;if(A[mid]==x)return mid;else if(A[mid]>x){right=mid-1;}else{left=mid+1;}}return -1;
}
int main() {int n=0,x=0;scanf("%d %d", &n,&x);int a[n];for (int i = 0; i < n; i++) { // 输入n个区间的左右端点scanf("%d", &a[i]);}printf("%d", binarySearch(a,0,n-1,x)); // 输出选中的区间数量return 0;
}



#include <cstdio>
#include <algorithm>
using namespace std;
const int MAXN = 10000;
int lower_bound(int A[],int left,int right,int x)
{int mid;while(left<right){mid=(left+right)/2;if(A[mid]>=x){right=mid;}else{left=mid+1;}}return left;
}
int main() {int n=0,x=0;scanf("%d %d", &n,&x);int a[n];for (int i = 0; i < n; i++) { // 输入n个区间的左右端点scanf("%d", &a[i]);}printf("%d", lower_bound(a,0,n,x)); // 输出选中的区间数量return 0;
}



#include <cstdio>
#include <algorithm>
using namespace std;
const int MAXN = 10000;
int upper_bound(int A[],int left,int right,int x)
{int mid;while(left<right){mid=(left+right)/2;if(A[mid]>x){right=mid;}else{left=mid+1;}}return left;
}
int main() {int n=0,x=0;scanf("%d %d", &n,&x);int a[n];for (int i = 0; i < n; i++) { // 输入n个区间的左右端点scanf("%d", &a[i]);}printf("%d", upper_bound(a,0,n,x)); // 输出选中的区间数量return 0;
}


#include <cstdio>const int MAXN = 100000;
int n, a[MAXN], target;int binarySearch() {int l = 0, r = n;while (l < r) {int mid = l + (r - l) / 2;if (a[mid] >= target) {r = mid;} else {l = mid + 1;}}if (l < n && a[l] == target) {return l;} else {return -1;}
}int main() {scanf("%d%d", &n, &target);for (int i = 0; i < n; i++) {scanf("%d", &a[i]);}printf("%d", binarySearch());return 0;
}


#include <cstdio>const int MAXN = 100000;
int n, a[MAXN], target;int binarySearch() {int l = 0, r = n;while (l < r) {int mid = l + (r - l) / 2;if (a[mid] > target) {r = mid;} else {l = mid + 1;}}if (l >0 && a[l-1] == target) {return l-1;} else {return -1;}
}int main() {scanf("%d%d", &n, &target);for (int i = 0; i < n; i++) {scanf("%d", &a[i]);}printf("%d", binarySearch());return 0;
}

#include <cstdio>
const int MAXN = 100000;
const double eps=1e-6;
double a;
double f(double x){return x*x*x+x*x+x-a;
}
double calSqrt(){double left=-100,right=100,mid;while(right-left>eps){mid=(left+right)/2;if(f(mid)>0){right=mid;}else{left=mid;}}return mid;
}int main() {scanf("%lf",&a);printf("%.2f",calSqrt());return 0;
}
4.6 two pointers


#include <cstdio>const int MAXN = 100000;
int n, k, a[MAXN];int twoSum() {int counter = 0;int i = 0, j = n - 1;while (i < j) {if (a[i] + a[j] == k) {counter++;i++;j--;} else if (a[i] + a[j] < k) {i++;} else {j--;}}return counter;
}int main() {scanf("%d%d", &n, &k);for (int i = 0; i < n; i++) {scanf("%d", &a[i]);}printf("%d", twoSum());return 0;
}

#include <cstdio>const int MAXN = 100000;
int n, a[MAXN];
int m, b[MAXN];
int merged[MAXN * 2];void merge() {int i = 0, j = 0, cnt = 0;while (i < n && j < m) {if (a[i] < b[j]) {merged[cnt++] = a[i++];} else {merged[cnt++] = b[j++];}}while (i < n) {merged[cnt++] = a[i++];}while (j < m) {merged[cnt++] = b[j++];}
}int main() {scanf("%d%d", &n, &m);for (int i = 0; i < n; i++) {scanf("%d", &a[i]);}for (int i = 0; i < m; i++) {scanf("%d", &b[i]);}merge();for (int i = 0; i < n + m; i++) {printf("%d", merged[i]);if (i < n + m - 1) {printf(" ");}}return 0;
}

#include <cstdio>const int MAXN = 1000;
int n, a[MAXN];
int merged[MAXN];void merge(int l1, int r1, int l2, int r2) {int i = l1, j = l2, cnt = 0;while (i <= r1 && j <= r2) {if (a[i] < a[j]) {merged[cnt++] = a[i++];} else {merged[cnt++] = a[j++];}}while (i <= r1) {merged[cnt++] = a[i++];}while (j <= r2) {merged[cnt++] = a[j++];}for (i = 0; i < cnt; i++) {a[l1 + i] = merged[i];}
}void mergeSort(int l, int r) {if (l < r) {int mid = (l + r) / 2;mergeSort(l, mid);mergeSort(mid + 1, r);merge(l, mid, mid + 1, r);}
}int main() {scanf("%d", &n);for (int i = 0; i < n; i++) {scanf("%d", &a[i]);}mergeSort(0, n - 1);for (int i = 0; i < n; i++) {printf("%d", a[i]);if (i < n - 1) {printf(" ");}}return 0;
}

#include <cstdio>const int MAXN = 1000;
int n, a[MAXN];
int mergedNums[MAXN];int partition(int l, int r) {int temp = a[l];while (l < r) {while (l < r && a[r] > temp) {r--;}a[l] = a[r];while (l < r && a[l] <= temp) {l++;}a[r] = a[l];}a[l] = temp;return l;
}void quickSort(int l, int r) {if (l < r) {int pos = partition(l, r);quickSort(l, pos - 1);quickSort(pos + 1, r);}
}int main() {scanf("%d", &n);for (int i = 0; i < n; i++) {scanf("%d", &a[i]);}quickSort(0, n - 1);for (int i = 0; i < n; i++) {printf("%d", a[i]);if (i < n - 1) {printf(" ");}}return 0;
}
4.7其他高效技巧与算法


#include <cstdio>int main() {int n, x, numZero = 0;scanf("%d", &n);long long result = 0;for (int i = 0; i < n; i++) {scanf("%d", &x);if (x == 1) {result += numZero;} else {numZero++;}}printf("%lld", result);return 0;
}

#include <cstdio>
const int MAXN = 100000;
int n,k,a[MAXN];
int mergedNums[MAXN];int partition(int l, int r) {int temp = a[l];while (l < r) {while (l < r && a[r] > temp) {r--;}a[l] = a[r];while (l < r && a[l] <= temp) {l++;}a[r] = a[l];}a[l] = temp;return l;
}void quickSort(int l, int r) {if (l < r) {int pos = partition(l, r);quickSort(l, pos - 1);quickSort(pos + 1, r);}
}
int main() {scanf("%d %d", &n,&k);for(int i=0;i<n;i++){scanf("%d",&a[i]);}quickSort(0, n - 1);for(int i=0;i<n;i++){if(i==k-1)printf("%d",a[i]);}return 0;
}
相关文章:
【算法笔记自学】入门篇(2)——算法初步
4.1排序 自己写的题解 #include <stdio.h> #include <stdlib.h>void selectSort(int A[], int n) {for(int i 0; i < n - 1; i) { // 修正索引范围int k i;for(int j i 1; j < n; j) { // 修正索引范围if(A[j] < A[k]) {k j;}}if (k ! i) { // 仅在…...
Redis基础教程(六):redis 哈希(Hash)
💝💝💝首先,欢迎各位来到我的博客,很高兴能够在这里和您见面!希望您在这里不仅可以有所收获,同时也能感受到一份轻松欢乐的氛围,祝你生活愉快! 💝Ὁ…...
鸿蒙开发设备管理:【@ohos.account.appAccount (应用帐号管理)】
应用帐号管理 说明: 本模块首批接口从API version 7开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。开发前请熟悉鸿蒙开发指导文档:gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md点击或者复制转到。 导入模…...
java项目自定义打印日志,打印请求方式,参数用时等
1.相关依赖 <!-- 私人工具包 --><dependency><groupId>cn.changeforyou</groupId><artifactId>location</artifactId><version>1.13-SNAPSHOT</version></dependency><!-- hutool工具依赖 --><dependency>…...
03:EDA的进阶使用
使用EDA设计一个38译码器电路和245放大电路 1、38译码器1.1、查看74HC138芯片数据1.2、电路设计 2、245放大电路2.1、查看数据手册2.2、设计电路 3、绘制PCB3.1、导入3.2、放置3.3、飞线3.4、特殊方式连接GND3.5、泪滴3.6、配置丝印和划分区域3.7、添加typc接口供电 1、38译码器…...
Linux/Unix系统指令:(tar压缩和解压)
tar 是一个在Linux和Unix系统中用于创建和处理归档文件的命令。 下面是tar命令的详细用法,包括它的所有常用选项和一些示例。 基本语法 tar [选项] [归档文件] [文件或目录]常用选项 基本操作 -c:创建一个新的归档文件(create)…...
MySQL 日期和时间函数知识点总结
引言 在数据库管理和开发中,日期查询是一项基础且频繁使用的功能。MySQL提供了丰富的日期和时间处理函数,使得我们能够灵活地进行日期查询和数据处理。本文将详细介绍MySQL中关于日期查询的几个重要知识点,并附上具体的案例。 1. MySQL的日…...
鸿蒙登录页面及页面跳转的设计
目录 任务目标任务分析任务实施1.新建工程项目HMLogin2.设计登录页面Index.visual3.设计第二个页面SecondPage4.修改Index.ets代码5.修改SecondPage.ets代码6.运行工程 任务目标 设计一个简单的登录页面,要求可以将第一页的登录信息,传递到第二个页面&a…...
【居家养老实训室】:看中医保健在养老中的应用
本文以居家养老实训室为视角,深入探讨了中医保健在养老中的应用。通过对中医保健理念、常用方法以及在居家养老中的具体实践进行分析,阐述了其在改善老年人健康状况、提高生活质量方面的重要作用。同时,也指出了目前应用中存在的问题…...
【区块链+基础设施】区块链服务网络 BSN | FISCO BCOS应用案例
BSN(Blockchain-based Service Network,区块链服务网络)是一个跨云服务、跨门户、跨底层框架,用于部 署和运行各类区块链应用的全球性基础设施网络,旨在为开发者提供低成本和技术互通的区块链一站式服务。 2019 年 12…...
六、快速启动框架:SpringBoot3实战-个人版
六、快速启动框架:SpringBoot3实战 文章目录 六、快速启动框架:SpringBoot3实战一、SpringBoot3介绍1.1 SpringBoot3简介1.2 系统要求1.3 快速入门1.4 入门总结回顾复习 二、SpringBoot3配置文件2.1 统一配置管理概述2.2 属性配置文件使用2.3 YAML配置文…...
SA 注册流程
目录 1. UE开机后按照3GPP TS 38.104定义的Synchronization Raster搜索特定频点 2.UE尝试检测PSS/SSS,取得下行时钟同步,并获取小区的PCI;如果失败则转步骤1搜索下一个频点;否则继续后续步骤; 3.解析Mib,…...
图像的灰度直方图
先来认识一下灰度直方图,灰度直方图是图像灰度级的函数,用来描述每个灰度级在图像矩阵中的像素个数或者占有率。接下来使用程序实现直方图: 首先导入所需的程序包: In [ ]: import cv2 import numpy as np import matplotlib…...
软件测试面试题:Redis的五种数据结构,以及使用的场景是什么?
字符串(Strings):简单直接,就像记事本一样,用来存储和快速访问简单的数据,比如缓存网页或者保存用户会话信息。 列表(Lists):有序的数据集合,适合用来存储按…...
Java后端每日面试题(day1)
目录 JavaWeb三大组件依赖注入的方式Autowire和Resurce有什么区别?Spring Boot的优点Spring IoC是什么?说说Spring Aop的优点Component和Bean的区别自定义注解时使用的RetentionPolicy枚举类有哪些值?如何理解Spring的SPI机制?Spr…...
AI与测试相辅相成
AI助力软件测试 1.AI赋能软件测试 使用AI工具来帮助测试人员提高测试效率,提供缺陷分析和缺陷预测。 语法格式 设定角色 具体指示 上下文格式 例: 角色:你是一个测试人员 内容:请帮我生成登录案例的测试用例 1.只有输入正确账号和密码才…...
搜索+动态规划
刷题刷题刷题刷题 Forgery - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 思路: 需要两个数组,一个数组全部初始化为".",另一个数组输入数据,每碰到一个“.”就进行染色操作,将其周围的…...
strcpy,srtcmp,strlen函数漏洞利用
strcpy,srtcmp,strlen函数漏洞利用 strcpy strcpy函数用于将字符串复制到另一个指针指向的空间中,遇到空字符 **b’x\00’**时停止,: 所以可以利用 strcpy不检查缓冲区 的漏洞(构造的字符串要以\0结尾),…...
SketchUp + Enscape+ HTC Focus3 VR
1. 硬件: 设备连接 2. 软件: 安装steam steamVR Vive Business streaming 3. 操作: 双方登录steam 账号,然后带上头盔,用手柄在HTC Focus3 安装 串流软件,选择串流软件,在Enscape中选择 VR 模式即可 4.最终效果: SketchUp Enscape HTC Focus 3 VR 实时预览_哔哩哔哩_bi…...
推荐3款Windows系统的神级软件,免费、轻量、绝对好用!
DiskView DiskView是一款用于管理和查看磁盘空间的工具,它集成了于微软的Windows操作系统资源管理器中,以显示直观的磁盘空间使用情况。该软件通过生成图形化地图,帮助用户组织和管理大量文件和文件夹,从而高效地管理磁盘空间。用…...
3.3.1_1 检错编码(奇偶校验码)
从这节课开始,我们会探讨数据链路层的差错控制功能,差错控制功能的主要目标是要发现并且解决一个帧内部的位错误,我们需要使用特殊的编码技术去发现帧内部的位错误,当我们发现位错误之后,通常来说有两种解决方案。第一…...
Go 语言接口详解
Go 语言接口详解 核心概念 接口定义 在 Go 语言中,接口是一种抽象类型,它定义了一组方法的集合: // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的: // 矩形结构体…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序
一、开发准备 环境搭建: 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 项目创建: File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...
渲染学进阶内容——模型
最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...
将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?
Otsu 是一种自动阈值化方法,用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理,能够自动确定一个阈值,将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...
第25节 Node.js 断言测试
Node.js的assert模块主要用于编写程序的单元测试时使用,通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试,通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...
CocosCreator 之 JavaScript/TypeScript和Java的相互交互
引擎版本: 3.8.1 语言: JavaScript/TypeScript、C、Java 环境:Window 参考:Java原生反射机制 您好,我是鹤九日! 回顾 在上篇文章中:CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...
从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
python执行测试用例,allure报乱码且未成功生成报告
allure执行测试用例时显示乱码:‘allure’ �����ڲ����ⲿ���Ҳ���ǿ�&am…...
