目录
1.给定一个字符串 s ,找到 它的第一个不重复的字符,并返回它的索引 。如果不存在,则返回-1
2.计算字符串最后一个单词的长度,单词以空格隔开。(注:字符串末尾不以空格为结尾)
3.如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后,短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。
字母和数字都属于字母数字字符。
给你一个字符串 s,如果它是 回文串 ,返回 true ;否则,返回 false 。
4.统计字符串中的单词个数,这里的单词指的是连续的不是空格的字符。
总结:
1.给定一个字符串 s ,找到 它的第一个不重复的字符,并返回它的索引 。如果不存在,则返回-1
1.首先,先定义一个数组,准备用来存放 外来字符串对象(引用是 s ),用来存储其中的 不同元素个数。
为什么定义整型数组来接收?再看下面的代码:
我们先遍历一遍外来的字符串 ,再通过 charAt方法 转换成字符,字符将会类似 ASCII 值,但更准确说是 Unicode 码值被隐式转换为整型来作为 count 的下标来使用,因为 count 数组元素初始值默认是0,再通过 ++ 来计算当前的字符 有多少个一样的。 由于是遍历字符串,其他的字符同理。储存在不同 Unicode 码值 作为 count 数组的下标。
2.接着,再通过遍历一次字符串,重头开始找到第一个只出现一次的字符,再返回下标,没有只出现一次的字符则返回-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(1 == count[s.charAt(i)]) {
return i;
}
}
return -1;
}
}
2.计算字符串最后一个单词的长度,单词以空格隔开。(注:字符串末尾不以空格为结尾)
首先利用 lastIndexof 方法,用于查找指定元素(可以是字符)在对象中的最后一次出现的位置索引(也是下标)。
上述代码,我们先通过 lastIndexof 方法 找到最后一个出现的空格,返回的下标用 end 接收,substring 方法 是从指定的索引开始,截取到原字符串的末尾,返回一个新的字符串。所以用了新 引用 s2 接收,得到最后一个单词,最后打印最后一个单词长度就完成了。
完整代码:
import java.util.Scanner;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while(sc.hasNextLine()) {
String s = sc.nextLine();
int end = s.lastIndexOf(" ");
String s2 = s.substring(end + 1);
System.out.println(s2.length());
}
}
}
有循环输入是因为考虑到牛客网的输入需要就是循环。
3.如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后,短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。
字母和数字都属于字母数字字符。
给你一个字符串
s
,如果它是 回文串 ,返回true
;否则,返回false
。
1. 首先,我们定义个方法来 判断 当前字符是否 符合 是字母 和 字符数字 。
2. 再通过 toLowerCase 方法把大写字母变成小写的,再使用双指针方法来实现。
双指针也就是 字符左右有两个 指针来指引。
这里我们定义了 left 左指针,right 右指针。
3. 再通过循环找到合法的字符,这里就使用到了刚开始我们创建的方法,用来找字母和数字字符。
4.最后,再判断左右两边字符是否一样,不一样肯定就不是回文串了,返回false,如果一样,则通过
else里的代码再来进行判断。
完整代码;
class Solution {
public static boolean isTrue(char c) {
if(c >= 'a' && c <= 'z' || c >= '0' && c <= '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 && !isTrue(s.charAt(left)) ) {
left++;
}
while(left < right && !isTrue(s.charAt(right)) ) {
right--;
}
if(s.charAt(left) != s.charAt(right)) {
return false;
}else {
left++;
right--;
}
}
return true;
}
}
最后的返回 true 指 左右各自字符都通过判断了,左右两边字符都相等。
4.统计字符串中的单词个数,这里的单词指的是连续的不是空格的字符。
完整代码:
class Solution {
public int countSegments(String s) {
int count = 0;
String[] s1 = s.split(" ");
for(String s2:s1) {
if (!s2.isEmpty()) {
count++;
}
}
return count;
}
}
首先,把外来的 引用给到 split 方法,可以将字符串按照指定的字符分割,传入的是空格,就会按照空格来分割字符串,最后它返回一个字符串数组,我们新建 s1 数组用来接收。
前面也定义了个 变量count ,用来存储单词数。
接着通过一个for 循环,isEmpty 用于判断一个字符串对象是否为空字符串,因为如果前面我们字符串有连续的空格,就会分割出两个空格之间的空字符串,所以要使用到 isEmpty 来判断count 是否要 ++,如果是为空字符串返回true,若字符串长度不为空,则返回 false 。
最后返回的 count 这个字符串的 单词数。
总结:
这些题我们使用到的 方法:
1. toLowerCase 方法,用于将字符进行大小写转换。
2. charAt 方法,得到某个字符。
3. lastIndexOf 方法,在字符串中查找指定字符最后一次出现的位置索引(下标)。
4. substring 方法,从指定的索引(下标)开始,截取到原字符串的末尾,返回一个新的字符串。
5. split 方法,用于指定按照何种模式(可以是字符)来分割字符串。该方法会根据指定的正则表达式(可以是字符)将原字符串分割成多个子字符串,并返回一个包含这些子字符串的数组。
6. isEmpty 方法,用于判断一个字符串对象是否为空字符串。