题目链接:https://pintia.cn/problem-sets/994805046380707840/problems/994805072641245184;

废话:今天忙着学习新知识了,没怎么顾得上做题,所以说抽出晚上两个小时做做题,白天学新知识;

不得不说的是,dijkstra+priority_queue+spfa优化真的难学,我现在还停留在思想阶段,但是已经可以理解了基本的思想;

但是,堆还没有学,真的好难理解啊

这道题还是蛮有意思的;

首先,题目是“链表去重”,但又不是完全的链表去重,(小声bb,不会真有孩子手写去重链表吧???好难的)

其实,这道题根据题目模拟就可以了,对,没错,又是模拟,但是

这次加入了新的模拟构成--hash,也就是哈希查找,这里简单介绍一下哈希

哈希,又称散列表,是记录的储存位置和关键字之间建立一个确定的函数关系,使得每一个关键字key都对应一个确定的值,这种对应关系称为散列函数,也叫哈希函数,

同时哈希不仅是一种储存方法,也是一种查找方法,

这种方法最适合求解查找和给定的值相等的记录

在一定程度上,个人认为哈希和数学上的映射有着相似的联系,都存在一一对应关系,遵循相同对应法则,此处请看映射定义:

设A和B是两个非空集合,如果按照某种对应关系

,对于集合A中的任何一个元素a,在集合B中都存在唯一的一个元素b与之对应,那么,这样的对应(包括集合A,B,以及集合A到集合B的对应关系f)叫做集合A到集合B的映射(Mapping),记作

。其中,b称为a在映射f下的象,记作:

; a称为b关于映射f的原象。集合A中所有元素的象的集合记作f(A)。

是吧,这样更好理解了些;

这里在普及一个知识点:for(register int i=st;~i;i=ne[i])

如何理解这个循环?

"~"在C语言里面是二进制取反的意思,与补码颇有相似指出,按照代码运行结果来看,这个~就是对十进制的数加“-”在减1,

也就是说~i也就可以等价于i!=-1

这种处理方式对于哈希查找是具有辅助作用的;

在来说说本题思路:

我们输入首地址,键值,下一个地址,并且存入专门的数组种,在进行哈希,如果这个数的绝对值有相等的(走过已经标记的),就放入第一个储存数组中,如果没有,就标记这个数组,再存入另一个储存数组,最后按照题目要求输出相应的数组就可以了。

Talk is cheap. Show me the code.

 1 #include<bits/stdc++.h>
2 using namespace std;
3 int st,n;
4 int key[100010];//键值
5 int ne[100010];//下一个地址
6 bool vis[100010];//标记数组
7 vector<int>a,b;
8 int main()
9 {
10 scanf("%d %d",&st,&n);
11 for(register int i=0;i<n;i++)
12 {
13 int tag,keys,e;
14 scanf("%d %d %d",&tag,&keys,&e);
15 key[tag]=keys;
16 ne[tag]=e;
17 }
18 for(register int i=st;~i;i=ne[i])//等价于i!=-1
19 {
20 int flag=abs(key[i]);
21 if(vis[flag])//绝对值有相等的放在b中
22 {
23 b.push_back(i);
24 }
25 else//没有就放在a 中
26 {
27 vis[flag]=true;//标记
28 a.push_back(i);
29 }
30 }
31 for(register int i=0;i<a.size();i++)
32 {
33 printf("%05d %d ",a[i],key[a[i]]);
34 if(i==a.size()-1)
35 cout<<-1<<endl;
36 else
37 {
38 printf("%05d\n",a[i+1]);
39 }
40
41 }
42 for(register int i=0;i<b.size();i++)
43 {
44 printf("%05d %d ",b[i],key[b[i]]);
45 if(i==b.size()-1)
46 cout<<-1<<endl;
47 else
48 {
49 printf("%05d\n",b[i+1]);
50 }
51
52 }
53 return 0;
54 }

pta L2-002 链表去重 +散列表知识小普及+二进制取反补码运算的更多相关文章

  1. pta l2-2(链表去重)

    题目链接:https://pintia.cn/problem-sets/994805046380707840/problems/994805072641245184 题意:给定一个链表,要求删除其中键 ...

  2. Kubernetes知识小普及

    大部分概念Kubernetes官网都有详细介绍,Kubernetes中文官网 https://kubernetes.io/zh/docs/tutorials/kubernetes-basics/ 官网 ...

  3. 线性表 & 散列表

    线性表: 数据排成一条线一样的机构,每个线性表上的数据最多只有前后两个方向, 包括 数组,链表,队列,栈. 非线性表 : 数据之间并不是简单的前后关系,有二叉树.图等. 散列表(基于 数组支持按照下标 ...

  4. L2-002. 链表去重(数组模拟)

    L2-002. 链表去重 因为数值比较小,所以直接用数组来模拟 #include<cstdio> #include<cstring> #include<iostream& ...

  5. linux内核的双链表list_head、散列表hlist_head

    一.双链表list_head 1.基本概念 linux内核提供的标准链表可用于将任何类型的数据结构彼此链接起来. 不是数据内嵌到链表中,而是把链表内嵌到数据对象中. 即:加入链表的数据结构必须包含一个 ...

  6. PTA L2-002 链表去重 团体程序设计天梯赛-练习集

    L2-002 链表去重(25 分)   给定一个带整数键值的链表 L,你需要把其中绝对值重复的键值结点删掉.即对每个键值 K,只有第一个绝对值等于 K 的结点被保留.同时,所有被删除的结点须被保存在另 ...

  7. jdk1.8HashMap底层数据结构:散列表+链表+红黑树,jdk1.8HashMap数据结构图解+源码说明

    一.前言 本文由jdk1.8源码整理而得,附自制jdk1.8底层数据结构图,并截取部分源码加以说明结构关系. 二.jdk1.8 HashMap底层数据结构图 三.源码 1.散列表(Hash table ...

  8. 天梯 L2 链表去重

    L2-002 链表去重 (25 分) 给定一个带整数键值的链表 L,你需要把其中绝对值重复的键值结点删掉.即对每个键值 K,只有第一个绝对值等于 K 的结点被保留.同时,所有被删除的结点须被保存在另一 ...

  9. 散列表PTA判断

    1-1 在散列表中,所谓同义词就是具有相同散列地址的两个元素. (1分) T         F 作者 DS课程组 单位 浙江大学   1-2 采用平方探测冲突解决策略(h​i​​(k)=(H(k)+ ...

随机推荐

  1. sql注入mysql注入

    #跨库查询及应用思路 information_schema表特性,记录数据库名.表名.列名对应表 information_schema.schemata:存储所有数据库名 schema_name:数据 ...

  2. char型变量中能不能存储一个中文字符?为什么?

    char型变量是用来存储Unicode编码的字符的,Unicode编码字符集中包含了汉字,因此char型变量中可以存储汉字.不过,如果某个特殊的汉字没有被包含在Unicode编码字符集中,那么,这个c ...

  3. GC是什么? 为什么要有GC?   

    GC是垃圾收集的意思(Gabage Collection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过 ...

  4. 什么是 Spring Boot?

    Spring Boot 是 Spring 开源组织下的子项目,是 Spring 组件一站式解决方案,主要是简化了使用 Spring 的难度,简省了繁重的配置,提供了各种启动器,开发者能快速上手.

  5. SpringBoot和SpringCloud?

    SpringBoot是Spring推出用于解决传统框架配置文件冗余,装配组件繁杂的基于Maven的解决方案,旨在快速搭建单个微服务而SpringCloud专注于解决各个微服务之间的协调与配置,服务之间 ...

  6. 使用Spring框架的好处是什么?

    轻量:Spring 是轻量的,基本的版本大约2MB. 控制反转:Spring通过控制反转实现了松散耦合,对象们给出它们的依赖,而不是创建或查找依赖的对象们. 面向切面的编程(AOP):Spring支持 ...

  7. springmvc对参数接收的两个注解@RequestParam和@RequestBody

    @RequestParam 作用:将请求参数绑定到控制器的方法参数上,主要用于接收几班类型参数 语法:@RequestParam(value="参数名",required=&quo ...

  8. Java 中的 LinkedList 是单向链表还是双向链表?

    是双向链表,你可以检查 JDK 的源码.在 Eclipse,你可以使用快捷键 Ctrl + T, 直接在编辑器中打开该类.

  9. Visual Studio App Center 中的 Bug 跟踪服务

    我在之前的一篇文章 <使用 Visual Studio App Center 持续监视应用使用情况和问题> 中介绍了 App Center 的基本功能及使用入门,其中 诊断 可以自动手机用 ...

  10. python学习笔记(一)——Python基础

    一.python 基础语法 python 的解释器在启动时会自动加载一个内建的模块,因此我们在使用 print().input()等函数时不用导入其他模块文件. 基本语法: 每条语句结尾没有分号 定义 ...