本文为《Java Coding Problems》11-20题,问题涉及String, Number和Math (共39题)。
问题:判断字符串是否是回文串(翻转后与自身相同)。
思路:将原字符串与翻转字符串做对比,使用StringBuilder
翻转字符串。
代码如下:
public boolean isPalindrome(String str) {
return str.equals(new StringBuilder(str).reverse().toString());
}
问题:将字符串中重复的字符去掉。
思路:使用distinct
方法进行去重。
代码如下:
public String removeDuplicates(String str) {
return Arrays.stream(str.split("")) // 切割成单个字符的字符串
.distinct() // 去重
.collect(Collectors.joining()); // 重新组合
}
问题:去掉字符串中某个给定字符。
思路:使用filter
。
代码如下:
public String removeChar(String str, char ch) {
return str.chars()
.filter(c -> c != ch) // 去掉字符
.mapToObj(c -> String.valueOf((char) c)) // 转成字符串
.collect(Collectors.joining()); // 连接字符串
}
上述代码之所以要将char转成String
,是因为没找到好的方法将char
流直接转成String
,使用Collectors.joining()
方法进行替代,因此要先将char
转成String
。
问题:找到字符串中出现次数最多的字符。
思路:流式处理。
代码如下:
public Pair<Character, Long> countMaxChar(String str) {
return str.chars() // IntStream 流
.mapToObj(c -> (char) c) // 转成字符
.collect( // 统计计数,返回Map
Collectors.groupingBy(c -> c, Collectors.counting()))
.entrySet() // 对map每个entry遍历
.stream()
.max(Map.Entry.comparingByValue()) // 计算最大值
.map(p -> Pair.of(p.getKey(), p.getValue())) // 返回最大值
.orElse(null); // 不存在
}
问题:按字符串长度排序字符串数组。
思路:给sorted
方法传递自定义比较方法。
代码如下:
public String[] sortByLen(String[] strs) {
return Arrays.stream(strs)
.sorted(Comparator.comparingInt(String::length))
.toArray(String[]::new);
}
问题:判断给定字符串是否是另一个字符串的子串。
思路:使用contains
方法。
代码如下:
public boolean isSubstr(String str, String substr) {
return str.contains(substr);
}
问题:统计字符串中某个子串出现的次数。
思路:使用正则表达式查找。
代码如下:
public int countStr(String str, String substr) {
// 使用 quote方法让substr中的元字符匹配自身
Pattern pattern = Pattern.compile(Pattern.quote(substr));
Matcher matcher = pattern.matcher(str);
int position = 0;
int count = 0;
// 循环匹配
while (matcher.find(position)) {
// 11 在 111 中出现2次
// 所以下次开始匹配位置是当前匹配位置 + 1
position = matcher.start() + 1;
++count;
}
return count;
}
问题:统计两个字符串是否是异位词(重排后两个字符串可以相等)。
思路:排序字符串然后判断是否相等。
代码如下:
public boolean isAnagram(String str1, String str2) {
String sortedStr1 = str1.chars().sorted()
.mapToObj(c -> String.valueOf((char) c))
.collect(Collectors.joining());
String sortedStr2 = str2.chars().sorted()
.mapToObj(c -> String.valueOf((char) c))
.collect(Collectors.joining());
return sortedStr1.equals(sortedStr2);
}
问题:创建多行字符串。
思路:JDK 13
支持多行字符串模式,使用"""
,JDK 8
可以使用String.join
生成多行字符串。
代码如下:
// JDK 13
return """First Line
Second Line
""";
// JDK 8
return String.join(System.lineSeparator(),
"First Line",
"Second Line"
);
问题:返回重复n次的字符串。
思路:JDK 11
支持原生repeat
方法,JDK 8
可以使用流来生成。
代码如下:
public String repeat(String str, int n) {
// JDK 11
return str.repeat(n);
// JDK 8
return Stream.generate(() -> str)
.limit(n)
.collect(Collectors.joining());
}
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有