生成特殊数字的最少操作(Lc2844)——一次遍历

给你一个下标从 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 不含任何前导零

问题简要描述:返回最少操作 

细节阐述:

  • 在之前找到 0 的情况下,如果当前数字 num[i] 是 0 或者 5,则立刻返回 n−i−2。
  • 在之前找到 5 的情况下,如果当前数字 num[i] 是 2 或者 7,则立刻返回 n−i−2。

Java

class Solution {
    public int minimumOperations(String num) {
        boolean found0 = false, found5 = false;
        int n = num.length();
        for (int i = n - 1; i >= 0; i--) {
            char c = num.charAt(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;
    }
}

 Python3

class Solution:
    def minimumOperations(self, num: str) -> int:
        found0 = found5 = False
        n = len(num)
        for i in range(n - 1, -1, -1):
            c = num[i]
            if found0 and c in "05" or found5 and c in "27":
                return n - i - 2
            if c == '0':
                found0 = True
            elif c == '5':
                found5 = True
        return n - found0        

TypeScript

function minimumOperations(num: string): number {
    let n = num.length;
    let [found0, found5] = [false, false];
    for (let i = n - 1; i >= 0; i--) {
        let 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;
};

C++

class Solution {
public:
    int minimumOperations(string num) {
		int n = num.size();
		bool found0 = false, found5 = false;
		for (int i = n - 1;i >= 0;i--) {
			char 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 n - found0;        
    }
};

Go

func minimumOperations(num string) int {
	n := len(num)
	var found0, found5 bool
	for i := n - 1; i >= 0; i-- {
		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
		}
	}
	if found0 {
		return n - 1
	}
	return n
}

  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值