题目链接: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. CF1225E Rock Is Push (计数)

    观察性质计数题orz小贺 考场上跟榜才切 我们只能往下和往右走,那么只有连续的往下和往右可能会造成不合法的情况!如果当前这一步是向右,那么只有它前面连续的一段向右可能影响到它. 考虑把连续的向右/下一 ...

  2. Java9至17的新特性总结

    总览 讲讲Java 9-17 的一些语法糖和一些新发布的jeps, 重点讲讲JVM的垃圾回收器 时间线 SpringBoot 为什么选择Java17这个版本.我估计跟下面这个图有关系. Java 8 ...

  3. Redis的集群搭建(四)

    1.redis-cluster架构图 2.redis-cluster投票:容错 架构细节: (1)所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽. (2) ...

  4. java-設計模式概述

    什麽是設計模式?? 软件设计中常见问题的典型解决方案. 能根据需求进行调整的预制蓝图, 可用于解决代码中反复出现的设计问题. 模式并不是一段特定的代码, 而是解决特定问题的一般性概念. 你可以根据模式 ...

  5. System.getenv和getProperty的区别

    /** * System.getenv()是获取---环境变量(environment variables), * 系统层面的,好比我linux系统里的.bash_profile文件里面的变量 * 返 ...

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

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

  7. 区分 BeanFactory 和 ApplicationContext?

    BeanFactory ApplicationContext 它使用懒加载 它使用即时加载 它使用语法显式提供资源对象 它自己创建和管理资源对象 不支持国际化 支持国际化 不支持基于依赖的注解 支持基 ...

  8. synchronize、Lock、ReenTrantLock 的区别

    synchronize 和Lock: 1.synchronize 系java 内置关键字:而Lock 是一个类 2.synchronize 可以作用于变量.方法.代码块:而Lock 是显式地指定开始和 ...

  9. MyBatis Plus 2.3 个人笔记-03-Active Record

    AR 语法糖  是一种领域模型模式,特点就是一个模型类对应关系型数据库中的一个表,而模型类的一个实例对应表中的一条记录 实现AR [在代码生成器中可以添加配置] import com.baomidou ...

  10. 纯CSS实现扁平化风格开关按钮

    开关样式预览图 前言 最近在基于bootstrap框架开发一个网站,在填写表单一项需要用户填写是否选择某一选项,本来想引用bootstrap框架自带的一个按钮插件,结果在引用js的时候总是出错,就找了 ...