列表

详情


8040. 生成特殊数字的最少操作

给你一个下标从 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 位数字。

 

提示

原站题解

去查看

上次编辑到这里,代码来自缓存 点击恢复默认模板
class Solution { public: int minimumOperations(string num) { } };

javascript 解法, 执行用时: 64 ms, 内存消耗: 50 MB, 提交时间: 2024-07-25 09:17:14

/**
 * @param {string} num
 * @return {number}
 */
var minimumOperations = function(num) {
    const n = num.length;
    let found0 = false, found5 = false;
    for (let i = n - 1; i >= 0; i--) {
        const c = num[i];
        if (found0 && (c === '0' || c === '5') ||
            found5 && (c === '2' || c === '7')) {
            return n - i - 2;
        }
        if (c === '0') {
            found0 = true;
        } else if (c === '5') {
            found5 = true;
        }
    }
    return found0 ? n - 1 : n;
};


// 枚举末尾
var minimumOperations2 = function(num) {
    const n = num.length;
    function f(tail) {
        let i = num.lastIndexOf(tail[1]);
        if (i <= 0) {
            return n;
        }
        i = num.lastIndexOf(tail[0], i - 1);
        return i < 0 ? n : n - i - 2;
    }
    const zero = n - (num.includes('0') ? 1 : 0)
    return Math.min(zero, f("00"), f("25"), f("50"), f("75"));
};

rust 解法, 执行用时: 3 ms, 内存消耗: 2 MB, 提交时间: 2024-07-25 09:16:24

impl Solution {
    // 枚举末尾
    pub fn minimum_operations(num: String) -> i32 {
        let n = num.len() as i32;
        let f = |x: char, y: char| -> i32 {
            if let Some(i) = num.rfind(y) {
                if let Some(i) = num[..i].rfind(x) {
                    return n - i as i32 - 2;
                }
            }
            n
        };
        (n - (num.contains('0') as i32)).min(f('0', '0')).min(f('2', '5')).min(f('5', '0')).min(f('7', '5'))
    }
    
    // 一次遍历
    pub fn minimum_operations2(num: String) -> i32 {
        let n = num.len() as i32;
        let mut found0 = false;
        let mut found5 = false;
        for (i, c) in num.bytes().enumerate().rev() {
            if found0 && (c == b'0' || c == b'5') ||
               found5 && (c == b'2' || c == b'7') {
                return n - i as i32 - 2;
            }
            if c == b'0' {
                found0 = true;
            } else if c == b'5' {
                found5 = true;
            }
        }
        if found0 { n - 1 } else { n }
    }
}

golang 解法, 执行用时: 0 ms, 内存消耗: 2 MB, 提交时间: 2023-09-04 10:04:19

func minimumOperations(num string) int {
	ans := len(num)
	if strings.Contains(num, "0") {
		ans-- // 可以删除 len(num)-1 次得到 "0"
	}
	f := func(tail string) {
		i := strings.LastIndexByte(num, tail[1])
		if i < 0 {
			return
		}
		i = strings.LastIndexByte(num[:i], tail[0])
		if i < 0 {
			return
		}
		ans = min(ans, len(num)-i-2)
	}
	f("00")
	f("25")
	f("50")
	f("75")
	return ans
}

func min(a, b int) int { if b < a { return b }; return a }

cpp 解法, 执行用时: 4 ms, 内存消耗: 6.1 MB, 提交时间: 2023-09-04 10:04:00

class Solution {
public:
    int minimumOperations(string num) {
        int n = num.length();
        auto f = [&](string tail) {
            int i = num.rfind(tail[1]);
            if (i == string::npos || i == 0) return n;
            i = num.rfind(tail[0], i - 1);
            if (i == string::npos) return n;
            return n - i - 2;
        };
        return min({n - (num.find('0') != string::npos), f("00"), f("25"), f("50"), f("75")});
    }
};

java 解法, 执行用时: 1 ms, 内存消耗: 39.9 MB, 提交时间: 2023-09-04 10:03:45

public class Solution {
    private int ans;

    public int minimumOperations(String num) {
        ans = num.length();
        if (num.contains("0"))
            ans--;
        f(num, "00");
        f(num, "25");
        f(num, "50");
        f(num, "75");
        return ans;
    }

    private void f(String num, String tail) {
        int n = num.length();
        int i = num.lastIndexOf(tail.charAt(1));
        if (i < 0) return;
        i = num.lastIndexOf(tail.charAt(0), i - 1);
        if (i < 0) return;
        ans = Math.min(ans, n - i - 2);
    }
}

python3 解法, 执行用时: 40 ms, 内存消耗: 15.8 MB, 提交时间: 2023-09-04 10:03:25

# 枚举删除后以 00/25/50/75 结尾,注意00左侧必须有非0
class Solution:
    def minimumOperations(self, num: str) -> int:
        n = len(num)
        def f(tail: str) -> int:
            i = num.rfind(tail[1])
            if i < 0: return n
            i = num.rfind(tail[0], 0, i)  # 写成 num[:i].rfind(tail[0]) 会产生额外的切片空间
            if i < 0: return n
            return n - i - 2
        return min(n - ('0' in num), f("00"), f("25"), f("50"), f("75"))

上一题