有关String的方法可以看看我上一篇博客
补坑:Java的字符串String类(1)-CSDN博客
387. 字符串中的第一个唯一字符 - 力扣(LeetCode)
给定一个字符串 s
,找到 它的第一个不重复的字符,并返回它的索引 。如果不存在,则返回 -1
。
示例 1:
输入: s = "leetcode" 输出: 0
示例 2:
输入: s = "loveleetcode" 输出: 2
示例 3:
输入: s = "aabb" 输出: -1
拿一个简单的字符串来梳理思路
1.我们申请一个计数数组count,每一个字符的背后其实是一个十进制的数字(ASCII码),比如a=97,b=98
2.ok接下来我们设置一个i遍历这个数组,每次遍历到一个字符就把当前遍历到相同字符的次数加入数组中
3.再次遍历字符串的每个字符,如果在数组里面是1,那么就返回当前的数组下标
优化数组:我们可以不用按照ASCII码来申请这么大的数组,我们可以让当前字符ch-'a'
这样可以使字符串变成这样
最终的代码
public int firstUniqChar(String s) {
int[] count = new int[26];
for (int i = 0; i < s.length(); i++) {
char ch = s.charAt(i);
count[ch-'a']++;
}
for (int i = 0; i < s.length(); i++) {
char ch = s.charAt(i);
if(count[ch-'a'] == 1){
return i;
}
}
return -1;
}
字符串最后一个单词的长度_牛客题霸_牛客网 (nowcoder.com)
描述
计算字符串最后一个单词的长度,单词以空格隔开,字符串长度小于5000。(注:字符串末尾不以空格为结尾)
输入描述:
输入一行,代表要计算的字符串,非空,长度小于5000。
输出描述:
输出一个整数,表示输入字符串最后一个单词的长度。
示例1
输入:
hello nowcoder
输出:
8
说明:
最后一个单词为nowcoder,长度为8
用库方法lastIndexOf找到最后一个空格的地方,然后用sunstring截取空格下一个字母所带的单词
然后打印就行了
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
// 注意 hasNext 和 hasNextLine 的区别
while (in.hasNextLine()) { // 注意 while 处理多个 case
String a = in.nextLine();
int index = a.lastIndexOf(' ');
String str = a.substring(index+1);
System.out.println(str.length());
}
}
}
125. 验证回文串 - 力扣(LeetCode)
如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后,短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。
字母和数字都属于字母数字字符。
给你一个字符串 s
,如果它是 回文串 ,返回 true
;否则,返回 false
。
示例 1:
输入: s = "A man, a plan, a canal: Panama" 输出:true 解释:"amanaplanacanalpanama" 是回文串。
示例 2:
输入:s = "race a car" 输出:false 解释:"raceacar" 不是回文串。
示例 3:
输入:s = " " 输出:true 解释:在移除非字母数字字符之后,s 是一个空字符串 "" 。 由于空字符串正着反着读都一样,所以是回文串。
在第一个字母处设置一个i,在最后一个字母处设置一个j
i++往后遍历字符串,j--往前遍历字符串,每遍历一个就进行字符比较,相同就继续遍历
注意:i遇到非数字字符要++到下一个数字字符;
j遇到非数字字符要--到下一个数字字符
如果i和j下标的字符不一样就直接返回false
整个代码:
public static boolean isNumOrCharacter(char ch){
if(ch >= '0' && ch <= '9' || ch >= 'a' && ch <= 'z'){
return true;
}
return false;
}
public boolean isPalindrome(String s) {
s = s.toLowerCase();
//定义i和j下标
int i = 0;
int j = s.length()-1;
while(i < j){
//i要一直走到一个合法的字符那里,而且为了防止i越界得多加一个i<j的前提
while(i < j && !isNumOrCharacter(s.charAt(i))){
i++;
}
//j要一直走到一个合法的字符那里,而且为了防止j越界得多加一个i<j的前提
while(i < j && !isNumOrCharacter(s.charAt(j))){
j--;
}
//对应下标字符一样,i++,j--
if(s.charAt(i) == s.charAt(j)){
i++;
j--;
}else{
//对应下标不一样
return false;
}
}
return true;
}