目标
给你一个下标从 0 开始的字符串 num ,表示一个非负整数。
在一次操作中,您可以选择 num 的任意一位数字并将其删除。请注意,如果你删除 num 中的所有数字,则 num 变为 0。
返回最少需要多少次操作可以使 num 变成特殊数字。
如果整数 x 能被 25 整除,则该整数 x 被认为是特殊数字。
示例 1:
输入:num = "2245047"
输出:2
解释:删除数字 num[5] 和 num[6] ,得到数字 "22450" ,可以被 25 整除。
可以证明要使数字变成特殊数字,最少需要删除 2 位数字。
示例 2:
输入:num = "2908305"
输出:3
解释:删除 num[3]、num[4] 和 num[6] ,得到数字 "2900" ,可以被 25 整除。
可以证明要使数字变成特殊数字,最少需要删除 3 位数字。
示例 3:
输入:num = "10"
输出:1
解释:删除 num[0] ,得到数字 "0" ,可以被 25 整除。
可以证明要使数字变成特殊数字,最少需要删除 1 位数字。
说明
- 1 <= num.length <= 100
- num 仅由数字 '0' 到 '9' 组成
- num 不含任何前导零
思路
有一个字符串表示的数字,每一次操作可以删除任意一个数字。问最少需要操作多少次能够使数字被25整除。
通过观察可知,能够被25整除,个位数字只能是 0 或 5。十位数字只能是 0、2、5、7 ,其中 如果 十位为 0 必须要有更高位不为0 num 不含任何前导零。0、25、50、75、100、125、200、……、1000、1025、……
,更高位的数字可以是任意的。如果个位是5,那么十位只能是 2、7
,如果个位是 0,那么十位只能是 0、5
。
2908305
从末尾查找,如果保留5,需要删除中间 5 个,如果删掉5,保留0,则只需要再删除 8, 3
两个数字即可,我们应该取二者的最小值。这就是我们的贪心策略。
代码
/**
* @date 2024-07-25 11:17
*/
public class MinimumOperations2844 {
public int minimumOperations(String num) {
int n = num.length();
int res = 0;
int cursor = n - 1;
while (cursor >= 0 && num.charAt(cursor) != '0') {
cursor--;
}
res = n - 1 - cursor;
cursor--;
while (cursor >= 0 && (num.charAt(cursor) != '0' && num.charAt(cursor) != '5')) {
cursor--;
res++;
}
int res5 = 0;
cursor = n - 1;
while (cursor >= 0 && num.charAt(cursor) != '5') {
cursor--;
}
res5 = n - 1 - cursor;
cursor--;
while (cursor >= 0 && (num.charAt(cursor) != '2' && num.charAt(cursor) != '7')) {
cursor--;
res5++;
}
// 这里需要判断,前面个位为5,但是十位没有合法数字的情况,这时需要把5也删掉
if (cursor < 0) {
res5++;
}
return Math.min(res, res5);
}
}