前言
这篇文章便是对String类相关知识的运用,所以要先看上篇博客才能更好地食用本文章,入口在这
另外每道题目都会附上出处,可以点进去自己先思考下效果更好哦~
一.字符串中的单词数
统计字符串中的单词个数,这里的单词指的是连续的不是空格的字符。题目出处--》. - 力扣(LeetCode)
输入: "Hello, my name is John"
输出: 5
解释: 这里的单词是指连续的不是空格的字符,所以 "Hello," 算作 1 个单词。
思路:这里我们只需要考虑空格,那就可以通过判断当前字符是否为空格以及前一个字符是否为空格,或者当前字符不为空格且当前字符是第一个字符,就是首个单词嘛,考虑这两种情况,这样就能确定当前位置是否为一个单词的起始位置,当然少不了要遍历字符数组~
class Solution {
public int countSegments(String s) {
char[] array=s.toCharArray();//字符转数组方便遍历
int count=0;//记录单词数
for (int i = 0; i <array.length; i++) {
if((i==0||array[i-1]==' ')&&array[i]!=' ')//当前字符不为空格且前一个字符为空格可以记录为一个单词
//或者当前字符不为空格且当前字符是第一个字符,就是首个单词嘛
{
count++;//单词数加一
}
}
return count;
}
}
二.字符串中第一个唯一字符
给定一个字符串 s (只包含小写字母),找到 它的第一个不重复的字符,并返回它的索引 。如果不存在,则返回 -1 。----》. - 力扣(LeetCode)
示例 1:输入: s = "leetcode"
输出: 0
示例 2:输入: s = "loveleetcode"
输出: 2
示例 3:输入: s = "aabb"
输出: -1
思路:既然是要找到第一个不重复的字符,满足不重复的话那记录每个字符出现的次数是必不可少了,既然要是第一个,可以用if语句判断下哪个字符的出现次数和1相等就行。那基于以上思路
class Solution {
public int firstUniqChar(String s) {
int[] count = new int[300];//创建一个数组存储出现次数
for (int i = 0; i < s.length(); i++) {
count[s.charAt(i)]++;//将对应字符的计数加一
}
for (int i = 0; i < s.length(); i++) {
if (count[s.charAt(i)] == 1) {
return i;//将出现次数为1的字符返回
}
}
return -1;
}
}
还记得charAt()吗?--》加上循环遍历就可以返回字符串的每个字符的索引值了
三.字符串最后一个单词的长度
输入:hello nowcoder
输出:8
说明:最后一个单词为nowcoder,长度为8
思路:怎么判断最后一个单词呢?我的想法是从后面遍历字符串找到第一个空格就可以了,采用
lastIndexOf()方法就可以从后遍历字符串返回要找的字符下标。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
while (in.hasNext()) { //循环输入
String s = in.nextLine();
int a = s.length() - s.lastIndexOf(' ') - 1;//用数组长度-空格的下标-1
System.out.println(a);
}
in.close();
}
}
四.验证回文串
如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后,短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。字母和数字都属于字母数字字符。
给你一个字符串 s,如果它是 回文串 ,返回 true ;否则,返回 false
输入: s = "A man, a plan, a canal: Panama"
输出:true
解释:"amanaplanacanalpanama" 是回文串。
思考:首先大写转小写,方式有很多,String内部的toLowercase()就可以,第二要判断它是不是字母数字字符,这样就好移除。第三比较正序和字符串反序是否相同,StringBuilder或StringBuffer的reverse()方法来轻松地反转一个字符串,然后用s1.equals(s2)比较就行
public class Solution {
public boolean isPalindrome(String s) {
// 创建一个StringBuffer来存储处理后的字符串
StringBuffer sgood = new StringBuffer();
// 获取输入字符串的长度
int length = s.length();
// 遍历输入字符串
for (int i = 0; i < length; i++) {
char ch = s.charAt(i);
// 判断字符是否为字母或数字
if (Character.isLetterOrDigit(ch)) {
// 将字母转换为小写并追加到sgood中
sgood.append(Character.toLowerCase(ch));
}
}
// 创建sgood的反转版本
StringBuffer sgood_rev = new StringBuffer(sgood).reverse();
// 比较处理后的字符串与其反转后的字符串是否相等
return sgood.toString().equals(sgood_rev.toString());
}
}
那万一不记得这么多方法怎么办?那就可以用思路二了-》双指针法
毕竟回文就是前后都一样嘛,这样左指针从左边开始,右指针从末尾开始,循环比较,若有不同,返回false,直到两指针相遇一直相同,那就是回文数了,不过判断字符是否为字母或数字就要自己定义方法了.
charAt() 是一个字符串方法,用于获取指定索引位置的字符,很常用的,要记住哦~
public class Solution {
// 判断字符是否为字母或数字
public boolean isString(char s){
if((s >= 'a' && s <= 'z') || (s >= '0' && s <= '9')){
return true;
}
return false;
}
// 判断输入字符串是否为回文串
public boolean isPalindrome(String s) {
// 将输入字符串转换为小写,方便后续比较
s = s.toLowerCase();
int left = 0;
int right = s.length() - 1;
// 使用双指针法从字符串两端向中间遍历
while(left < right){
// 移动左指针直到找到字母或数字
while(left < right && !isString(s.charAt(left))){
left++;
}
// 移动右指针直到找到字母或数字
while(left < right && !isString(s.charAt(right))){
right--;
}
// 比较左右指针所指的字符是否相等
if(s.charAt(left) != s.charAt(right)){
return false;
}
// 移动指针继续比较下一组字符
left++;
right--;
}
return true; // 字符串为回文串
}
}
五.字符集合
输入一个字符串,求出该字符串包含的字符集合,按照字母输入的顺序输出
输入:abcqweracb
输出:abcqwer
思考:这道题就是问怎么去除重复的字符,那我们可以想想,记录出现次数是个好办法,但只是去重,那就是记录次数是一次就行了,
那就可以新创一个数组,默认全为0,表示没出现过,记录之后,第一个元素置1,表示该字符出现过一次,出现第二次的话便可以设置 数组的值为0时(就是是没出现过时)才接着置一个1,这样不会被重复标记了
同时新创一个字符串变量(StringBuiler)去接收那些出现过一次的字符,这就是去重后的字符啦~
import java.util.Scanner;
public class Main {
// 定义一个方法,用于去除输入字符串中重复字符并返回去重后的字符串
public static String func(String s) {
char[] arr = new char[128]; // 用于标记每个字符是否已经出现过的数组
StringBuilder str = new StringBuilder(); // 用于存储去重后的字符
for (int i = 0; i < s.length(); i++) {
if (arr[s.charAt(i)] == 0) { // 如果字符第一次出现
str.append(s.charAt(i)); // 将字符追加到StringBuilder中
arr[s.charAt(i)]++; // 标记该字符已经出现过
}
}
return str.toString(); // 返回去重后的字符串
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in); // 创建Scanner对象用于获取用户输入
while (in.hasNextLine()) { // 循环读取每一行输入
System.out.println(func(in.nextLine())); // 调用func方法处理并输出结果
}
in.close(); // 在程序结束前关闭Scanner
}
}
这些题目都是关于String类的运用,希望大家收获满满!看到这就点个赞吧~