leetcode
leetcode 2001 ~ 2050
统计星号

统计星号

难度:

标签:

题目描述

代码结果

运行时间: 23 ms, 内存: 16.0 MB


/*
 * 思路:
 * 使用Java Stream流处理方法来简化计数过程。
 * 使用正则表达式将字符串以'|'分割成多个部分,仅对奇数索引的部分进行'*'的计数。
 */
import java.util.Arrays;

public class Solution {
    public int countAsterisks(String s) {
        return (int) Arrays.stream(s.split("\\|")).filter(str -> Arrays.asList(s.split("\\|")).indexOf(str) % 2 == 0)
                            .mapToLong(str -> str.chars().filter(ch -> ch == '*').count()).sum();
    }
}

解释

方法:

此题解的思路基于对字符串s的分割处理。首先,使用'|'作为分隔符对字符串s进行分割,得到一个数组a,其中数组的每个元素是竖线'|'之间的字符串。根据题目要求,每两个竖线'|'为一对,因此数组a中,索引为偶数的元素(0, 2, 4, ...)是不在竖线对之间的部分。接着,遍历数组a的偶数索引位置的元素,统计每个元素中星号'*'的数量,并累加到最终结果ans中。最后返回累加的结果ans。

时间复杂度:

O(n)

空间复杂度:

O(n)

代码细节讲解

🦆
在解决方案中,如果输入字符串s以'|'开头或结尾,或者包含连续的'|',这种情况下解决方案如何处理?
如果字符串s以'|'开头或结尾,或者包含连续的'|',使用split('|')方法后会在数组a中生成空字符串。例如,s='|*|'会被分割为['', '*', '']。在这种情况下,空字符串的偶数索引位置(例如0和2)仍然会被遍历,但由于它们是空的,所以其中的星号数量为0。因此,这种情况下的处理不会影响星号的统计结果。
🦆
解决方案中假设了'|'总是成对出现,如果'|'的数量是奇数,这种情况应该如何处理?
如果'|'的数量是奇数,split('|')方法仍然会按'|'分割字符串。然而,数组a中最后一个元素将是最后一个'|'之后的部分,不属于任何'|'对。根据题解逻辑,我们遍历偶数索引位置的元素,这包括了最后一个元素(如果数组长度是奇数的话)。因此,尽管'|'是奇数,解决方案仍然能正确地统计出不在'|'对之间的星号。
🦆
题解中提到,如果字符串中没有'|',直接返回所有的'*'的数量。请问,这种做法是否考虑了所有可能的边界情况?
如果字符串中没有'|',那么整个字符串可以视为一个不被'|'对影响的部分。因此,直接统计并返回所有星号是正确的处理方式。这种做法考虑了没有'|'的情况,是有效且准确的。
🦆
在使用split('|')方法后,数组a的偶数索引位置代表了不在'|'对内的字符串片段。为什么选择忽略奇数索引位置的星号?
根据题目的要求,需要统计的是不在'|'对之间的星号。在split('|')后,偶数索引位置的元素(0, 2, 4, ...)代表的是不在任何'|'对之间的字符串片段,而奇数索引位置的元素则处于'|'对之间。因此,为了满足题目要求,只统计偶数索引位置的星号,并忽略奇数索引位置的星号。

相关问题