LEET代码2315。计数Asterisks
#java #leetcode #字符串 #interviewquestions

这是一个简单的problem,其中说明是:

您有一个字符串,其中每两个连续的垂直条'|'分为一对。换句话说,第一和第二'|'做一对,第三和第四'|'做一对,等等。

返回S中的''的数量,不包括每对'|'。

之间的''

请注意,每个'|'

将完全属于一对。

示例1:

输入:s =“ l | e*et | c 或|*|”
输出:2
说明:考虑到的字符是强调的:“ l |*e*et | c *o |*de |”。
第一个和第二个“ |”之间的字符被排除在答案之外。

另外,第三和第四'|'之间的字符被排除在答案之外。

考虑了2个星号。因此,我们返回2。

示例2:

输入:s =“ iamProgrammer”
输出:0
说明:在此示例中,s中没有星号。因此,我们返回0。

示例3:

帕尔加尔的PPE:Sodyoney? 输出:5
说明:考虑到的字符是强调的:“ yo | uar | e | b | e *** au | tifu | l”。考虑了5个星号。因此,我们返回5。

约束:

1 <= s.length <= 1000
S由小写的英文字母,垂直条'|'和星号'*'。
组成 S包含均匀数量的垂直条'|'。

乍一看,将其完成的一种方法是使用垂直条将字符串分开,然后忽略每个奇数并计算星号,但实际上您不需要这样做,您可以迭代字符串和立即计数(要么计数条或使用布尔值来验证)。

class Solution {
    public int countAsterisks(String s) {

        int counter = 0;
        boolean notIgnore = true; //  flag that will swap when vertical bar found

        for(int i=0 ; i<s.length() ; i++) {

            // retrieving char
            char c = s.charAt(i);

            // ignoring the ones not needed
            if(c != '*' && c != '|') continue;


            // checking if is asterisk and to be ignored or not
            if(c == '*') {
                if(notIgnore) counter++;
            } else {
                notIgnore = !notIgnore;
            }
        }

        return counter;
    }
}

运行时:2毫秒,比计数Asterisks的Java在线提交的71.32%快。

内存使用率:40.7 MB,不到Count Asterisks的Java在线提交的37.11%。

可以做的另一种情况是使用正则表达式和替换,但这对于一个简单的问题来说是过分的,除非您想提升到一个新的水平,否则IMO。


就是这样!如果还有其他事情要讨论,请随时发表评论,如果我错过了任何事情,请告诉我,以便我可以相应地更新。

直到下一篇文章! :)