华为OJ铁路栈问题(分析+源码)

题目标题:铁路栈问题 

铁路的调度站如下:

火车编号为:1~9,且不重复。

如:编号分别为“1”、“2”、“3”、“4”、“5”的5个火车顺序进站,那么进站序列为“12345”,全部进站后再顺序出站,则出站序列为“54321”,如果先进1,2,然后2出站,然后1出站,然后再3进站、出站,4进站、出站,5进站、出站,那么出站序列就为21345.

详细描述:

int JudgeTrainSequence (int maxNum, char *pOutSeq);

输入参数:

int maxNum:进站的火车最大编号

char* pOutSeq:使用字符串表示火车出站序列

输出参数(指针指向的内存区域保证有效):

无。

返回值:

Int: 根据输入的进站序列判断,如果输入的出站序列是可能的,返回1,否则返回0;

分析+代码:

这个题目已经提示是栈的问题,有点数据结构基础的娃儿就知道这个入栈出栈的操作,关键的地方在于对于某一个序号n入栈,则如果有小于n的数还没有出栈,那么它们出栈以后必然是降序排列的。对于每一个数都是如此,然而对于本题太过简单,最快最暴力的方法就是模拟栈操作,这也是ACMer知道的经典的数据结构算法,你可以利用STL里已经定义好的stack操作,对于本题因为入栈从1开始编号,而且是顺序的,也就是说入栈序列是不变的,所以用个数组就可以模拟它,首先编号1入栈(放入数组每一个元素),然后从数组的当前位置开始向前走,依次比较和出栈序列的相应元素是否相等,直到不相等的时候,放入编号2.....类似,代码很简单,容易看懂,时间复杂度是O(n^2),没时间优化,欢迎回帖交流~

//#include<iostream>
//#include<string>
//#include<algorithm>
//#include<cmath>
//#include<vector>
//#include<stack>
//#include<iomanip>
//using namespace std;
#include <stdlib.h>
#include <string.h>
#include <stdio.h>

/*
详细描述:
int JudgeTrainSequence (int maxNum, char *pOutSeq);
输入参数:
	 	int maxNum:进站的火车最大编号
	 	char* pOutSeq:使用字符串表示火车出站序列
输出参数(指针指向的内存区域保证有效):
	 	无。
返回值:
		Int: 根据输入的进站序列判断,如果输入的出战序列是可能的,返回1,否则返回0;

*/

int JudgeTrainSequence (int maxNum, char *pOutSeq)
{
	if(strlen(pOutSeq)!=maxNum)return 0;

	char *ss=(char *)malloc(sizeof(char));
	int i,j=0,k=0;
	for(i=1;i<=maxNum;i++)
	{
		ss[j]=i+'0';
		while(ss[j]==pOutSeq[k] && k<maxNum){
			k++;
			j--;
		}
		if(k==maxNum)return 1;
		j++;
	}
	return 0;
}

int main()
{
	char *ss=NULL;
	printf("%d\n",JudgeTrainSequence (5, "53421"));
//	cout<<JudgeTrainSequence (5, "53421")<<endl;//12345;34215
	return 0;
}
时间: 2024-08-29 04:53:08

华为OJ铁路栈问题(分析+源码)的相关文章

easyloader [easyui_1.4.2] 分析源码,妙手偶得之

用easyui很久了,但是很少去看源码. 有解决不了的问题就去百度... 今日发现,easyui的源码不难懂. 而且结合 easyloader 可以非常方便的逐个研究easyui的组件. 但是, easyloader 的官方API介绍非常简略. easyloader.base = '../'; // 设置 easyui 基础目录 easyloader.load('messager', function(){ // 加载指定模块 $.messager.alert('Title', 'load ok

java分析源码-ReentrantLock

一.前言 ReentrantLock表示下面具体分析ReentrantLock源码. 二.ReentrantLock数据结构 ReentrantLock的底层是借助AbstractQueuedSynchronizer实现,所以其数据结构依附于AbstractQueuedSynchronizer的数据结构,关于AQS的数据结构,在前一篇已经介绍过,不再累赘. 三.ReentrantLock源码分析 3.1 类的继承关系 public class ReentrantLock implements L

tensorflow运行原理分析(源码)

tensorflow运行原理分析(源码)  https://pan.baidu.com/s/1GJzQg0QgS93rfsqtIMURSA 原文地址:https://www.cnblogs.com/liuzhongfeng/p/8778422.html

Struts流程分析+源码分析

1.初始化工作 读取配置---转换器-----读取插件 当struts-config.xml配置文件加载到内存,则会创建两个map:ActionConfigs,FromBeans.这两个map都交由ModuleConfig对象管理 a.ActionConfigs的Map装载每个Action配置信息---ActionMapping b.名为FromBeans的map装载FormBean配置信息---FormBeanConfig 接收请求ActionServlet的doPost方法进行处理,调用pr

Servlet-Cookie源码分析 源码环境:Tomcat8

最近在学习servlet的一些实现细节,阅读了Cookie的源码. Cookie本质上是服务器发送给客户端(主要是浏览器)的一个会话临时数据. 其源码注释文档的说明: Creates a cookie, a small amount of information sent by a servlet to a Web browser, saved by the browser, and later sent back to the server. A cookie's value can uniq

PC微信(WeChat)电脑端多开分析+源码

0x00 前言 不知道大家有没有多个微信号,我反正有一两三个. 现在电脑端微信使用频率也比较高,主要用于大文件传输,或者手机电脑文件互传等等,除了不能收红包和看朋友圈,貌似电脑端没其他毛病. 哦,还有个毛病,只能开一个微信,只能开一个,开一个,一个- 不管这些有的没的,今天的主题是,怎么样在电脑上开多个微信客户端! 0x01 分析 了解过单实例的同学,应该都知道大概是怎么实现的单开. 简单说下,大都通过判断Mutex.Event.File等等是否已经存在,存在则退出当前开启进程(说明已经有一个进

snownlp情感分析源码解析

最近发现了snownlp这个库,这个类库是专门针对中文文本进行文本挖掘的. 主要功能: 中文分词(Character-Based Generative Model) 词性标注(TnT 3-gram 隐马) 情感分析(现在训练数据主要是买卖东西时的评价,所以对其他的一些可能效果不是很好,待解决) 文本分类(Naive Bayes) 转换成拼音(Trie树实现的最大匹配) 繁体转简体(Trie树实现的最大匹配) 提取文本关键词(TextRank算法) 提取文本摘要(TextRank算法) tf,id

手撕ArrayList底层,透彻分析源码

ArrayList概述 Hello大家好,今天就来介绍一下ArrayList,说到ArrayList,很多人都知道它的底层是使用数组实现的,线程不安全的,说到它的特点,都会说查找快,增删慢,因为面试题大家都是这么背过来的.今天就来说说它的底层源码吧. ArrayList更准确的说是动态数组去实现的,这里使用动态两字,是为了能够充分体现它的特点. 再者就是ArrayList不是线程安全的,所以效率比较高,但是否这个是绝对的呢?答案是否定的 . ArrayList底层源码 public class

Spring源码分析——源码分析环境搭建

1.在Windows上安装Gradle gradle工具类似于maven,用于项目的构建,此处主要用于构建spring源码,以便我们将spring源码导入eclipse. 开发环境 Java:JDK8(必须是JDK或JRE7以上,使用java -version查看当前电脑java版本) 操作系统:Windows 安装步骤 下载最新的Gradle压缩包:Gradle官网:https://gradle.org/,当前最新版本下载地址:https://gradle.org/releases/,下载bi