8月9日算法刷题【6道题】

news2024/12/27 12:05:32

8月9日算法刷题

  • 一、排序
    • 1. 成绩排序(清华大学考研机试题)
        • 考点:结构体排序
          • 在结构体中定义排序
          • 使用比较器定义排序
        • 注意问题:需要处理 值相等时 先后顺序
    • 2. 成绩排序2( 清华大学考研机试题 )
    • 1. 从尾到头打印链表
        • 本题考点
    • 2. 在O(1)时间删除链表结点
    • 3. 删除链表中重复的节点
        • 总结:删除节点的两种方法
          • 1. a-》b 直接让a的值等于b的值,a的next等于b的next
          • 2. a-》b-》c 让a的next指向c(只有修改next才管用)
        • java版本(画个草图就知道怎么做了 并且 java没有指针)
    • 4. 链表中倒数第k个节点
        • 遍历两次
        • 遍历一次(需要再开一个指针而已)但是本题不行,因为题目有长度限制,我们需要先知道链表长度

一、排序

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,记录出现的顺序

// package Test;

import java.lang.reflect.Array;
import java.util.Arrays;
import java.util.Scanner;

/**
 * @Author zh
 * @Date 2023/8/8 19:10
 * @PackageName:Test
 * @ClassName: Main
 * @Description: TODO
 * @Version 1.0
 */

class Student{
    int grade;
    String name;
    public Student(int grade,String name){
        this.grade = grade;
        this.name = name;
    }
}

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int N = scanner.nextInt();
        int a = scanner.nextInt();
        Student[] students = new Student[N];
        for(int i = 0; i < N; i++){
            String name = scanner.next();
            int grade = scanner.nextInt();
            students[i] = new Student(grade,name);
        }

         if(a == 1){
             Arrays.sort(students,(o1, o2) -> {
                 return o1.grade-o2.grade;
             });
         }else{
             Arrays.sort(students,(o1, o2) -> {
                 return o2.grade-o1.grade;
             });
         }

        for(Student x : students){
            System.out.println(x.name + " " + x.grade);
        }


    }
}

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;
}
import java.util.Arrays;
import java.util.Scanner;

class Student{
    int id;
    int grade;
    public Student(int id,int grade){
        this.id = id;
        this.grade = grade;
    }
}

class Main{
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        Student[] students = new Student[n];
        for(int i = 0; i < n; i++){
            int id = scanner.nextInt();
            int grade = scanner.nextInt();
            students[i] = new Student(id,grade);
        }
        Arrays.sort(students,(o1, o2) -> {
            if(o1.grade == o2.grade){
                return o1.id-o2.id;
            }
            return o1.grade-o2.grade;
        });
        for (Student x : students){
            System.out.println(x.id + " " + x.grade);
        }
    }
}

1. 从尾到头打印链表

原题链接
原题链接
在这里插入图片描述

本题考点

  1. 顺序打印链表的掌握(简单)
  2. 数组的翻转reverse
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
#include<algorithm>

class Solution {
public:
    vector<int> printListReversingly(ListNode* head) {
        vector<int> res;
        while (head) {
            res.push_back(head->val);
            head = head->next;
        }
        reverse(res.begin(),res.end());
        return res;
    }
};

/**
 * @author bingo
 * @since 2018/12/19
 */

/**
 * Definition for singly-linked list.
 * class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {

    /**
     * 从尾到头打印链表
     *
     * @param head 链表头结点
     * @return 结果数组
     */
    public int[] printListReversingly(ListNode head) {
        if (head == null) {
            return null;
        }
        Stack<Integer> stack = new Stack<>();
        ListNode cur = head;
        int cnt = 0;
        while (cur != null) {
            stack.push(cur.val);
            cur = cur.next;
            ++cnt;
        }

        int[] res = new int[cnt];
        int i = 0;
        while (!stack.isEmpty()) {
            res[i++] = stack.pop();
        }
        return res;
    }
}


2. 在O(1)时间删除链表结点

原题链接

在这里插入图片描述
所给的是要删除的节点

那么我们把要删除的节点的指等于下一个指
所指向的地址等于下一个所指向的地址

这样就把该节点删除了

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    void deleteNode(ListNode* node) {
        node->val = node->next->val;
        node->next = node->next->next;
    }
};
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public void deleteNode(ListNode node) {
        node.val = node.next.val;
        node.next = node.next.next;
    }
}

3. 删除链表中重复的节点

原题链接

在这里插入图片描述

本题需要注意:

  1. 增加一个空的头节点,便于删除第一个节点(如果要删除的话)
  2. 如何删除一串节点?必须找到先前一个节点,令先前的节点的next指向要删除一串的后面的那一个
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* deleteDuplication(ListNode* head) {
        auto dummy = new ListNode(-1); //建立虚拟头结点
        dummy->next = head;//虚拟头结点指向头结点
        auto p = dummy; 

        while(p->next) //p的下一个节点不为空
        {
            auto q = p->next; 
            //q的下一个节点不为空,且q的下一个节点的值等于p的下一个节点的值
            while(q->next && q->next->val == p->next->val) q= q->next;
            //如果q==p的下一个节点 p=q
            if(q==p->next) p=q;
            //如果不是说明存在重复元素,则p指向q的下一个节点即非重复节点
            else p->next = q->next;
        }

        return dummy->next;
    }
}

总结:删除节点的两种方法

1. a-》b 直接让a的值等于b的值,a的next等于b的next
2. a-》b-》c 让a的next指向c(只有修改next才管用)

java版本(画个草图就知道怎么做了 并且 java没有指针)

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode deleteDuplication(ListNode head) {
        if(head == null)
            return null;
        if(head.next == null)
            return head;
        ListNode l = null;
        ListNode l1 = head;
        ListNode l2 = head.next;
        
        while(l2!=null){
            if(l1.val != l2.val){
                l = l1;
                l1 = l2;
                l2 = l2.next;
            } else {
                while(l2 != null && l1.val == l2.val){
                    l2 = l2.next;
                }
                if(l2 == null){
                    if(l == null)
                        return null;
                    l.next = null;
                    break;
                } else {
                    if(l == null){
                        head = l2;
                        l1 = l2;
                        l2 = l2.next;
                        continue;
                    }
                    l.next = l2;
                    l1 = l2;
                    l2 = l2.next;
                }
            }
        }
        return head;
    }
}

4. 链表中倒数第k个节点

原题链接
在这里插入图片描述

遍历两次

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* findKthToTail(ListNode* head, int k) {
        int n = 0;
        for (auto p = head; p; p = p->next) n ++ ;
        if (n < k) return nullptr;
        auto p = head;
        for (int i = 0; i < n - k; i ++ ) p = p->next;
        return p;
    }
};

遍历一次(需要再开一个指针而已)但是本题不行,因为题目有长度限制,我们需要先知道链表长度

class Solution {
public:
    ListNode* findKthToTail(ListNode* p, int k) {
        auto *n = p;
        while (n && k) n = n -> next, -- k;
        if (k) return nullptr;
        while (n) p = p -> next, n = n -> next;
        return p;
    }
};
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode findKthToTail(ListNode pListHead, int k) {
        if (k == 0) return null;
        int len = cmpLen(pListHead);
        if (k > len) return null;
        int count = 0;
        ListNode cur = pListHead;
        while (count != (len - k)) {
            cur = cur.next;
            count++;
        }
        return cur;
    }

    private int cmpLen(ListNode pListHead) {
        ListNode cur = pListHead;
        int count = 0;
        while (cur != null) {
            count++;
            cur = cur.next;
        }
        return count;
    }
}

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

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

相关文章

hgdbdevelop弹窗无法使用

瀚高数据库 目录 环境 文档用途 详细信息 环境 系统平台&#xff1a;Microsoft Windows (64-bit) 10 版本&#xff1a;4.5 文档用途 解决双击exe程序出现弹窗&#xff0c;点击Disable Modules and Continue没反应 详细信息 1.打开管理工具exe程序&#xff0c;出现弹窗如下图&…

【运维小能手】交换机二层环路问题如何处理

1 网络业务故障&#xff0c;如何确认存在环路&#xff1f; 网络业务故障后&#xff0c;如发生二层环路&#xff0c;通常会存端口流量数据风暴和反复大量的MAC漂移现象。因此&#xff0c;在骨干链路所在的节点&#xff0c;通过如下三步操作&#xff1a; 图1&#xff1a;环…

向量检索在大模型应用场景的技术和实践

一、向量检索应用简介 向量是多维数学空间里的一个点&#xff0c;在各维度上的坐标的一串数字。这个点就是来源于真实世界的物体进行数字化之后在数学空间的投影。那么不同点之间有一个数学关系&#xff0c;就是距离&#xff0c;距离远近就代表两个物体的相似程度。 非结构化数…

Semantic and Syntactic Enhanced Aspect Sentiment Triplet Extraction

创新点 图-序列双重表示: 通过将句子中的语义和句法关系表示为图&#xff0c;并使用图神经网络&#xff08;GNNs&#xff09;进行编码&#xff0c;同时保留原始句子的顺序信息&#xff0c;S3E2能够更精确地捕捉三元组元素之间的复杂关系。许多传统方法可能只依赖于线性或浅层表…

分支和循环语句(1)(C语言)

目录 什么是语句&#xff1f; 分支语句&#xff08;选择结构&#xff09; if语句 悬空else if书写形式的对比 switch语句 在switch语句中的 break default子句 循环语句 while循环 while语句中的break和continue for循环 语法 break和continue在for循环中 for语句和…

vue3 vite gzip

1、首先前端项目里安装 vite-plugin-compression 插件 yarn add vite-plugin-compression 2、在 vite.config.js 中 import vue from vitejs/plugin-vue import { defineConfig } from vite import compressPlugin from vite-plugin-compressionexport default defineConf…

【TI毫米波雷达笔记】sdk传参时的type避坑

【TI毫米波雷达笔记】sdk传参时的type避坑 这个函数要传一个结构体进去 然后结构体里面有个adcoutcfg结构体变量 adcoutcfg结构体里面共有三个变量 一个adcbitformat结构体 另外两保留 点开adcbitformat结构体发现是个32位段 一共四级结构体 那么请问 为什么adcoutcfg变量不直…

管理类联考——逻辑——论证逻辑——汇总篇——真题和典例——支持

支持 没有特点的 199-2017-1-30——支持论点 离家300米的学校不能上&#xff0c;却被安排到2千米外的学校就读&#xff0c;某市一位适龄儿童在上小学时就遭遇了所在区教育局这样的安排&#xff0c;而这一安排是区教育局根据儿童户籍所在施教区做出的。根据该市教育局规定的“…

科技前沿:一文带你读懂“星闪点亮万物互联”

目录 一、星闪简介 二、星闪技术的模式 三、星闪技术六大优势 四、应用场景 智能汽车 智能工业 智能穿戴 智能家居 智能终端 一、星闪简介 星闪NearLink是由中国信通院牵头发起的星闪联盟&#xff08;NearLink Alliance&#xff09;推出的一种新一代近距离无线连接技…

什么是DNS欺骗及如何进行DNS欺骗

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、什么是 DNS 欺骗&#xff1f;二、开始1.配置2.Ettercap启动3.操作 总结 前言 我已经离开了一段时间&#xff0c;我现在回来了&#xff0c;我终于在做一个教…

Spring Boot集成Mybatis Plus通过Pagehelper实现分页查询

文章目录 0 简要说明Pagehelper1 搭建环境1.1 项目目录1.2 项目搭建需要的依赖1.3 配置分页插件拦截器1.4 源代码启动类实体类数据层xml映射文件业务层业务层实现类控制层接口配置swagger请求体 2 可能出现的疑问或者问题2.1 关于total属性疑问2.2 分页不生效问题 3 案例说明3.…

【高危】 Zoom Desktop Client for Windows <5.14.5 权限升级漏洞

漏洞描述 Zoom 是一种用于视频会议、在线会议和远程协作的软件平台。 Zoom Desktop Client for Windows 5.14.5 之前版本由于对数据的真实性验证不足&#xff0c;经过身份验证的攻击者可通过网络访将权限升级为 SYSTEM 用户。 漏洞名称Zoom Desktop Client for Windows <…

IDEA如何调试Stream API

Stream API现在在实际开发中应用非常广泛&#xff0c;经常会遇到需要调试Stream API的场景&#xff0c;这篇文章主要讲解如何使用IDEA调试Stream Testpublic void test(){Stream.of(10, 20, 30, 40, 50).mapToInt(e->e*10).filter(e->e>200).forEach(System.out::pri…

docker基本使用方法

docker使用 1. Docker 介绍 Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中&#xff0c;然后发布到任何流行的 Linux 机器上&#xff0c;也可以实现虚拟化。Docker 使您能够将应用程序与基础架构分开&#xff0c;从而可以快速交付软件。通过利用 …

Blockchain投资:是否是实现财务自由的捷径?

随着Blockchain技术的不断发展和应用&#xff0c;越来越多的人开始探索Blockchain投资的机会。Blockchain作为一种分布式记账技术&#xff0c;以其去中心化、透明性和安全性等特点&#xff0c;吸引了众多投资者的关注。但是&#xff0c;Blockchain投资是否真的可以成为实现财务…

unity 修改默认脚本

using System.Collections; using System.Collections.Generic; using UnityEngine; //***************************************** //创建人&#xff1a; xxxx //功能说明&#xff1a; //***************************************** #ROOTNAMESPACEBEGIN# public class #SCRI…

0基础学习VR全景平台篇 第82篇:智慧眼-角色是什么?如何运用呢?

一、功能说明 角色是指城市运营工作开展时所需要设定的成员职称或者人物定位&#xff0c;如管理员、督察员、镇街主管、镇接干事、网格员等等。 后台编辑界面 点击【新增】&#xff0c;填写角色的名称&#xff0c;若有上级&#xff0c;还需选择对应的父级角色。如管理员为最…

Python(七十五)集合的生成式

❤️ 专栏简介&#xff1a;本专栏记录了我个人从零开始学习Python编程的过程。在这个专栏中&#xff0c;我将分享我在学习Python的过程中的学习笔记、学习路线以及各个知识点。 ☀️ 专栏适用人群 &#xff1a;本专栏适用于希望学习Python编程的初学者和有一定编程基础的人。无…

山东布谷科技直播软件源码探索高效、稳定直播传输的技术介绍:流媒体传输技术

今天我们探索的是让直播软件源码平台在直播时能够高效、稳定的进行直播传输的技术&#xff0c;而这个技术就是直播软件源码平台的流媒体传输技术&#xff0c;在直播软件源码平台中&#xff0c;流媒体传输技术会将直播的图像、视频、音频等相关的流媒体信号通过网络传递到用户的…

SQL-每日一题【1251. 平均售价】

题目 Table: Prices Table: UnitsSold 编写SQL查询以查找每种产品的平均售价。average_price 应该四舍五入到小数点后两位。 查询结果格式如下例所示&#xff1a; 解题思路 1.题目要求查询每种产品的平均售价。给出了两个表&#xff0c;我们用聚合查询来解决此问题。 2.首先我…