
本文详解 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 = 2 && len <blockquote><p>? <strong>关键逻辑说明</strong>:<code>temp</code> 动态维护当前连续相同数字的字符串(如 <code>"333"</code>);每次扩展后检查其长度 <code>len</code> 是否等于首字符对应的数值(即 <code>len == '3'</code> → <code>len == 3</code>),且 <code>len</code> 必须在 2–9 范围内(题目限定输入只含 <code>'2'–'9'</code>,但逻辑上 <code>'1'</code> 也合法,若需支持 <code>'1'</code>,可将条件改为 <code>len >= 1</code>)。</p><div class="aritcle_card flexRow artxards">
<div class="artcardd flexRow">
<a class="aritcle_card_img" rel="nofollow" href="/xiazai/skill7672" title="java-enterprise"><img
src="https://img.php.cn/upload/skill/000/000/081/179161929545163.jpg" alt="java-enterprise" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
<div class="aritcle_card_info flexColumn">
<a rel="nofollow" href="/xiazai/skill7672" title="java-enterprise" class="overflowclass">java-enterprise</a>
<p class="overflowclass">Java企业开发专家,专注于Spring Boot、微服务架构和JVM优化。适用于:Java语言掌握、</p>
</div>
<a rel="nofollow" href="/xiazai/skill7672" title="java-enterprise" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span>
</a>
</div>
</div></blockquote><h3>? 更简洁的预定义模式匹配法(推荐生产环境使用)</h3><p>利用 Java 内置 <code>String.indexOf()</code> 直接查找预生成的模式串,代码更简短、性能更稳定(尤其对长字符串):</p><pre class="brush:php;toolbar:false;">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 字符串操作与问题建模能力。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










