题目链接: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. Reverse Shell Cheat Sheet

    Reverse Shell Cheat Sheet If you're lucky enough to find a command execution vulnerability during a ...

  2. Linux系统常用的命令

    1.查看本机IP地址:ifconfig 2.查看当前所在路径:pwd 3.查看指定名称线程:ps -ef | grep tomcat 4.查看当前目录结构:ll 或者 ls 5.杀死指定线程:kill ...

  3. K8S原来如此简单(八)ServiceAccount+RBAC

    ServiceAccount ServiceAccount是给运行在Pod的程序使用的身份认证,Pod容器的进程需要访问API Server时用的就是ServiceAccount账户. Service ...

  4. kafka 分布式(不是单机)的情况下,如何保证消息的顺序消费?

    Kafka 分布式的单位是 partition,同一个 partition 用一个 write ahead log 组织, 所以可以保证 FIFO 的顺序.不同 partition 之间不能保证顺序. ...

  5. C++多态例子_虚函数

    #include<iostream> using namespace std; class parent { public: virtual void fun() { cout <& ...

  6. java-与文件相关

    java.nio.file 表示non-blocking 非阻塞io(输入和输出) 一个 Path 对象表示一个文件或者目录的路径,是一个跨操作系统(OS)和文件系统的抽象 java.nio.file ...

  7. OOP 中的 组合、聚合和关联有什么区别?

    如果两个对象彼此有关系,就说他们是彼此相关联的.组合和聚合是面向对象中 的两种形式的关联.组合是一种比聚合更强力的关联.组合中,一个对象是另一 个的拥有者,而聚合则是指一个对象使用另一个对象.如果对象 ...

  8. Markdown语法1

    Markdown是一种轻量级标记语言. Markdown 编写的文档可以导出 HTML .Word.图像.PDF.Epub 等多种格式的文档. Markdown 编写的文档后缀为 .md, .mark ...

  9. Architecture Principles

    Architecture Principles - Completed Components Name Statement Rationale Implications TOGAF Principle ...

  10. canvas小游戏——flappy bird

    前言 如果说学编程就是学逻辑的话,那锻炼逻辑能力的最好方法就莫过于写游戏了.最近看了一位大神的fly bird小游戏,感觉很有帮助.于是为了寻求进一步的提高,我花了两天时间自己写了一个canvas版本 ...