【算法笔记自学】入门篇(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.h
    return 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.h
    return 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.h
    return 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.h
    return 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.h
    return 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.h
    return 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++;                   // 最大箱子数量加1
            sum += 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;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

取证与数据恢复:冷系统分析,实时系统分析与镜像分析之间的过渡办法

天津鸿萌科贸发展有限公司是 ElcomSoft 系列取证软件的授权代理商。 ElcomSoft 系列取证软件 ElcomSoft 系列取证软件支持从计算机和移动设备进行数据提取、解锁文档、解密压缩文件、破解加密容器、查看和分析证据。 计算机和手机取证的完整集合硬件加速解密最多支持10,000计…

面向对象案例:电影院

TOC 思路 代码 结构 具体代码 Movie.java public class Movie {//一共七个private int id;private String name;private double price;private double score;private String director;private String actors;private String info;//get和setpublic int getId() {return id;…

2024年【湖北省安全员-C证】考试资料及湖北省安全员-C证考试试卷

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 湖北省安全员-C证考试资料是安全生产模拟考试一点通生成的&#xff0c;湖北省安全员-C证证模拟考试题库是根据湖北省安全员-C证最新版教材汇编出湖北省安全员-C证仿真模拟考试。2024年【湖北省安全员-C证】考试资料及…

解决@Autowired 注入service 到 static接口方法的问题

1 对类进行 Component 定义 2 定义service及 static service Component public class OperationalJudgment {private static MemberService memberService;Resourceprivate MemberService service;PostConstructpublic void init() {memberServicethis.service;}3 static方法中…

PTrade常见问题系列3

量化允许同时运行回测和交易的策略个数配置。 量化允许同时运行回测和交易的策略个数在哪里查看&#xff1f; 在量化服务器/home/fly/config/custom_config_conf文件中&#xff0c;其中运行回测的策略个数由backtest_switch&#xff08;是否限制普通回测个数&#xff09;及ba…

AutoCAD 2022 for Mac/Win版 安装包下载

AutoCAD 2022 是由 Autodesk 开发的一款计算机辅助设计&#xff08;CAD&#xff09;软件。它广泛应用于工程、建筑、制造、动画和媒体娱乐等多个领域。 系统要求&#xff1a; 操作系统&#xff1a;Windows 10 或更高版本。 处理器&#xff1a;Intel 或 AMD 处理器&#xff0c…

算法库应用--寻找最长麦穗

学习贺利坚老师算法库 数据结构例程——串的顺序存储应用_使用顺序串存储身份证号-CSDN博客 本人详细解析博客 串的顺序存储的应用实例二_串的顺序存储应用-CSDN博客 版本更新日志 V1.0: 在原有的基础上, 进行优化名字, 并且有了相应的算法库作为支撑, 我使用了for循环来代替老…

第N7周:seq2seq翻译实战-pytorch复现-小白版

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 理论基础 seq2seq&#xff08;Sequence-to-Sequence&#xff09;模型是一种用于机器翻译、文本摘要等序列转换任务的框架。它由两个主要的递归神经网络&#…

HTML【详解】超链接 a 标签的四大功能(页面跳转、页内滚动【锚点】、页面刷新、文件下载)

超链接 a 标签主要有以下功能&#xff1a; 跳转到其他页面 <a href"https://www.baidu.com/" target"_blank" >百度</a>href&#xff1a;目标页面的 url 地址或同网站的其他页面地址&#xff0c;如 detail.htmltarget&#xff1a;打开目标页面…

全面助力巴西slot游戏包推广本土网盟dsp流量广告优势

全面助力巴西slot游戏包推广本土网盟dsp流量广告优势 在巴西这片充满活力的土地上&#xff0c;电子游戏市场蓬勃发展&#xff0c;成为娱乐产业的重要组成部分。随着网络技术的不断进步和移动互联网的普及&#xff0c;巴西玩家对于电子游戏的热情愈发高涨&#xff0c;游戏市场呈…

Streaming local LLM with FastAPI, Llama.cpp and Langchain

题意&#xff1a; 使用FastAPI、Llama.cpp和Langchain流式传输本地大型语言模型 问题背景&#xff1a; I have setup FastAPI with Llama.cpp and Langchain. Now I want to enable streaming in the FastAPI responses. Streaming works with Llama.cpp in my terminal, but…

google 邮件信息收集

主要介绍通过google和fofax对目标进行邮件信息收集 chrome插件 email-whatsapp-extractor link-klipper-extract-all bulk-url-opener-extension email-whatsapp-extractor 使用正则表达式&#xff0c;获取访问页面内所有的email邮箱和whatsapp号码&#xff0c;以表格的形式导…

C电池 和 D 电池的作用和类型详解及其之间的区别

C 和 D 电池是我们日常生活中必不可少的部件。它们通常用于高功率设备。例如手电筒和玩具。 D 型电池和 C 型电池是两种常见的电池类型。它们是一次性圆柱形电池。您可以在很多设备上使用它们。虽然它们有很多相似之处&#xff0c;但它们也有不同的特点。这些特点使它们适合某…

设置和取消Excel“打开密码”的3种方法

在日常工作中&#xff0c;Excel文件中常常包含敏感数据。为了防止未经授权的访问&#xff0c;给Excel文件设置打开密码是一个非常有效的方法。下面分享3种设置Excel打开密码的方法&#xff0c;以及如何取消这些密码。 先来看看设置Excel打开密码的3种方法。 方法一&#xff1…

CSRF漏洞攻击

05-CSRF 1 CSRF概述 1.1 概述 CSRF (Cross-Site Request Forgery) 跨站请求伪造&#xff0c;也可称为一键式攻击 (one-click-attack)&#xff0c;通常缩写为 CSRF 或者 XSRF。 CSRF 攻击是一种挟持用户在当前已登录的浏览器上发送恶意请求的攻击方法。相对于XSS利用用户对指…

对FPGA开发流程系统的学习

FPGA 开发流程&#xff1a; HDL&#xff08;Hardware Design Language&#xff09;和原理图是两种最常用的数字硬件电路描述方法&#xff0c;HDL 设计法具有更好的可移植性、通用性和模块划分与重用性的特点&#xff0c;在目前的工程设计中被广泛使用。所以&#xff0c;我们在…

JDK新特性之协程

在 JVM 中&#xff0c;java 线程直接映射内核线程&#xff0c;因此 java 线程的创建、销毁和调度都要依赖内核态的操作&#xff08;系统调用&#xff09;。而协程是真正的用户线程&#xff0c;如上图所示很多的协程可以映射很少的几个内核线程&#xff0c;并且协程的创建、销毁…

【kubectl详解】最全的kubectl命令用法

文章目录 简介一.命令帮助翻译1.1.基本命令&#xff08;初学者&#xff09;&#xff1a;1.2.基本命令&#xff08;中级&#xff09;&#xff1a;1.3.部署命令&#xff1a;1.4.群集管理命令&#xff1a;1.5.疑难解答和调试命令&#xff1a;1.6.高级命令&#xff1a;1.7.设置命令…

腾讯混元文生图开源模型推出小显存版本,仅需 6G 显存即可运行

腾讯宣布开源小显存版本的混元文生图模型&#xff0c;降低至 6G 显存即可运行&#xff0c;方便个人电脑本地部署。同时&#xff0c;混元 DiT 模型升级至 1.2 版本&#xff0c;图片质感与构图提升。混元 Captioner 打标模型也正式开源&#xff0c;支持中英文双语&#xff0c;优化…

linux ifconfig未找到命令

linux ifconfig未找到命令 1、使用yum安装net-tools yum install net-toolsyum报未找到命令请查看文章vim未找到命令&#xff0c;且yum install vim安装vim失败 2、安装后使用ifconfig命令 ifconfig