由于最近学校恢复线下授课,我也就没有那么多空余时间了,所以博客暂时停更了一段时间,今天先给大家带来三道经典字符串oj题,SE部分的博客以后都会补上的~~~🌹🌹
在开发和校招笔试面试中,字符串都是常客,所以字符串是非常重要的,所以学好字符串是非常有必要的,先来三道oj题开开胃!
🍗🍗🍗🍗🍗🍗🍗🍗🍗🍗🍗🍗🍗🍗🍗🍗🍗🍗🍗🍗🍗🍗🍗🍗
1. 字符串中的第一个唯一字符
这是力扣上的一道题,以上是题目的信息。
注意这道题有一个特点,字符串s只包含小写字母,a的ascii码值是97,一共有26个小写字母,所以我们可以定义一个数组,定义一个i来遍历s的内容,把一个字符作为一个下标,每遇到一个字符,便让数组中这个下标处的元素+1(每个元素都初始化为0)。遍历完s后,数组中的内容也就填充完毕了,这时候可以确定哪些字符只出现了一次,但是怎么确定哪个是第一个唯一字符呢?
只需要回到s的首字符,再重新遍历一下s(因为只有通过s才能确定字符的顺序),同时判定数组中的某个元素是否为1,这样就可以确定第一个唯一字符了。接下来我们画图详解并优化一下~
具体代码实现:
(其中的类和firstUniqChar方法是题目给定的)
//对参数进行判断
if(s == null || s.length() == 0) {
return -1;
}
//字符串中只包含小写字母,所以数组长度为26
int[] arr = new int[26];
//遍历字符串,填充数组元素
for(int i=0; i<s.length(); i++) {
char ch = s.charAt(i);
//数组从0下标开始,所以要减去97('a')
arr[ch-'a']++;
}
//回到字符串首位置,再次遍历数组,找到第一个不重复的字符(arr[ch-'a'] == 1)
for(int i=0; i<s.length(); i++) {
char ch = s.charAt(i);
if(arr[ch-'a'] == 1) {
return i;
}
}
//不存在
return -1;
🥧🥧🥧🥧🥧🥧🥧🥧🥧🥧🥧🥧🥧🥧🥧🥧🥧🥧🥧🥧🥧🥧🥧🥧
2. 字符串最后一个单词的长度
题目信息如上~
该题我们降低一下难度,允许使用Java提供的库方法。
这道题我们讲两种解法,一是用split进行分隔,得到每个单词后输出最后一个单词的长度;二是用substring进行截取,由题意得,字符串末尾不以空格为结尾,单词又以空格隔开,所以我们可以先用lastInderOf获取最后一个空格的下标,再进行截取获得最后一个单词然后输出长度即可。
具体代码如下:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
String str = scan.nextLine();//因为输入包含空格,所以要用nextLine
//方法1,分隔
//String[] s = str.split(" ");
//System.out.println( s[s.length - 1].length());
//方法2:截取
int index = str.lastIndexOf(" ");
String ret = str.substring(index + 1);//index是空格的下标,所以要加1
System.out.println(ret.length());
}
}
🍕🍕🍕🍕🍕🍕🍕🍕🍕🍕🍕🍕🍕🍕🍕🍕🍕🍕🍕🍕🍕🍕🍕🍕🍕🍕🍕🍕🍕🍕
3. 验证回文串
什么是回文串?样如abccba样式的字符串,即左右一一对称。
这道题要更加复杂一点,除了字母还有其他字符,但这道题只考虑字母和数字,也就是说字母和数字才是合法字符,除此之外的字符都可以跳过;其次可以忽略字符的大小写,那么我们就可以把整个字符串都转为大写或转为小写,通过判断字符的ascii码的范围来判断其是否合法。
代码如下:
(其中的类和isPalindrome方法是题目给定的,大家可以自己去力扣上搜一下这道题)
class Solution {
//判断是否为合法字符
private boolean isLegalCharacter(char ch) {
if(ch>='0' && ch<='9' || ch>='a' && ch<='z') {
return true;
}
return false;
}
public boolean isPalindrome(String s) {
//1. 判断是否为数字和字母(判断其ascii码的范围)
//2. 忽略大小写,那么就把整个字符串都转为大写或小写
//转为小写
s = s.toLowerCase();
int left = 0;
int right = s.length() - 1;
while(left < right) {
//判断左边字符是否为合法字符
while(left < right && !isLegalCharacter(s.charAt(left))) {
left++;
}
//判断右边字符是否为合法字符
while(left < right && !isLegalCharacter(s.charAt(right))) {
right--;
}
//此时左右两边字符都为合法字符
if(s.charAt(left) != s.charAt(right)) {
return false;
} else {
//说明相等,那就继续判断下两个字符
left++;
right--;
}
}
//是回文串
return true;
}
}
🍔🍔🍔🍔🍔🍔🍔🍔🍔🍔🍔🍔🍔🍔🍔🍔🍔🍔🍔🍔🍔🍔🍔🍔🍔🍔🍔🍔🍔🍔🍔🍔
看到这里恭喜你又刷完了三道oj题,再次强调字符串是很重要的,所以一定要学好它!!!👊👊💪
最后希望大家给个三连支持一下吧!!!