第40题——删除数最大(贪心): 给你一个整数 n,使得从 n 中删除 k 个数字之后的数字最大。

复制代码
题目描述

给你一个整数 n,使得从 n 中删除 k 个数字之后的数字最大。

输入
输入一个整数 n (0 <= n <= 10^100),和需要删除数字 k <= 100的个数

输出
输出删除k个数字之后的最大整数
cpp 复制代码
#include<stdio.h>
#include<string.h>
int main(){
    char n[1000];int k,i,t,len;
    while(scanf("%s%d",&n,&k)!=EOF){
    //while(~scanf("%s%d",&n,&k)){
        len=strlen(n);//获取字符串长度
        while(k--){
            for(i=0;i<len-1;i++) {
                if (n[i] < n[i + 1]) {
                    break;
                } //从最高位开始找,找到到高位小于低位的 就跳出
            }
            while(i+1<len){
                n[i]=n[i+1],i++;//通过移位覆盖法删掉应该移除的元素。(之后就相当于要移除最后一个元素)
            }
            len--;//字符串长度减少 (若应该去除最后一个元素 ,直接 长度减少)
        }
        n[len]=0;
        printf("%s\n",n);
    }
    return 0;
}
复制代码
通过贪心的方法:
根据题意, 就是删除k个数字 保持原序列顺序不变的情况 下,使得 剩下的数字组成的最大。
我们一般比较一个数的大小,是怎么比的 ,比如 8999 9000 ,是不是先看最高位,
第一个数最高位为8 第二个数最高位为9,那么后面根本就不用关心。所以一个数大不大 由高位决定。
最高位相同,比次高位,依次类推。因此此题可以按以下步骤解决。
1.从最高位 开始找,找相邻的两个数中,高位的数字小于低位的数字,则应该把 高位的数字删掉,
2.如果是一个原序列是一个递减序列(或者 全为 11111 这种均匀序列),则删除最后一个元素就好了。
相关推荐
Greedy Alg5 分钟前
LeetCode 84. 柱状图中最大的矩形(困难)
算法
im_AMBER11 分钟前
Leetcode 52
笔记·学习·算法·leetcode
小欣加油12 分钟前
leetcode 946 验证栈序列
c++·算法·leetcode·职场和发展
包饭厅咸鱼39 分钟前
PaddleOCR----制作数据集,模型训练,验证 QT部署(未完成)
算法
无敌最俊朗@1 小时前
C++ 并发与同步速查笔记(整理版)
开发语言·c++·算法
王哈哈^_^1 小时前
【完整源码+数据集】课堂行为数据集,yolo课堂行为检测数据集 2090 张,学生课堂行为识别数据集,目标检测课堂行为识别系统实战教程
人工智能·算法·yolo·目标检测·计算机视觉·视觉检测·毕业设计
夏鹏今天学习了吗1 小时前
【LeetCode热题100(66/100)】寻找两个正序数组的中位数
算法·leetcode·职场和发展
墨染点香1 小时前
LeetCode 刷题【151. 反转字符串中的单词】
算法·leetcode·职场和发展
小张成长计划..2 小时前
【C++】List容器的理解和使用(超详细)
数据结构·list