(8) 给定一个英文单词,消除当中反复的字母,仅仅能删掉字母。不能交换字母顺序,最后原单词中每一个字母仅仅出现一次,求字典序最小的结果。

这是toj一个题。百度面试也问过,原题见 http://acm.tju.edu.cn/toj/showp3257.html

此题我很喜欢,巧妙之处是其算法是O(n)的…… 。我们一个字母一个字母增加序列,一旦来了一个比較“小”的字母,由于我们须要字典顺序最小。我们希望它尽可能靠前。

所以我们试图“冒泡”似的把小的往前面送。经过尾部那些较大的字母临时扔掉。假设它们在后面还会出现的话。后面会增加进来。可是假设我们经过的字母后面再也不出现了。冒泡也就停止了,这个较小的字母也仅仅能临时停在这里了。这符合我们的直觉。“最后一次出现”的大字母是实用的,由于我们终于不能少字母。

题目比較简单,但须要细细思考。

上我的代码:

#include <cstdio>
#include <cstring>
#include <stack>
#include <string>
#include <vector>
using namespace std;char s[1024],answer[30];
int main() {
int z;for (scanf("%d",&z);z;--z) {scanf("%s",s);stack<int> st;vector<int> num(26,0);for (int i = 0; s[i]; ++i) {++num[s[i] - 'a'];}vector<bool> have(26,false);for (int i = 0; s[i]; ++i) {int c = s[i] - 'a';--num[c];if (!have[c]) {for  (;(!st.empty()) && num[st.top()] && (st.top() > c); have[st.top()] = false,st.pop());st.push(c);have[c] = true;}}answer[st.size()] = 0;for (int i = st.size(); !st.empty(); answer[--i] = st.top() + 'a',st.pop());puts(answer);   }return 0;
}

代码里记录了一个字母后面还要出现多少次,还有它是否已经在堆栈中了。由于每一个字母最多进出堆栈一次,所以复杂度是O(n)的。

(9) 一个特殊的“堆栈”,仅仅有push_back,push_front和pop_back三种操作。操作数的顺序就是1-n, 给出最后弹出数的顺序,问之前操作的顺序怎样或者根本不可能。

这个题是网上看到的rocket fuel的面试。由于是面试题。没地方提交…… 代码也是自己想的。欢迎提意见。

首先假设弹出的数在数组a里面,而且数组a是1-n的一个排列,即数组a不缺少数。不反复数,没有非法的超出范围的数。

由于全部的数是按1-n的顺序增加进去的,假设一个数x先被弹出来,小于x的数应该都在里面了。它们在里面的顺序怎样呢? 这个和“时间戳”相关了,先弹出来的肯定在尾部。所以我们先统计每一个数的“时间戳”。然后在弹出x之前,依据小于x的时间戳。决定那些数每一个是push_front还是push_back。

用双端队列模拟。最后看一下队尾是不是我要的那个数就能够了。我定义了一个结构op。里面是pair<int,int>第一个表示操作数,第二个表示前进、后进、出。事实上第一维能够省略的。

代码:

bool solution(vector<int> &a,vector<pair<int,int> > &op) {
int n = a.size();
vector<int> ord(n + 1);for (int i = 0; i < n; ++i) {ord[a[i]] = i;}deque<int> q;/*1 push_back-1 push_front0 pop_back*/op.clear();for (int i = 1, j = 0;j < n; ++j) {for (;i <= a[j]; ++i) {if ((q.empty()) || (ord[q.back()] > ord[i])) {q.push_back(i);op.push_back(make_pair(i, 1));}else {q.push_front(i);op.push_back(make_pair(i, 0));}}if ((q.empty()) || (q.back() != a[j])) {op.clear();return false;}q.pop_back();op.push_back(make_pair(a[j], 0));}return true;
}

转载于:https://www.cnblogs.com/mqxnongmin/p/10959275.html

序列相关的趣题 之四相关推荐

  1. 矩阵范数、矩阵序列相关的题

    矩阵范数.矩阵序列相关的题 个人理解,供大家参考

  2. 100%的程序员都想挑战的算法趣题!| 码书

    计算机的世界每天都在发生着深刻的变化.新操作系统的发布.CPU性能的提升.智能手机和平板电脑的流行.存储介质的变化.云的普及--这样的变化数不胜数. 在这样日新月异的时代中,"算法" ...

  3. 我敢打赌,这是98%的程序员都想挑战的算法趣题!

    计算机的世界每天都在发生着深刻的变化.新操作系统的发布.CPU性能的提升.智能手机和平板电脑的流行.存储介质的变化.云的普及--这样的变化数不胜数. 在这样日新月异的时代中,"算法" ...

  4. 100% 的程序员都想挑战的算法趣题!

    作者 | 图小敏 计算机的世界每天都在发生着深刻的变化.新操作系统的发布.CPU性能的提升.智能手机和平板电脑的流行.存储介质的变化.云的普及--这样的变化数不胜数. 在这样日新月异的时代中,&quo ...

  5. php算法求出一个数可以被分解成多少个_程序员的算法趣题

    计算机的世界每天都在发生着深刻的变化.新操作系统的发布.CPU性能的提升.智能手机和平板电脑的流行.存储介质的变化.云的普及--这样的变化数不胜数. 在这样日新月异的时代中,"算法" ...

  6. 《趣题学算法》—第0章0.3节算法的伪代码描述

    本节书摘来自异步社区<趣题学算法>一书中的第0章0.3节算法的伪代码描述,作者徐子珊,更多章节内容可以访问云栖社区"异步社区"公众号查看. 0.3 算法的伪代码描述 上 ...

  7. 程序员的算法趣题:Q13 有多少种满足字母算式的解法(Java版)

    题目说明 所谓字母算式,就是用字母表示的算式, 规则是相同字母对应相同数字,不同字母对应不同数字, 并且第一位字母的对应数字不能是 0. 譬如给定算式 We * love = CodeIQ,则可以对应 ...

  8. 程序员的算法趣题Q56: 鬼脚图中的横线(思路1)

    目录 1. 问题描述 2. 解题分析 2.1 贪心策略 3. 代码及测试 4. 后记 1. 问题描述 2. 解题分析 感觉非常没有头绪.先做一些实例计算分析. 2.1 贪心策略 考虑图1的{1234- ...

  9. 程序员的算法趣题Q10: 轮盘的最大值

    目录 1. 问题描述 2. 解题分析 3. 代码及测试 1. 问题描述 轮盘游戏被称为"赌场女王".流传较广的轮盘数字排布和设计有"欧式规则"和"美式 ...

最新文章

  1. 面试必备|带你彻底搞懂Python生成器
  2. WPF开发中遇到的问题及解决系列(一):How can I programmatically click a Button
  3. asp.net 实现一级域名与二级域名共享COOKIE
  4. 【数据结构与算法】顺序栈的Java实现
  5. c/c++ 求字符数组长度(非所占内存大小)
  6. pythondev更新到3_python版本升级到3.7
  7. 计算机启动单元,快速启动计算机系统的方法和计算机的启动系统与流程
  8. 搞 Python 的程序员,不懂这一点,耽误自己成长!现在看还来得及
  9. 阿里员工自愿加班却遭同事骂!网友们炸锅了
  10. 计算机鼠标不灵活怎么办,鼠标不灵活了怎么办_鼠标突然变迟钝的解决方法
  11. vscode实现右键文件夹选择open with code
  12. 客户端的云桌面平台配置与开启(附,登录“云电脑”与切换登录账号)
  13. 适用于 Linux 系统的 11 款图像查看器
  14. AI软件快捷键操作大全
  15. 微信公众号怎么申请注册?看这一篇就够了
  16. centos radius mysql_[原创]CentOS下Radius服务器搭建
  17. 什么?你的口腔竟然只有一边长牙结石!!!
  18. 沉浸其境,共赴云栖数智硬核美学
  19. APP搭建:输入文字,单击显示(Android studio)
  20. Service Principal 介绍

热门文章

  1. 【河北工业大学】考研初试复试资料分享
  2. Git Your branch is ahead of 'origin/master' by X commits解决方法
  3. Unity项目如何组织目录结构
  4. Acrobat Pro DC 教程:如何压缩PDF文件?
  5. 水质自动监测系统的组成
  6. [LaTeX] 在 LaTeX 中对齐表格中的小数点
  7. PSP模拟器 JPcsp
  8. 「名度控股」小程序的社群裂变营销方法
  9. java实现刻录机刻录功能(dom4j+imapi)Windows版
  10. Bit-Z为何选择与Bit-M达成战略共识?