首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >【nowcoder-2017校招真题】保留最大的数

【nowcoder-2017校招真题】保留最大的数

作者头像
饶文津
发布2020-06-02 16:06:09
发布2020-06-02 16:06:09
3630
举报
文章被收录于专栏:饶文津的专栏饶文津的专栏

题目描述

给定一个十进制的正整数number,选择从里面去掉一部分数字,希望保留下来的数字组成的正整数最大。

输入描述:

输入为两行内容,第一行是正整数number,1 ≤ length(number) ≤ 50000。第二行是希望去掉的数字数量cnt 1 ≤ cnt < length(number)。

输出描述:

输出保留下来的结果。

示例1

输入

325 1

输出

35

题解

方法1. 因为想要最后剩下的数尽量大,所以贪心地从前往后找到某位数比后一位小就删掉这个数,但是这样需要 O(n*m) (n 是总位数,m 是删除的个数)。我们可以利用一个栈来达到 O(n)的时间复杂度:遍历每一位,当还能删除时且栈内的数比当前数小就出栈,直到栈内的数比当前数大,或者栈空,就将当前的数入栈。如果全部数都入过栈时还需要删除,那就从栈顶删。

代码语言:javascript
复制
sta = []
num = '0123456789'

s = input()
n = m = int(input())

for i in s:
	while len(sta) != 0 and num.index(sta[-1]) < num.index(i) and m > 0:
		m -= 1
		sta.pop()
	sta.append(i)
	
print (''.join(sta[:(len(s) - n)]))

方法2. 利用10个队列记录0~9出现的位置,例如9843648,那么4出现的位置就是2,5,8出现的位置就是1,6。然后贪心地从大到小枚举每一位可以放的数字,

代码语言:javascript
复制
#include <bits/stdc++.h>

using namespace std;

queue <int> q[10];

char s[50010];

int n, m, len;

int main() {
    ios::sync_with_stdio(false);
    cin >> s >> m;
    len = strlen(s), n = len - m;
    for (int i = 0; i < len; i ++)
        q[s[i] - '0'].push(i);
    for (int c, k = 0, j = -1; k < n; k ++) {
        for (int i = 9; ~i; i --) {
            while (!q[i].empty() && q[i].front() <= j) q[i].pop();
            if (!q[i].empty() && m >= q[i].front() - j - 1) {
                c = '0' + i;
                m -= q[i].front() - j - 1;
                j = q[i].front();
                break;
            }
        }
        putchar(c);
    }
    return 0;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-03-03 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 题目描述
  • 输入描述:
  • 输出描述:
  • 示例1
    • 输入
    • 输出
  • 题解
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档