Leetcode 2259. Remove Digit From Number to Maximize Result

题目

在这里插入图片描述

解法1:暴力搜索

note:c++中数字组成的字符串可以直接比较大小

class Solution {
public:
    string removeDigit(string number, char digit) {
        string max_res = "";
        for(int i=0;i<number.size();i++){
            char d = number[i];
            if(d != digit) continue;
            string new_num = number.substr(0,i) + number.substr(i+1);
            if(max_res == "" || new_num > max_res){
                max_res = new_num;
            }
        }
        return max_res;
    }
};

解法2:O(n)

这道题的关键在于看某个位置是否该被移除。假设number有n位,现在i位的数字与digit相同,考虑i位移除后的效果。首先对于这个number,不管移除哪一个,数字都会变成n-1位,假设移除不是i的右边的一个位置,那么i现在所在的位置不变。但是相应的如果移除i位,i+1的位置就会成为i之前所在的位置。所以如果i+1的位置数字大于i位的数字,则数字必定比移除其他位要大,则问题转化为:
从左向右便利,第一个number[i+1] > number[i]的位置即是我们寻找的答案,如果没有符合条件的情况,那么就应该移除跟digit相同的最右边的位置

class Solution {
public:
    string removeDigit(string number, char digit) {
        int right_most = 0;
        for(int i=0;i<number.size();i++){
            if(number[i] == digit){
                right_most = i;
                if(number[i] < number[i+1]){
                    return number.substr(0,i) + number.substr(i+1);
                }
            }
        }
        return number.substr(0,right_most) + number.substr(right_most+1);
    }
};
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值