保留最大的数

原创 2018年04月15日 21:05:36

看了下网上的解法觉得自己的更好一点,与大家分享

下面是题目:

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

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


输出描述:
输出保留下来的结果。
示例1

输入

325 1

输出

35
/*
自己的看法,希望大家批评指正 
其实我觉得测试用例没有问题
题目明确了输入数组的长度在50000量级
因此选择使用string来表示
我做这道题的思路: 题目说删除给定数字的规定个数使之最大
我们就假设这个数 n 位,要删除 b 个元素,使剩下的 n - b个元素组成最大
另外一个数值的大小取决于它的首位 
因为不能改变每个数字的位置,所以其实我们只能在前 b 个元素里选出最大的
作为首位(你只能最多删除 b 个元素,即使 b+1个元素比之前都大
你也没办法把它变成首位)
基于这种思想,b 的大小就是你遍历首位元素(最大元素)的半径
找到前 b 个元素的最大值 max,把 max作为首位,并删除 max之前的元素
这样一来,我们就找到了结果的第一位元素 
接下来只要把 b 的值更新(b = b - 之前删掉的元素个数)
也要把这个数更新(删去它最大值后的子序列(不包含最大值)) 
这样我们就回到了与上面类似的情况,同样的用此时的半径 b (比刚才小)
去找出最大元作为此时的首位(其实是结果的第二位)再更新 b 值和数字序列 
直到最后满足条件退出
下面是我的 AC代码 
*/
#include<iostream>
#include<string.h>
#include<vector>
using namespace std;
string fun(string a,int b)
{
    string res="";
    int len = a.length()-b;        //删除 b个,其实就是要填满剩下的 n-b个
                                //我们用上面的方法一个一个填进去    
    while(len!=0)    //len表示要填的长度,填满了退出 
    {
        char max = 0;
        // 找到前 b个中的最大值 
        for(int i=0;i<=b;i++)
        {
            if(max<a[i])
            max = a[i];
        }
        int index = a.find_first_of(max);
         
        b = b - index;    //更新 b 值 
        res = res + max;    //string类型的res存储结果 
        len--;    //填一个格子少一个 
        // 将首位元素之前的删除,也就是更新原来的数字序列 
        a = a.substr(index+1);
        //这是当半径为 0 表示没有再搜索下去的能力了,此时就把后面的元素直接加上 
        if(b==0)
        {
            res = res+a;
            break;
        }
    }
    return res;
}
int main()
{
    string a;
    int b;
    while(cin >> a >> b)
    {
        cout << fun(a,b) << endl;
    }
    return 0;
}

搜狐笔试:保留最大的数

搜狐笔试:保留最大的数(只能过50%的测试用例) 题目描述 给定一个十进制的正整数number,选择从里面去掉一部分数字,希望保留下来的数字组成的正整数最大。 输入描述: 输...
  • u010429424
  • u010429424
  • 2017年08月21日 22:14
  • 760

保留最大的数

笔试题:给定一个十进制的正整数number,选择从里面去掉一部分数字,希望保留下来的数字组成的正整数最大。思路:从左到右遍历,删除第一个左边小于右边的数字,如果全部递减,则删除最后一个// 保留最大的...
  • Half_open
  • Half_open
  • 2017年09月14日 10:18
  • 244

【入门】求三个数的最大数 【基本语法】【if语句】

题目描述 从三个数中找出最大的数。 输入 3个实数 输出 最大的数,输出两遍,先用函数,再用宏。保留3位小数。 样例输入 1 2 3 样例输出 3.0003....
  • Erick_Who
  • Erick_Who
  • 2015年03月09日 19:43
  • 848

MySQL删除重复数据 并保留ID最大值

DELETE a FROM user1 a JOIN ( SELECT user_name, count(*), MAX(id) AS ...
  • qq_25067905
  • qq_25067905
  • 2017年02月10日 14:55
  • 1290

编程题-保留最大的数

试题: 给定一个十进制的正整数number,选择从里面去掉一部分数字,希望保留下来的数字组成的正整数最大。 输入描述:输入为两行内容,第一行是正整数number,1 ≤ length(numbe...
  • qq_34417408
  • qq_34417408
  • 2017年08月15日 16:10
  • 267

mysql删除重复数据只保留id最大一条记录

mysql删除重复数据只保留id最大一条记录
  • u013350170
  • u013350170
  • 2017年04月20日 10:17
  • 4589

Oracle面试题 删除重复的数据并且保留最大的id

在执行代码前 在执行此代码后 delete  from student where  ROWID not in  (    select Max(rowid) from student...
  • qq_36074042
  • qq_36074042
  • 2017年09月13日 12:38
  • 131

mysql如何删除表中的重复行并保留id较小(或者较大)的记录

在实际录入数据库的过程中,如果数据量比较大的话,难免会因为一些原因,而录入多条重复的记录,那么应该如何操作才能删除重复行,并且保留一条id较大,或者较小的记录呢。         在本例中所用数据表结...
  • qq_28602957
  • qq_28602957
  • 2016年09月07日 09:28
  • 3393

SQL针对单列删除重复数据只保留一条id最大的数据

delete from t_student  where id in (  SELECT id from ( SELECT * from t_student   where  name in (...
  • qq_27292113
  • qq_27292113
  • 2016年10月11日 13:26
  • 1536

对于最小树形图的理解

最小树形图的算法步骤简化得说一下就是重复一下三个步骤,直到图中没有环为止或者判定有孤立节点无法形成最小树形图: 1、删除自环,除根节点以外,每个点留最小入边;2、判断有没有环;3、如果有环,缩为一点...
  • AClion
  • AClion
  • 2012年10月23日 22:08
  • 1613
收藏助手
不良信息举报
您举报文章:保留最大的数
举报原因:
原因补充:

(最多只允许输入30个字)