前言
在数字的世界里,圆圈的数量有时候会成为一个有趣的谜题。小I遇到这样一个问题:给定一串数字字符,她需要计算其中一共有多少个圆圈。问题的规则简单而巧妙:不同的数字会包含不同数量的圆圈。通过一个小小的挑战,我们能学到如何通过条件判断和遍历字符串来解决这类问题。
问题描述
给定一串数字字符 s,需要计算其中包含的圆圈总数。具体规则如下:
- 数字
0、6、9各含有一个圆圈。 - 数字
8含有两个圆圈。 - 其他数字(
1、2、3、4、5、7)不含有任何圆圈。
示例
-
示例1:
- 输入:
s = "1234567890" - 输出:
5 - 解释:数字
0、6、9各含有 1 个圆圈,数字8含有 2 个圆圈,总共有 5 个圆圈。
- 输入:
-
示例2:
- 输入:
s = "8690" - 输出:
5 - 解释:数字
8含有 2 个圆圈,数字6、9各含有 1 个圆圈,总共有 5 个圆圈。
- 输入:
-
示例3:
- 输入:
s = "1111" - 输出:
0 - 解释:没有任何数字含有圆圈,因此输出 0。
- 输入:
解题思路
1. 数字与圆圈的映射
我们通过一个简单的映射来实现对数字圆圈数量的统计:
- 数字
0、6、9各贡献 1 个圆圈。 - 数字
8贡献 2 个圆圈。 - 其他数字(
1、2、3、4、5、7)不贡献任何圆圈。
2. 遍历字符串
我们可以通过遍历输入的字符串,对于每个字符判断其是否对应于含有圆圈的数字,并累加相应的圆圈数量。
3. 具体实现
下面是基于上述思路编写的代码实现:
public class Main {
// 计算数字字符串中圆圈的数量
public static int solution(String s) {
// 用于保存总的圆圈数
int totalCircles = 0;
// 遍历字符串中的每一个字符
for (char c : s.toCharArray()) {
switch (c) {
case '0':
case '6':
case '9':
totalCircles += 1; // 数字0、6、9每个包含1个圆圈
break;
case '8':
totalCircles += 2; // 数字8包含2个圆圈
break;
default:
// 其他数字(1、2、3、4、5、7)不含有任何圆圈
break;
}
}
// 返回计算得到的圆圈总数
return totalCircles;
}
public static void main(String[] args) {
// 测试案例
System.out.println(solution("1234567890") == 5); // 预期输出:5
System.out.println(solution("8690") == 5); // 预期输出:5
System.out.println(solution("1111") == 0); // 预期输出:0
}
}
代码解释
步骤1:遍历字符串
我们首先将输入的字符串转化为字符数组,并逐个字符进行判断。通过 switch 语句,我们针对每一个字符检查它是否属于含有圆圈的数字,并根据规则累加圆圈数量。
步骤2:圆圈数量的累加
对于 0、6、9,我们将圆圈数量加 1;对于 8,我们将圆圈数量加 2。其他数字不做任何操作。
步骤3:返回结果
最后,我们返回累加的圆圈总数,完成计算。
测试结果
- 输入
s = "1234567890",输出5。 - 输入
s = "8690",输出5。 - 输入
s = "1111",输出0。
通过这些测试,可以确认我们的代码正确地计算了每串数字中的圆圈总数。
复杂度分析
时间复杂度
- 我们遍历字符串的每个字符,时间复杂度为 O(n) ,其中
n是字符串的长度。
空间复杂度
- 我们只使用了常数的额外空间来存储累加结果,空间复杂度为 O(1) 。
总结
这个问题看似简单,但通过条件判断和遍历字符串,能够高效地计算出数字中的圆圈总数。在实际编程中,如何清晰地定义问题并合理使用控制结构是非常重要的。希望通过这个题目,大家能够体会到如何通过条件判断来解决实际问题,并提高代码的可读性与效率。