
本文详解 coderbyte 经典题 numberstream 的 java 实现,重点修复初学者常见的语法错误(如 string 索引、类型大小写、括号缺失),并提供两种高效解法:滑动累加法与预定义模式匹配法。
本文详解 coderbyte 经典题 numberstream 的 java 实现,重点修复初学者常见的语法错误(如 string 索引、类型大小写、括号缺失),并提供两种高效解法:滑动累加法与预定义模式匹配法。
Coderbyte 的 NumberStream 题目要求:给定仅含数字字符 '2' 到 '9' 的字符串,判断是否存在长度至少为 N 的连续相同数字子串,其中 N 即该数字本身的值(例如:连续 3 个 '3'、连续 5 个 '5' 均满足条件)。满足则返回 "true",否则返回 "false"。
你的原始代码存在多个 Java 语言层面的关键错误,我们逐一修正并优化:
? 常见错误解析与修正
- ❌
str[0]→ ✅str.charAt(0):Java 中String不支持数组下标访问,必须使用charAt()方法; - ❌
string temp→ ✅String temp:Java 是大小写敏感语言,基础类型无string,只有引用类型String; - ❌
temp.empty()→ ✅temp.length() == 0或temp.isEmpty():String类没有empty()方法; - ❌
char(temp.length() + 48 == temp[0])→ ✅(char)(temp.length() + '0') == temp.charAt(0):- 缺少右括号
); -
char(...)是类型转换语法,不能包裹整个布尔表达式; -
48是字符'0'的 ASCII 值,更清晰写法是'0'(增强可读性); - 比较对象应为
temp.charAt(0),而非已废弃的temp[0]。
- 缺少右括号
以下是修复后、可直接运行的滑动窗口解法(推荐理解逻辑):
import java.util.*;
import java.io.*;
class Main {
public static String NumberStream(String str) {
if (str.length() == 1) {
return "false"; // 单字符无法满足“至少N个”(最小N=2)
}
String temp = "";
temp += str.charAt(0);
for (int i = 1; i < str.length(); i++) {
char current = str.charAt(i);
if (temp.length() == 0) {
temp = String.valueOf(current);
continue;
}
if (current == temp.charAt(0)) {
temp += current;
} else {
temp = String.valueOf(current); // 重置为新字符
}
// 核心判断:当前连续段长度 == 对应数字字符?
int len = temp.length();
if (len >= 2 && len <= 9 && (char)(len + '0') == temp.charAt(0)) {
return "true";
}
}
return "false";
}
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
System.out.print(NumberStream(s.nextLine()));
}
}? 关键逻辑说明:
temp动态维护当前连续相同数字的字符串(如"333");每次扩展后检查其长度len是否等于首字符对应的数值(即len == '3'→len == 3),且len必须在 2–9 范围内(题目限定输入只含'2'–'9',但逻辑上'1'也合法,若需支持'1',可将条件改为len >= 1)。立即学习“Java免费学习笔记(深入)”;
? 更简洁的预定义模式匹配法(推荐生产环境使用)
利用 Java 内置 String.indexOf() 直接查找预生成的模式串,代码更简短、性能更稳定(尤其对长字符串):
public class Main {
public static String NumberStream(String str) {
// 预生成所有合法模式:n个连续的字符'n'(n从1到9)
String[] patterns = {
"1", // 1个'1'
"22", // 2个'2'
"333", // 3个'3'
"4444",
"55555",
"666666",
"7777777",
"88888888",
"999999999"
};
for (String pattern : patterns) {
if (str.indexOf(pattern) != -1) {
return "true";
}
}
return "false";
}
public static void main(String[] args) {
// 测试用例
System.out.println(NumberStream("6539923335")); // true("333")
System.out.println(NumberStream("1234")); // true("1")
System.out.println(NumberStream("3456")); // false
System.out.println(NumberStream("2342255897")); // true("22" 和 "55")
}
}⚠️ 注意事项与最佳实践
-
输入边界:题目说明输入“总包含至少一个数字”,但未明确是否含
'1'。若测试用例含"1",第一种解法需调整len >= 1判断,第二种解法则天然支持; - 性能考量:预定义模式法时间复杂度为 O(9×n) ≈ O(n),实际常数小;滑动法为单次遍历 O(n),两者均高效;
- 可读性优先:对算法新手,建议先掌握滑动法逻辑;工程中推荐模式法——意图明确、不易出错、易于维护;
-
避免字符串拼接:高频拼接可用
StringBuilder提升效率,但本题输入规模小,String直接拼接可接受。
掌握这两种解法,不仅能通过 Coderbyte 测评,更能夯实 Java 字符串操作与问题建模能力。


















