【复习1-2天的内容】【我们一起60天准备考研算法面试(大全)-第六天 6/60】

news2024/11/15 16:43:05

专注 效率 记忆
预习 笔记 复习 做题

欢迎观看我的博客,如有问题交流,欢迎评论区留言,一定尽快回复!(大家可以去看我的专栏,是所有文章的目录)
 
文章字体风格:
红色文字表示:重难点★✔
蓝色文字表示:思路以及想法★✔
 
如果大家觉得有帮助的话,感谢大家帮忙
点赞!收藏!转发!

本博客带大家一起学习,我们不图快,只求稳扎稳打。
由于我高三是在家自学的,经验教训告诉我,学习一定要长期积累,并且复习,所以我推出此系列。
只求每天坚持40分钟,一周学5天,复习2天
也就是一周学10道题
60天后我们就可以学完81道题,相信60天后,我们一定可以有扎实的代码基础!我们每天就40分钟,和我一起坚持下去吧!
qq群:878080619

第六天【考研408-数据结构(笔试)】

  • 一、排序
    • 1. 成绩排序(清华大学考研机试题)
        • 考点:结构体排序
          • 在结构体中定义排序
          • 使用比较器定义排序
        • 注意问题:需要处理 值相等时 先后顺序
    • 2. 成绩排序2( 清华大学考研机试题 )
  • 二、进位制
    • 1. 进制转换(清华大学考研机试题)
        • 本题考点
          • 1. 大数除法
          • 2. 十进制转二进制 步骤
    • 2. 进制转换2(清华大学考研机试题)
        • 考点:M进制转N进制
          • 和10进制转2进制 不一样的就是:短除时的 进位一个是10,而另一个是a仅此而已
  • 三、链表
    • 1. 两个链表的第一个公共结点
    • 2. 筛选链表( 2015年全国硕士研究生招生考试 )
        • 考点:删除节点
          • 需要两个指针,一个前一个后删除(所以比较的时候,比较p->next->val比较好)
    • 3. 重排链表( 2019年全国硕士研究生招生考试 )
        • 考点:1. 链表反转;2. 链表合并
  • 四、日期问题
    • 1. 日期累加( 北京理工大学考研机试题 )
    • 2. 打印日期( 华中科技大学考研机试题 )

一、排序

1. 成绩排序(清华大学考研机试题)

在这里插入图片描述

考点:结构体排序

在结构体中定义排序
#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 1010;

int n, m;
struct Person
{
    string name;
    int score;
    int id;

    bool operator< (const Person& t) const
    {
        if (score != t.score) return score < t.score;
        return id < t.id;
    }
    bool operator> (const Person& t) const
    {
        if (score != t.score) return score > t.score;
        return id < t.id;
    }
}q[N];

int main()
{
    cin >> n >> m;
    for (int i = 0; i < n; i ++ )
    {
        cin >> q[i].name >> q[i].score;
        q[i].id = i;
    }

    if (!m) sort(q, q + n, greater<Person>());
    else sort(q, q + n);

    for (int i = 0; i < n; i ++ )
        cout << q[i].name << ' ' << q[i].score << endl;
    return 0;
}
使用比较器定义排序
#include<bits/stdc++.h>
using namespace std;
struct node{
    int x,id;
    string name;
}a[1001];
bool cmp1(node a,node b){
//从小到大
    if(a.x==b.x)return a.id<b.id;
    return a.x<b.x;
}
bool cmp2(node a,node b){
//从大到小
    if(a.x==b.x)return a.id<b.id;
    return a.x>b.x;
}
int main()
{
    int n;
    bool ok;
    cin>>n>>ok;
    for(int i=1;i<=n;i++){
        cin>>a[i].name>>a[i].x;
        a[i].id=i;
    }
    if(ok)sort(a+1,a+1+n,cmp1);
    if(!ok)sort(a+1,a+1+n,cmp2);
    for(int i=1;i<=n;i++)
        cout<<a[i].name<<' '<<a[i].x<<'\n';
}

注意问题:需要处理 值相等时 先后顺序

在结构体中定义一个id,记录出现的顺序

2. 成绩排序2( 清华大学考研机试题 )

在这里插入图片描述

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 110;

int n;
struct Person
{
    int id;
    int score;
    bool operator< (const Person& t) const
    {
        if (score != t.score) return score < t.score;
        return id < t.id;
    }
}q[N];

int main()
{
    cin >> n;
    for (int i = 0; i < n; i ++ ) cin >> q[i].id >> q[i].score;
    sort(q, q + n);

    for (int i = 0; i < n; i ++ ) cout << q[i].id << ' ' << q[i].score << endl;
    return 0;
}

二、进位制

1. 进制转换(清华大学考研机试题)

在这里插入图片描述

本题考点

1. 大数除法

可以csdn搜索一下

关键就是vector的使用 和 除法步骤记得就好

就好比用 代码模拟出 草稿纸上的除法运算

2. 十进制转二进制 步骤

在这里插入图片描述

代码看不懂可以,只需明白逻辑,然后自己写即可

一定自己写出来,才明白

#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>

using namespace std;

void div(vector<int>& tmp,vector<int>& ans)
{
    vector<int> tmp2;
    int t = 0;
    for(int i = 0; i < tmp.size(); i++)
    {
        t = t*10 + tmp[i];
        tmp2.push_back(t/2);
        t = t%2;
    }
    ans.push_back(t);
    reverse(tmp2.begin(),tmp2.end());
    while(tmp2.size()!=1 && tmp2.back()==0)
    {
        tmp2.pop_back();
    }
    reverse(tmp2.begin(),tmp2.end());
    tmp = tmp2;
}

int main()
{
    string s;
    while(cin >> s)
    {
        vector<int> tmp;
        
        for(int i = 0; i < s.size(); i++)
        {
            tmp.push_back(s[i]-'0');
        }
        
        vector<int> ans;    
        //什么时候停止
        if(s=="0")
        {
            cout << 0 << endl;
        }
        else
        {
            while(tmp.size()>1 || (tmp.size() == 1 && tmp.back() != 0))
            {
                div(tmp,ans);
            }
            reverse(ans.begin(),ans.end());
            for(int i = 0; i < ans.size(); i++)
            {
                cout << ans[i];
            }
            cout << endl;
        }
    }
    return 0;
}

2. 进制转换2(清华大学考研机试题)

在这里插入图片描述

考点:M进制转N进制

和10进制转2进制 不一样的就是:短除时的 进位一个是10,而另一个是a仅此而已
#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>

using namespace std;

int main()
{
    int a, b;
    string s;
    cin >> a >> b >> s;
    vector<int> A;
    for (int i = 0; i < s.size(); i ++ )
    {
        char c = s[s.size() - 1 - i];
        if (c >= 'A') A.push_back(c - 'A' + 10);
        else A.push_back(c - '0');
    }
    string res;
    if (s == "0") res = "0";
    else
    {
        while (A.size())
        {
            int r = 0;
            for (int i = A.size() - 1; i >= 0; i -- )
            {
                A[i] += r * a;
                r = A[i] % b;
                A[i] /= b;
            }
            while (A.size() && A.back() == 0) A.pop_back();
            if (r < 10) res += to_string(r);
            else res += r - 10 + 'a';
        }
        reverse(res.begin(), res.end());
    }
    cout << res << endl;

    return 0;
}

三、链表

1. 两个链表的第一个公共结点

在这里插入图片描述
在这里插入图片描述

//cpp
class Solution {
public:
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
        ListNode *p1 = headA;
        ListNode *p2 = headB;

        while (p1 != p2) {
            if(p1 != NULL)//p1没有走到结尾
                p1 = p1->next;//p1指向下一个节点
            else//p1走到结尾
                p1 = headB;//p1指向另一个链表头
            if(p2 != NULL)//p2没有走到结尾
                p2 = p2->next;//p2指向下一个节点
            else  //p2走到结尾 
                p2 = headA;//p2指向另一个链表头
        }
        return p1;
    }
};

2. 筛选链表( 2015年全国硕士研究生招生考试 )

考点:删除节点

需要两个指针,一个前一个后删除(所以比较的时候,比较p->next->val比较好)
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* filterList(ListNode* head) {
        bool st[10001] = {};
        st[abs(head->val)] = true;
        for (auto p = head; p->next;) {
            int x = abs(p->next->val);
            if (st[x]) {
                auto q = p->next;
                p->next = q->next;
                delete q;
            } else {
                p = p->next;
                st[x] = true;
            }
        }
        return head;
    }
};

3. 重排链表( 2019年全国硕士研究生招生考试 )

在这里插入图片描述

考点:1. 链表反转;2. 链表合并

在这里插入图片描述

class Solution {
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
public:
    void rearrangedList(ListNode* head) {
        // 若只有一个元素,则不需要操作
        if (!head->next) {
            return;
        }
        // 计算链表长度
        int len = 0;
        for (auto p = head; p; p = p->next) {
            len++;
        }
        // 移动到链表中间处
        int mid = (len + 1) / 2;
        auto a = head;
        for (int i = 0; i < mid - 1; i++) {
            // 由于该链表没有设头结点,head 就是具有值的结点,因此到 mid - 1
            a = a->next;
        }

        // 反转后半段链表,b在前,c在后
        auto b = a->next, c = b->next;
        // a->next 是为了从中间将链表截断;b->next 是因为此时的 b 是反转后链表的结尾元素
        a->next = b->next = NULL;
        while (c) {
            auto temp = c->next;
            c->next = b;
            b = c;
            c = temp;
        }

        // 合并链表,注意此时 b 指向反转链表头部,c 指向 NULL
        for (auto p = head, q = b; q;) {
            auto qq = q->next;
            // 插入结点
            q->next = p->next;
            p->next = q;
            // 移动p和q
            p = q->next;
            q = qq;            
        }
    }
};

四、日期问题

1. 日期累加( 北京理工大学考研机试题 )

在这里插入图片描述

#include <bits/stdc++.h>
using namespace std;

//平年每月的天数
const int months[] = {
  0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
};

//判断是否是闰年
bool is_leap(int y)
{
    if(y % 400 == 0 || (y % 100 && y % 4 == 0)) return true;
    return false;
}

//获得y年第m月的天数
int get_days(int y, int m)
{
    if(m == 2) return months[m] + is_leap(y);
    return months[m];
}

//获得y年第m月--y + 1年第m月的的天数
int get_year_days(int y, int m)
{
    if(m <= 2) return (365 + is_leap(y));
    return (365 + is_leap(y + 1));
}

int main()
{
    int t;
    cin >> t;

    int y, m, d, days;

    while(t -- )
    {
        cin >> y >> m >> d >> days;

        if(m == 2 && d == 29)
        {
            days --;
            m = 3, d = 1;
        }

        while(days > get_year_days(y, m))
        {
            days -= get_year_days(y, m);
            y ++;
        }

        while(days --)
        {
            d ++;
            if(d > get_days(y, m))
            {
                m ++, d = 1;
                if(m > 12) y ++, m = 1;
            }
        }
        printf("%04d-%02d-%02d\n", y, m, d);

    }
    return 0;
}

2. 打印日期( 华中科技大学考研机试题 )

在这里插入图片描述

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int months[13] = {
    0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
};

int is_leap(int year)  // 闰年返回1,平年返回0
{
    if (year % 4 == 0 && year % 100 || year % 400 == 0)
        return 1;
    return 0;
}

int get_days(int y, int m)  // y年m月有多少天
{
    if (m == 2) return months[m] + is_leap(y);
    return months[m];
}

int main()
{
    int y, s;

    while (cin >> y >> s)
    {
        int m = 1, d = 1;
        s -- ;
        while (s -- )
        {
            if ( ++ d > get_days(y, m))
            {
                d = 1;
                if ( ++ m > 12)
                {
                    m = 1;
                    y ++ ;
                }
            }
        }
        printf("%04d-%02d-%02d\n", y, m, d);
    }
    return 0;
}

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

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

相关文章

网络编程---day4

广播发送方&#xff1a; 广播接收方&#xff1a; 组播发射方&#xff1a; 组播接收方&#xff1a;

OpenCV的remap实现图像垂直翻转

以下是完整的代码: #include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <iostream>int main() {

从“存算一体”到“存算分离”:金融核心数据库改造的必经之路

科技云报道原创。 近年来&#xff0c;数据库国产化趋势愈发明显&#xff0c;上百家金融业试点单位在数据库国产化的进程中&#xff0c;进一步增强信心&#xff0c;向50%国产化率大步迈进。 但随着数据库国产化的深入&#xff0c;一些金融机构采用国产数据库服务器本地盘的“存…

【微信小程序创作之路】- 小程序中WXML、JS、JSON、WXSS作用

【微信小程序创作之路】- 小程序中WXML、JS、JSON、WXSS作用 第三章 微信小程序WXML、JS、JSON、WXSS作用 文章目录 【微信小程序创作之路】- 小程序中WXML、JS、JSON、WXSS作用前言一、WXML是什么&#xff1f;二、JS是什么&#xff1f;三、JSON是什么&#xff1f;四、WXSS是什…

IPC 进程间通讯 (1)

目录 1.1 为什么要通信 1.2 为什么能通信 2.1 进程间通信机制的结构 2.2 进程间通信机制的类型 2.3 进程间通信机制的接口设计 3.1 SysV共享内存 3.2 POSIX共享内存 3.3 共享内存映射 3.4 Android ION 3.5 dma-buf heaps 3.6 匿名管道 3.7 命名管道 3.8 SysV消息队列…

基于Java实验室考勤管理系统设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

buuctf pwn入门1

目录 1. test_your_nc(简单nc ) pwn做题过程 2. rip(简单栈溢出) 3. warmup_csaw_2016(栈溢出 覆盖Return_Address) 4. ciscn_2019_n_1(栈溢出 浮点数十六进制) (1) 覆盖v2值 (2) 利用system("cat /flag"); 5. pwn1_sctf_2016(字符逃逸栈溢出 32位) 6. jarvis…

实现【Linux--NTP 时间同步服务搭建】

实现【Linux--NTP 时间同步服务搭建】 &#x1f53b; 前言&#x1f53b; 一、NTP 校时&#x1f530; 1.1 NTP 服务校时与 ntpdate 校时的区别&#x1f530; 1.2 NTP 校时服务搭建&#x1f530; 1.2.1 确认 ntp 的安装&#x1f530; 1.2.2 配置 ntp 服务&#x1f530; 1.2.3 启动…

QTday1

#include "widget.h"Widget::Widget(QWidget *parent): QWidget(parent) {this->resize(500,600);this->setFixedSize(500,600);//设置窗口标题this->setWindowTitle("盗版qq");//设置窗口图标this->setWindowIcon(QIcon("D://QQ下载//ic…

【C++STL】list的反向迭代器

list的反向迭代器 文章目录 list的反向迭代器reverse.h疑问1&#xff1a;为什么在迭代器当中不需要写深拷贝、析构函数疑问2&#xff1a;为什么在迭代器当中需要三个模板参数&#xff1f;疑问3&#xff1a;反向迭代器是怎么实现的&#xff1f;疑问4&#xff1a;为什么*解引用不…

LCD_1602 显示单个字符

目录 效果图&#xff1a;​ 硬件接线&#xff1a; 源代码&#xff1a; Lcd1602.c lcd1602.h main.c 硬件&#xff1a;lcd1602 51单片机 串口 软件&#xff1a;stc keil 效果图&#xff1a; 硬件接线&#xff1a; LCD1602 RW RS E 分别接51单片机的P25 P26 P27 LCD1602…

决策树分析特征重要性可视化无监督特征筛选

from sklearn.tree import DecisionTreeClassifierdtc DecisionTreeClassifier() # 初始化 dtc.fit(x_train, y_train) # 训练# 获取特征权重值 weights dtc.feature_importances_ print(>>>特征权重值\n, weights)# 索引降序排列 sort_index np.argsort(weights…

【学习】ChatGPT对问答社区产生了哪些影响?

引用 StackExchange 社区 CEO Prashanth Chandrasekar 的一篇博客标题 “Community is the future of AI”&#xff0c;引出本文的观点&#xff0c;即ChatGPT对问答社区产生了颠覆性影响&#xff0c;问答社区必须釜底抽薪、涅槃重生&#xff0c;但我们必须坚信“社区才是AI的未…

慎用QGraphicsDropShadowEffect绘制阴影,会导致部分控件一直resizeEvent、重新绘制

我的程序还在创作中&#xff0c;代码还只是UI部分&#xff0c;数据都是固定的&#xff0c;也没有定时刷新之类代码&#xff0c;样式也只是使用了一小部分。有一天我发现我在QTableWidget添加自定义控件的时候&#xff0c;效应特别慢&#xff0c;而自定义控件只是在鼠标进入或离…

活动策划大揭秘:如何制定执行方案

对于刚转行做活动策划的小白&#xff0c;我对你的建议&#xff0c;就是两个字“借鉴”&#xff01; 小白要写出一份优秀的活动策划与执行方案&#xff0c;“借鉴”其实是唯一的方式。 而且而且越资深&#xff0c;借鉴的越多。 当我是小白的时候&#xff0c;我做一个案子只看…

vue3模型代码

效果&#xff1a; 代码 <template><div class"json_box"><json-viewer :value"jsonData" :boxed"false" :expand-depth"5" :expanded"true" ></json-viewer></div> </template><sc…

哈利波特!AI动画已经这么稳定了?MJ控制角色统一性5种技巧;百度大模型Prompt开发与应用新课上线;SD进阶万字长文 | ShowMeAI日报

&#x1f440;日报&周刊合集 | &#x1f3a1;生产力工具与行业应用大全 | &#x1f9e1; 点赞关注评论拜托啦&#xff01; &#x1f916; 哈利波特动画视频&#xff0c;使用 TemporalNet 制作 img2img 动画 这是 Reddit 论坛小伙伴分享的自制动画&#xff0c;内容选自哈利波…

Apikit 自学日记:添加测试步骤-脚本步骤

脚本步骤 在流程测试用例界面&#xff0c;进入用例管理&#xff0c;点击 添加脚本[Javascript] 按钮&#xff1a; 进入编辑用例页面&#xff0c;点击 新API测试 新建一个 API 请求。 API 自动化测试平台为代码模式的测试用例设计了一套简单的API信息模板&#xff0c;因此只需要…

d3dx9_33.dll丢失怎么解决

d3dx9_33.dll的作用 在讨论如何修复d3dx9_33.dll丢失错误之前&#xff0c;我们首先需要了解d3dx9_33.dll的作用。d3dx9_33.dll是DirectX 9的一个核心文件&#xff0c;它是DirectX库的一部分&#xff0c;用于提供图形和多媒体功能支持。DirectX是由Microsoft开发的一组多媒体技…

java项目根据启动位置指定 log4j2日志输出到指定目录

痛点 我们在开发的 java 项目一般都会记录日志&#xff0c;日志输出位置通常使用相对路径记录到当前启动 jar 包的同一个父文件夹下面。 当我们使用像 jsch、ssh 这种远程启动 java 程序的时候会出现一个问题&#xff1a; 日志会输出到当前登录用户的目录下面&#xff08;如…