zoukankan      html  css  js  c++  java
  • 【nowcoder-2017校招真题】保留最大的数

    牛客在线编程-保留最大的数

    题目描述

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

    输入描述:

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

    输出描述:

    输出保留下来的结果。

    示例1

    输入

    325 1

    输出

    35

    题解

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

    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。然后贪心地从大到小枚举每一位可以放的数字,

    #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;
    }
    
  • 相关阅读:
    解决安装python3后yum不能使用情况
    一文教您如何通过 Docker 快速搭建各种测试环境(Mysql, Redis, Elasticsearch, MongoDB
    nginx 的基本配置与虚拟主机配置
    /etc/nginx/nginx.conf配置文件详解
    简单使用ab命令压力测试
    死锁和死锁检测
    centos7下搭建消息中间件--RocketMQ
    Centos7.2配置https
    Mysql 通过binlog日志恢复数据
    MySQL主从复制+备份
  • 原文地址:https://www.cnblogs.com/flipped/p/8496950.html
Copyright © 2011-2022 走看看