A 1032 Sharing (25 point(s)) 笔记

A 1032 Sharing (25 point(s))

用静态链表实现的题目,比较简单。
原题链接
下面给出自己的accept代码。

#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
const int Maxsize = 100010;
class node {
public:
	int next;
	char data;
	node() {
		this->data = ' ';
		this->next = -1;
	}
}Node[Maxsize];
bool HashMap[Maxsize] = { false };
int main() {
	int nodeHead1 = 0,nodeHead2, number;
	bool flag = false;
	int commonSuffix = -1;
	cin >> nodeHead1 >> nodeHead2 >> number;
	for (int i = 0; i < number; i++) {
		int address, next;
		char Data;
		scanf("%d %c %d", &address, &Data, &next);
		Node[address].data = Data;
		Node[address].next = next;
	}
	while (Node[nodeHead1].next != -1) {
		HashMap[nodeHead1] = true;
		nodeHead1 = Node[nodeHead1].next;
	}
	while (Node[nodeHead2].next != -1) {
		if (!HashMap[nodeHead2]) {
			nodeHead2 = Node[nodeHead2].next;
		}
		else {
				commonSuffix = nodeHead2;
				break;
		}
	}
	if (commonSuffix == -1)
		cout << commonSuffix << endl;
	else
		printf("%05d\n", commonSuffix);
	return 0;
}

主要思路

  1. 建立一个node类,存放地址和数据。由于题目提到地址都是5位数的,我们可以采用静态链表,开辟一个六位数的node表。
  2. 建立一个hash表用来记录是否出现过该节点。
  3. scan函数不能不打空格,即 scanf("%d %c %c"); 不然会输入不成功。
  4. 对第一个链表进行一次历遍,并把出现情况记录在hash表里。
  5. 第二次历遍则开始校对hash表,直到出现发现第一个共用节点后跳出。(这里我认为是应该历遍到最后一个节点……毕竟是后缀。但是书上和网上各位的代码都是没有历遍到最后的,并且的确能ac……嗯我也不知道该怎么说服自己)
  6. 输出时记得,可以采用printf("%05d",commonSuffix); 补零,零是不能缺的。但输出-1时不用补零,所以需要做一次判断。
  7. 记得初始化node类,不然有可能会出现点4超时的情况 (超时大概是因为当头指针会为负,或者可以试试特判头指针为负的情况)

Roman wasn’t built in a day.Just do it!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值