版本1:
class Solution {
public:
string removeDigit(string number, char digit) {
// 记录字符出现的位置
int pos0 = -1;
// 获取第一次字符出现的位置
int i = 0;
for(; i < number.size(); i++){
if(number[i] == digit){
pos0 = i;
break;
}
}
// 获取最后一次字符出现的位置,如果有的话
int border0 = i;
for(i = number.size() - 1; i > border0; i--){
if(number[i] == digit){
pos0 = i;
break;
}
}
// 如果字符只出现一次
if(border0 == i){
return number.substr(0, pos0) + number.substr(pos0 + 1);
}
// 从第一个出现的位置开始寻找,当前位置的字符小于下一位字符的情况
int border1 = i;
for(i = border0; i < border1; i++){
char c = number[i];
if(c == digit && c < number[i + 1]){
// 如果小于则直接返回,符合题意
pos0 = i;
break;
}
}
return number.substr(0, pos0) + number.substr(pos0 + 1);
}
};
版本二(优化):
1.使用string.erase函数去直接处理,移除字符的操作
2.合并查询步骤,从一开始就找目标字符小于其每次出现位置的下一个位置对应字符的情况,如果有则直接处理,否则处理最后一个出现的位置。
// basic_string& erase( size_type index = 0, size_type count = npos );
class Solution {
public:
string removeDigit(string number, char digit) {
// 记录字符出现的位置
int pos0 = -1;
int len = number.size();
for(int i = 0; i < number.size(); i++){
char c = number[i];
if(c == digit){
// 记录当前出现的位置
pos0 = i;
// 如果后一个位置的字符大于 目标字符
if(i + 1 < len && c < number[i + 1]){
break;
}
}
}
// 删除字符
number.erase(pos0, 1);
return number;
}
};