“日省其身,有则改之,无则加勉。”——《朱子全书·论语》
题目
给你一个下标从 0 开始的字符串 num
,表示一个非负整数。
在一次操作中,您可以选择 num
的任意一位数字并将其删除。请注意,如果你删除 num
中的所有数字,则 num
变为 0
。
返回最少需要多少次操作可以使 num
变成特殊数字。
如果整数 x
能被 25
整除,则该整数 x
被认为是特殊数字。
难度:中等
分析
虽然做出来了,但是做得不够好💪,故此记录一下。对整数删减后可以被25整除的情况进行分类讨论:删减后结尾为00,25,50,75;原数含有1个0(2个0及以上属前种情况)则删减至1个0;原数中没有0删除全部。我们可以多次遍历判断各种情况,也可以使用哈希表记录某个数是否出现过:0、5后面是否有0,2、7后面是否有5,这样一次遍历即可。
代码
分类讨论
class Solution {
public:
int minimumOperations(string num) {
int ans=0;
for (char& c:num){
if (c!='0'){
ans++;
}
}
ans=min(ans,check(num,'0','0'));
ans=min(ans,check(num,'2','5'));
ans=min(ans,check(num,'5','0'));
ans=min(ans,check(num,'7','5'));
return ans;
}
int check(string& num, char a, char b){
bool flaga=false,flagb=false;
int count=0;
for (int i=num.length()-1;i>=0;i--){
if (!flagb){
if (num[i]==b){
flagb=true;
}else{
count++;
}
}else if (!flaga){
if (num[i]==a){
flaga=true;
break;
}
else{
count++;
}
}
}
if (flaga&&flagb){
return count;
}else{
return INT_MAX;
}
}
};
哈希表优化
class Solution {
public:
int minimumOperations(string num) {
vector<int> arr(10);
int n=num.length();
for (int i=n-1;i>=0;i--){
//判断0或5后面是否有0
if (num[i]=='0'||num[i]=='5'){
if (arr[0]){
return n-i-2;
}
}
//判断2或7后面是否有5
if (num[i]=='2'||num[i]=='7'){
if (arr[5]){
return n-i-2;
}
}
//加入哈希表
arr[num[i]-'0']=1;
}
//判断是否含有0
return arr[0]?n-1:n;
}
};