📜  门| GATE-CS-2003 |问题8(1)

📅  最后修改于: 2023-12-03 15:12:40.665000             🧑  作者: Mango

GATE-CS-2003 Question 8

本问题考查了应用Java编程语言解决问题的能力。下面是题目描述:

给定一个字符串S和一个字符C。该字符串包含多个以数字表示的子字符串,以C作为分隔符。例如,字符串“1,2,4,7,11+12+15-18”包含五个子字符串:“1”,“2”,“4”,“7”和“11+12+15-18”。 编写一个Java函数,该函数接受S和C两个参数,并返回字符串S中包含数字的子字符串的总数。例如在上面的示例中,函数将返回5。 在你的实现中,你应该避免使用内置的Java函数库。

解法

首先,我们可以使用两个指针 startend 来遍历字符串 S。然后,我们检查 S[end] 是否等于 C 或 end 是否等于 S 的长度。如果是,则表示我们已经到达了字符串 S 中的子字符串的末尾,此时我们可以提取并计数该子字符串,然后将 startend 指针移到下一个子字符串的开头。

public static int countSubstrings(String s, char c) {
    int start = 0, end = 0, count = 0;
    while (end <= s.length()) {
        if (end == s.length() || s.charAt(end) == c) {
            String subStr = s.substring(start, end);
            // 判断子字符串是否为数字
            if (!subStr.isEmpty() && isNumber(subStr)) {
                count++;
            }
            start = end + 1;
        }
        end++;
    }
    return count;
}

static boolean isNumber(String str) {
    for (char c : str.toCharArray()) {
        if (!Character.isDigit(c)) {
            return false;
        }
    }
    return true;
}
测试样例

下面是一些测试样例,以保证我们的实现是正确的:

| S | C | 预期的计数器值 | |-----------------------|---|-----------------| | 1,2,4,7,11+12+15-18 | , | 5 | | 123 | , | 1 | | 1,2,3 | + | 3 | | a,b,c,d,e | , | 0 | | | ; | 0 |

总结

本题要求我们使用 Java 编写一个函数,该函数接受字符串 S 和字符 C 两个参数,并计算字符串 S 中包含数字的子字符串数目。我们可以使用两个指针 startend 遍历字符串,然后提取并计数每个数字子字符串。注意,我们需要处理传入空字符串或无法找到分隔符的情况。