pta L2-002 链表去重 +散列表知识小普及+二进制取反补码运算
题目链接: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 链表去重 +散列表知识小普及+二进制取反补码运算的更多相关文章
- pta l2-2(链表去重)
题目链接:https://pintia.cn/problem-sets/994805046380707840/problems/994805072641245184 题意:给定一个链表,要求删除其中键 ...
- Kubernetes知识小普及
大部分概念Kubernetes官网都有详细介绍,Kubernetes中文官网 https://kubernetes.io/zh/docs/tutorials/kubernetes-basics/ 官网 ...
- 线性表 & 散列表
线性表: 数据排成一条线一样的机构,每个线性表上的数据最多只有前后两个方向, 包括 数组,链表,队列,栈. 非线性表 : 数据之间并不是简单的前后关系,有二叉树.图等. 散列表(基于 数组支持按照下标 ...
- L2-002. 链表去重(数组模拟)
L2-002. 链表去重 因为数值比较小,所以直接用数组来模拟 #include<cstdio> #include<cstring> #include<iostream& ...
- linux内核的双链表list_head、散列表hlist_head
一.双链表list_head 1.基本概念 linux内核提供的标准链表可用于将任何类型的数据结构彼此链接起来. 不是数据内嵌到链表中,而是把链表内嵌到数据对象中. 即:加入链表的数据结构必须包含一个 ...
- PTA L2-002 链表去重 团体程序设计天梯赛-练习集
L2-002 链表去重(25 分) 给定一个带整数键值的链表 L,你需要把其中绝对值重复的键值结点删掉.即对每个键值 K,只有第一个绝对值等于 K 的结点被保留.同时,所有被删除的结点须被保存在另 ...
- jdk1.8HashMap底层数据结构:散列表+链表+红黑树,jdk1.8HashMap数据结构图解+源码说明
一.前言 本文由jdk1.8源码整理而得,附自制jdk1.8底层数据结构图,并截取部分源码加以说明结构关系. 二.jdk1.8 HashMap底层数据结构图 三.源码 1.散列表(Hash table ...
- 天梯 L2 链表去重
L2-002 链表去重 (25 分) 给定一个带整数键值的链表 L,你需要把其中绝对值重复的键值结点删掉.即对每个键值 K,只有第一个绝对值等于 K 的结点被保留.同时,所有被删除的结点须被保存在另一 ...
- 散列表PTA判断
1-1 在散列表中,所谓同义词就是具有相同散列地址的两个元素. (1分) T F 作者 DS课程组 单位 浙江大学 1-2 采用平方探测冲突解决策略(hi(k)=(H(k)+ ...
随机推荐
- 重写(Override)与重载(Overload)的区别(面试题)
概念:重写(Override):是存在子父之间的关系,子类里定义的方法与父类里定义的方法具有相同的方法名以及相同的返回值和参数类型 重写规则: 1.方法名形参列表相同: 2.访问权限,子类大于等于父类 ...
- object 转json 相互转换
1.object 转json 2.json转object 参考 https://blog.csdn.net/justry_deng/article/details/80780175
- leedcode算法分类
- 简述在 MySQL 数据库中 MyISAM 和 InnoDB 的区别 ?
MyISAM: 第 134 页 共 485 页不支持事务,但是每次查询都是原子的: 支持表级锁,即每次操作是对整个表加锁: 存储表的总行数: 一个 MYISAM 表有三个文件:索引文件.表结构文件.数 ...
- 什么是Spring beans?
Spring beans 是那些形成Spring应用的主干的java对象.它们被Spring IOC容器初始化,装配,和管理.这些beans通过容器中配置的元数据创建.比如,以XML文件中 的形式定义 ...
- IDEA 常用快捷键操作
自定义设置及查询: 操作路径:file-setting-Keymap-Editor actions 右击需要修改的action操作,或者右击Editor actions,选择添加Add Keyboar ...
- Oracle入门基础(三)一一单行函数
SQL> --字符函数 SQL> select lower('Hello World') 转小写,upper('Hello World') 转大写,initcap('hello world ...
- Mybatis是如何将sql执行结果封装为目标对象并返回的? 都有哪些映射形式?
第一种是使用<resultMap>标签,逐一定义数据库列名和对象属性名之间的映 射关系. 第二种是使用 sql 列的别名功能,将列的别名书写为对象属性名. 有了列名与属性名的映射关系后,M ...
- 你如何确保 main()方法所在的线程是 Java 程序最后结束 的线程?
我们可以使用 Thread 类的 join()方法来确保所有程序创建的线程在 main()方法退出前结束.
- MySQL 有关权限的表都有哪几个?
MySQL 服务器通过权限表来控制用户对数据库的访问,权限表存放在 MySQL 数 据库里,由 MySQL_install_db 脚本初始化.这些权限表分别 user,db,table_priv,co ...