news 2026/8/5 16:23:37

Java 竞赛党必看:字符串操作的正确姿势与常用模板

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Java 竞赛党必看:字符串操作的正确姿势与常用模板

文章目录

  • 一 Java中常用方法
    • 1. 基础获取类
    • 2. 比较与判断类
    • 3. 修改与转换类(产生新字符串)
    • 4. 分割与合并
    • 5.StringBuilder
  • 二 . 四种字符串必会技能
    • 1.字符串与数字的切换
      • A.String 转 int / long
      • B. int/long 转 String
    • 2.字符与ASCII 码
      • A.字符转数字
      • B. 字母移位
      • C.字符的大小写转换
      • D. 判断字符类型
    • 3.格式化输出
    • 4. 字典序比较 (排序用的)
    • 5. 正则表达式分割

一 Java中常用方法

1. 基础获取类

s 表示某一个字符串String

方法说明竞赛避坑指南
s.length()返回字符串长度注意:它是方法,必须带()。数组是.length(属性)。
s.charAt(i)获取索引i处的字符配合while循环做边界检查(i >= 0 && i < s.length())。
s.indexOf(str)查找子串第一次出现的位置如果没找到,返回-1。在处理特定模式搜索时极好用。
s.substring(start, end)截取子串重点:左闭右开[start, end)。包含start,但不包含end

2. 比较与判断类

在竞赛中,千万不要用 == 比较字符串内容!

s.equals(s2):比较两个字符串内容是否完全相等。

s.equalsIgnoreCase(s2):忽略大小写比较(在某些天梯赛题目中很有用)。

s.startsWith(prefix) / s.endsWith(suffix):判断是否以某段开头或结尾。

s.isEmpty():判断长度是否为 0。

3. 修改与转换类(产生新字符串)

注意:Java 中的 String 是不可变的,这些方法都会返回一个全新的字符串

s.toLowerCase() / s.toUpperCase():全部转小写/大写。

s.trim():去掉首尾空格(处理输入数据不规范时是救命药)。

s.replace(old, new):替换所有匹配的字符或子串。

s.toCharArray():竞赛神技。如果你觉得 s.charAt(i) 写起来太长,先转成 char[],然后用 arr[i] 访问,速度更快且代码更短。

4. 分割与合并

s.split(String regex):按规则切分。

例: String[] words = s.split(" "); 可以把句子拆成单词。

String.join(delimiter, elements):把数组或列表用指定符号连起来。

5.StringBuilder

如果在循环里频繁修改字符串(比如 s += “a”),Java 每次都会创建新对象,导致超时,所以我们可以选择来new上一个StringBuilder

为什么我们要使用StringBuilder呢?因为在Java中,String是不可变的,比如当我们有一个字符串 s = “a” 时,执行"s = s + "b"时:

1.Java不会在原来的"a"的后面直接加"b";
2.而是创建一个新对象,把"a"拷贝过去,再把"b"加上去;
3.导致原来的"a"变成了多余的那个,占用了内存

所以当我们在循环10000做" s += “a” " ,则会创建10000个临时字符串对象,直接让内存爆炸💥,同时时间复杂度也到达了O(N ^ 2).

而StringBuilder的优势是他内部有着一个字符数组(char[]),当我们执行sb.append时,它直接在数组的下一个空位填入‘b',不创建新对象,如果数组满了,它会自动扩大一倍(扩容),然后继续填,时间复杂度接近 O(N).

竞赛常用方法:

方法说明竞赛场景
sb.append(xxx)追加内容拼接答案、拼接数字、拼接字符。支持链式调用。
sb.reverse()原地翻转判断回文、大数加法(低位对齐)、反转字符串。
sb.delete(start, end)删除一段类似于substring的逆操作,清理不需要的后缀。
sb.setCharAt(i, c)修改指定字符这是String做不到的!修改某个位置的字符。
sb.insert(offset, str)在指定位置插入比如在最前面插入一个负号。
sb.length()获取当前长度循环遍历时用。
sb.toString()转回String最终输出答案时必须调用。
sb.setLength(0)清空StringBuilder把指针重置为 0,内容逻辑上清空了

现在有一个新场景,假设我们要处理N NN组数据,每组数据都要拼一个结果并输出。

A方法:

StringBuildersb=newStringBuilder();for(inti=0;i<3;i++){sb.append("Data"+i);System.out.println(sb.toString());}

这种情况下
第一轮:Data0
第二轮:Data0Data1 <-- 错了!上一轮的脏数据还在!
第三轮:Data0Data1Data2
数据乱了,并不是我们想要的结果

B方法:直接new

for(inti=0;i<100000;i++){StringBuildersb=newStringBuilder();sb.append("Data"+i);System.out.println(sb.toString());// 循环结束,sb 变成垃圾}

这种情况下,成功输出我们想要的结果
后果:
内存直接爆炸,你在内存里创建了 10 万个对象,又丢弃了 10 万个,同时每次 new 出来的数组都很小,每次都要重新经历从小变大的扩容过程。

C方法:使用setLength(0)

StringBuildersb=newStringBuilder();for(inti=0;i<100000;i++){sb.setLength(0);sb.append("Data"+i);System.out.println(sb.toString());}

这种情况下,成功输出我们想要的结果

后果:
全程只有 1 个对象,同时 比如第一轮你的字符串很长,把数组撑到了 5000 大小。第二轮开始时,sb 依然拥有 5000 的容量,根本不需要再扩容,直接填进去就行

二 . 四种字符串必会技能

1.字符串与数字的切换

场景:题目给了“1000”,要求变成数字1000去做加减乘除,或者是算出结果250后将其拼接到字符串

A.String 转 int / long

Integer.parseInt(s);
Strings="12345";intnum=Integer.parseInt(s);// 转 intlongbigNum=Long.parseLong("9999999999");// 转 long (超过21亿必须用这个)

int 最大只能存约 21 亿 (2 × 10 9 2 \times 10^92×109)。
如果题目说数字可能很大(比如 18 位),必须用 Long.parseLong。

如果字符串里混进了空格或字母(比如 " 123" 或 “12a”),这行代码会直接报错
NumberFormatException。
如果只是首尾空格,直接用s.trim()就好

但如果是“123ad 23;”等这些混入了各种非数字的字符时,则需要使用其他方法

第一种方法:暴力清洗,直接把所有非数字的去掉

Strings="123ad 23;";Stringclean=s.replaceAll("[^0-9]","");// [^0-9] == \\D意思是:除了0-9以外的所有字符,把所有非数字字符替换成空字符串intnum=Integer.parseInt(clean);System.out.println(num);//结果为:12323

如果要求读取直到遇到非数字就输出,那么就不能使用上面的方法
第二种方法:精细提取法(读取直到遇到非数字)

Strings="123ad 23;";intnum=0;for(inti=0;i<s.length();i++){charch=s.charAt(i);// 如果是数字,就累加if(Character.isDigit(ch)){// 核心公式:原数字 * 10 + 新的一位// c - '0' 是把字符变成数字num=num*10+(ch-'0');}else{break;}}System.out.println(num);//结果为:123

B. int/long 转 String

这是为了输出或者拼接

intnum=42;// 写法 1 :利用 Java 的自动装箱,虽然不是最快但最不容易错Strings1=num+"";// 写法 2 :性能稍好,看着专业Strings2=String.valueOf(num);

2.字符与ASCII 码

场景: “把所有字母向后移 3 位”,或者“判断这个字符是不是数字”

核心原理: char 在 Java 里本质上是一个整数,要把 char 当成整数去用
‘0’ 的整数值是 48。
‘A’ 的整数值是 65。
‘a’ 的整数值是 97。

A.字符转数字

问题:怎么把字符 ‘5’ 变成整数 5?

intnum=int'5';//错误//输出:53 并非 5
intnum='5'-'0';//正确// 53 - 48 = 5

B. 字母移位

charc='A';// 往后移 1 位变成 'B'charnext=(char)(c+1);// 必须强转回 char,因为计算结果是 int

C.字符的大小写转换

//'A' = 65, 'a' = 97//小写变大写 减32charuppercaseLetters=(char)('a'-32);//大写变小写 加32charlowercaseLetters=(char)('B'+32);

D. 判断字符类型

用 Java 自带的工具类 Character

Character.isDigit( c ) : 是不是 ‘0’-‘9’?
Character.isLetter( c ): 是不是字符?
Character.isLetterOrDigit( c ): 是不是字符或者数字?
Character.isUpperCase( c ): 是不是大写?
Character.isLowerCase( c ): 是不是小写?

3.格式化输出

题目出现要“保留小数”和“补零”的情况下:

doublepi=3.1415926;inthour=5;// 1. 保留 2 位小数 (会自动四舍五入)System.out.printf("%.2f",pi);// 输出: 3.14// 2. 整数补零 (总共占 2 位,不够补 0)System.out.printf("%02d",hour);// 输出: 05// 3. 组合拳:输出 "Time: 05, Score: 3.14"Stringres=String.format("Time: %02d, Score: %.2f",hour,pi);System.out.println(res);

4. 字典序比较 (排序用的)

题目出现要“请把这些名字按字典序从小到大排列”, 不能用 < 或 > 比较字符串,要用compareTo()

Strings1="apple";Strings2="banana";// 返回值规则:// < 0 : s1 在 s2 前面 (apple < banana)// == 0 : 相等// > 0 : s1 在 s2 后面intresult=s1.compareTo(s2);// 对字符串数组排序String[]arr={"dog","cat","apple"};Arrays.sort(arr);// 默认就是按字典序排的:apple, cat, dog

5. 正则表达式分割

题目给出:“Please, split this… sentence!” (标点混杂空格),用普通的 split(" ") 切不干净,所以给用下面的方法

Strings="Hello, World! Java";// split 里面填的是正则表达式// [ ,!]+ 表示:只要遇到 空格、逗号、感叹号 中的任意一个或多个,就切一刀String[]parts=s.split("[ ,!]+");
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/4 21:06:55

惊爆!提示工程架构师揭秘Agentic AI技术生态与未来走向

惊爆&#xff01;提示工程架构师揭秘Agentic AI技术生态与未来走向 引言&#xff1a;从“工具AI”到“伙伴AI”&#xff0c;我们需要的是能主动解决问题的AI 凌晨三点&#xff0c;我盯着电脑屏幕上的ChatGPT对话框发呆——为了写一篇关于Agentic AI的深度文章&#xff0c;我已经…

作者头像 李华
网站建设 2026/8/1 17:58:04

【开题答辩全过程】以 河市富达购物微信小程序为例,包含答辩的问题和答案

个人简介一名14年经验的资深毕设内行人&#xff0c;语言擅长Java、php、微信小程序、Python、Golang、安卓Android等开发项目包括大数据、深度学习、网站、小程序、安卓、算法。平常会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。感谢大家的…

作者头像 李华
网站建设 2026/8/3 21:49:24

Cursor+Claude AI编程 - Cursor简介

大家好&#xff0c;我是小锋老师&#xff0c;最近更新《2027版 CursorClaude AI编程 1天快速上手》专辑&#xff0c;感谢大家支持。 本课程主要讲解Cursor简介&#xff0c;Cursor下载安装&#xff0c;Cursor生成helloWorld网页&#xff0c;Cursor会话里的Cursor会话里的Agent,…

作者头像 李华
网站建设 2026/7/31 10:29:23

1998-2024年各省固定资产投资价格指数

数据简介 省级固定资产投资价格指数是反映某一省份在一定时期内&#xff0c;固定资产投资领域中各类投资品及取费项目价格变动趋势和程度的相对数。 作为宏观经济调控的重要指标&#xff0c;指数帮助政府掌握投资领域价格动态&#xff0c;制定科学的投资计划和调控政策。 数…

作者头像 李华
网站建设 2026/7/31 21:33:20

从看天吃饭到屏幕管田,智能设备守护农田提质增效

春耕秋收&#xff0c;四季更替&#xff0c;传统农业依赖自然的“看天吃饭”模式已在科技的推动下悄然发生变化。如今&#xff0c;当人们走入田间&#xff0c;便会看到各类智能化设备分工明确、协同运行。田埂旁的气象监测站昼夜守护&#xff0c;田间虫害监测和土壤湿度监控装置…

作者头像 李华