问题描述
小I拿到了一串数字字符,她想知道这串数字中一共有多少个圆圈。具体规则如下:
- 数字0、6、9各含有一个圆圈。
- 数字8含有两个圆圈。
- 其他数字不含有任何圆圈。
问题分析与解题思路
问题描述理解
小I有一串数字字符,想要统计这些数字中包含多少个圆圈。根据规则,数字0、6、9都含有一个圆圈,数字8含有两个圆圈,其他数字没有圆圈。
解题思路
-
定义圆圈规则:
- 我们知道数字
0、6、9各含有一个圆圈。 - 数字
8含有两个圆圈。 - 其他数字(
1,2,3,4,5,7)不含圆圈。
- 我们知道数字
-
使用哈希映射:
- 创建一个映射表
circleMap,将数字字符映射到它们所含有的圆圈数量。 - 对于每个字符,查表获取圆圈数量并累加。
- 创建一个映射表
-
遍历字符串:
- 对于输入的字符串
s,遍历每个字符,查找其对应的圆圈数量并累计。
- 对于输入的字符串
-
返回结果:
- 返回总的圆圈数量。
时间复杂度分析
- 时间复杂度:
O(n),其中n是字符串s的长度。我们需要遍历整个字符串一次,查找每个字符对应的圆圈数量。 - 空间复杂度:
O(1),因为我们只需要一个常数大小的哈希表来存储每个数字的圆圈数。
代码实现
java
复制代码
import java.util.HashMap;
import java.util.Map;
public class Main {
public static int solution(String s) {
// 创建映射表记录每个数字的圆圈数量
Map<Character, Integer> circleMap = new HashMap<>();
circleMap.put('0', 1);
circleMap.put('6', 1);
circleMap.put('9', 1);
circleMap.put('8', 2);
// 其他数字不含圆圈,无需显式记录,默认为0
int totalCircles = 0;
// 遍历字符串,统计圆圈数量
for (char c : s.toCharArray()) {
totalCircles += circleMap.getOrDefault(c, 0);
}
return totalCircles;
}
public static void main(String[] args) {
// 测试用例
System.out.println(solution("1234567890") == 5); // 测试样例1
System.out.println(solution("8690") == 5); // 测试样例2
System.out.println(solution("1111") == 0); // 测试样例3
}
}
代码说明
-
circleMap映射表:- 使用
HashMap来记录每个数字与它对应的圆圈数量。例如,'0'、'6'、'9'映射到1,'8'映射到2,其他数字映射到0(默认)。
- 使用
-
遍历输入字符串:
- 通过
for (char c : s.toCharArray())遍历输入字符串s,对于每个字符,调用circleMap.getOrDefault(c, 0)来获取该字符的圆圈数量。若字符没有映射,则默认返回0。
- 通过
-
累加圆圈数:
- 每次获取字符的圆圈数后,将其加到
totalCircles上,最终返回总的圆圈数量。
- 每次获取字符的圆圈数后,将其加到
测试样例
-
输入:
"1234567890"- 输出:
5 - 解析:数字
0、6、9各有一个圆圈,数字8有两个圆圈,总共有5个圆圈。
- 输出:
-
输入:
"8690"- 输出:
5 - 解析:数字
8有两个圆圈,数字6和9各有一个圆圈,总共有5个圆圈。
- 输出:
-
输入:
"1111"- 输出:
0 - 解析:数字
1没有圆圈,总共有0个圆圈。
- 输出:
总结
该问题通过使用一个简单的映射表和遍历输入字符串的方式高效地统计圆圈数量。通过哈希表来存储每个数字的圆圈数量,确保了时间复杂度为O(n),在处理较长字符串时也能保持较好的性能。