【算法】2315. 统计星号(多语言实现)

142 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第16天,点击查看活动详情


2315. 统计星号:

给你一个字符串 s ,每 两个 连续竖线 '|' 为 一对 。换言之,第一个和第二个 '|' 为一对,第三个和第四个 '|' 为一对,以此类推。

请你返回 不在 竖线对之间,s'*' 的数目。

注意,每个竖线 '|' 都会 恰好 属于一个对。

样例 1:

输入:
	s = "l|*e*et|c**o|*de|"
	
输出:
	2
	
解释:
	不在竖线对之间的字符加粗加斜体后,得到字符串:"l|*e*et|c**o|*de|" 。
	第一和第二条竖线 '|' 之间的字符不计入答案。
	同时,第三条和第四条竖线 '|' 之间的字符也不计入答案。
	不在竖线对之间总共有 2 个星号,所以我们返回 2

样例 2:

输入:
	s = "iamprogrammer"
	
输出:
	0
	
解释:
	在这个例子中,s 中没有星号。所以返回 0 。

样例 3:

输入:
	s = "yo|uar|e**|b|e***au|tifu|l"
	
输出:
	5
	
解释:
	需要考虑的字符加粗加斜体后:"yo|uar|e**|b|e***au|tifu|l" 。不在竖线对之间总共有 5 个星号。所以我们返回 5 。

提示:

  • 1 <= s.length <= 1000
  • s 只包含小写英文字母,竖线 '|' 和星号 '*' 。
  • s 包含 偶数 个竖线 '|' 。

分析

  • 面对这道算法题目,二当家的陷入了沉思。
  • 看起来就是有条件的统计星号数量。
  • 可以直接遍历字符计数。
  • 也可以考虑用正则表达式。
  • 还可以将字符串按照竖线分割,然后隔一组统计。

题解

rust

impl Solution {
    pub fn count_asterisks(s: String) -> i32 {
        let mut ans = 0;
        let mut isCalc = true;

        s.as_bytes().iter().for_each(|&c| {
            match c as char {
                '*' => {
                    if isCalc {
                        ans += 1;
                    }
                }
                '|' => {
                    isCalc = !isCalc;
                }
                _ => {}
            }
        });

        ans
    }
}

go

func countAsterisks(s string) int {
    ans := 0
    isCalc := true

    for _, c := range s {
        switch c {
        case '*':
            if isCalc {
                    ans++
            }
        case '|':
            isCalc = !isCalc
        }
    }

    return ans
}

typescript

function countAsterisks(s: string): number {
    let ans = 0;
    let isCalc = true;

    for (const c of s) {
        switch (c) {
            case '*':
                if (isCalc) {
                    ++ans;
                }
                break;
            case '|':
                isCalc = !isCalc;
                break;
        }
    }

    return ans;
};

python

class Solution:
    def countAsterisks(self, s: str) -> int:
        ans = 0
        is_calc = True
        for c in s:
            if c == '*':
                if is_calc:
                    ans += 1
            elif c == '|':
                is_calc = not is_calc
        return ans


c

int countAsterisks(char * s){
    int ans = 0;
    bool isCalc = true;

    while (*s) {
        switch (*s) {
            case '*':
                if (isCalc) {
                    ++ans;
                }
                break;
            case '|':
                isCalc = !isCalc;
                break;
        }
        ++s;
    }

    return ans;
}

c++

class Solution {
public:
    int countAsterisks(string s) {
        int ans = 0;
        bool isCalc = true;

        for (auto c: s) {
            switch (c) {
                case '*':
                    if (isCalc) {
                        ++ans;
                    }
                    break;
                case '|':
                    isCalc = !isCalc;
                    break;
            }
        }

        return ans;
    }
};

java

class Solution {
    public int countAsterisks(String s) {
        int ans = 0;
        boolean isCalc = true;

        for (char c : s.toCharArray()) {
            switch (c) {
                case '*':
                    if (isCalc) {
                        ++ans;
                    }
                    break;
                case '|':
                    isCalc = !isCalc;
                    break;
            }
        }

        return ans;
    }
}

原题传送门:https://leetcode.cn/problems/count-asterisks/


非常感谢你阅读本文~
放弃不难,但坚持一定很酷~
希望我们大家都能每天进步一点点~
本文由 二当家的白帽子:https://juejin.cn/user/2771185768884824/posts 博客原创~