常用字符串方法
字符串里面的方法很多,我们需要多加练习并熟练掌握。
Java中字符串常用的方法包括:
- charAt(int index):用于返回字符串中指定位置的字符。
- substring(int beginIndex, int endIndex):用于返回字符串中指定位置的子字符串。
- indexOf(String str):用于返回字符串中指定子字符串第一次出现的位置。
- lastIndexOf(String str):用于返回字符串中指定子字符串最后一次出现的位置。
- equals(Object anObject):用于比较字符串是否相等。
- toLowerCase():用于将字符串中的所有字符转换为小写。
- toUpperCase():用于将字符串中的所有字符转换为大写。
- trim():用于去除字符串两端的空格。
- replace(char oldChar, char newChar):用于将字符串中指定字符替换为新的字符。
- split(String regex):用于将字符串按照指定的正则表达式分割成字符串数组。
- substring(int start, int end):用于从指定的开始位置到结束位置截取子字符串。
- startsWith()/endsWith():用于判断字符串是否以某子串开头或结尾。
- contains():用于检查字符串中是否包含某个子串。
常用StringBuffer方法
由于`String`是不可变的,因此在大量修改字符串的情况下,性能可能不如`StringBuffer`。对于需要频繁修改字符串的情况,使用`StringBuffer`会更加高效。
* `append(Object obj)`: 将指定的对象追加到此缓冲区的当前内容。
* `insert(int index, Object obj)`: 在此缓冲区的指定位置插入指定的对象。
* `delete(int start, int end)`: 删除从指定的`start`位置到`end-1`位置的字符。
* `reverse()`: 反转此缓冲区的当前内容。
* `capacity()`: 返回此缓冲区的容量。
* `length()`: 返回此缓冲区的长度(字符数)。
* `charAt(int index)`: 返回此缓冲区中指定位置的字符。
* `substring(int start, int end)`: 返回一个新的字符串,它是此缓冲区的一个子序列。
* `setCharAt(int index, char ch)`: 在指定位置设置字符。
* `setLength(int newLength)`: 设置此缓冲区的新长度。
开始做题!
344.反转字符串(简单)
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s
的形式给出。
不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
示例 1:
输入:s = ["h","e","l","l","o"] 输出:["o","l","l","e","h"]
思路:看到反转很容易就想到了StringBuffer里面的反转方法,但这道题最好还是用双指针方法,可以参考之前做过的反转链表。
设置左右两指针,两指针交换完毕后向中间移动,当左==右时,反转结束。
代码实现:
class Solution {
public void reverseString(char[] s) {
int left=0,rignt=s.length-1;
while (left<rignt){ //注意这里用left<right而不是left!=right
char t=s[left];
s[left]=s[rignt];
s[rignt]=t;
left++;
rignt--;
}
}
}
总结:既然方法中参数为数组,我们就可以灵活地使用双指针进行解答。
541.反转字符串2(简单)
给定一个字符串 s
和一个整数 k
,从字符串开头算起,每计数至 2k
个字符,就反转这 2k
字符中的前 k
个字符。
- 如果剩余字符少于
k
个,则将剩余字符全部反转。 - 如果剩余字符小于
2k
但大于或等于k
个,则反转前k
个字符,其余字符保持原样。
示例 1:
输入:s = "abcdefg", k = 2 输出:"bacdfeg"
同样,本题也可以用双指针法来解决,不过要处理的情况更多了些。
代码实现:
class Solution {
public String reverseStr(String s, int k) {
char[] ch = s.toCharArray();
for(int i = 0;i < ch.length;i += 2 * k){
int start = i;
// 判断尾数够不够k个来取决end指针的位置
int end = Math.min(ch.length - 1,start + k - 1);
while(start < end){
char temp = ch[start];
ch[start] = ch[end];
ch[end] = temp;
start++;
end--;
}
}
return new String(ch);
}
}
总结:总之还是需要思维灵活运用,掌握char数组与String的相互转化。
卡码网 54.替换数字
题目描述
给定一个字符串 s,它包含小写字母和数字字符,请编写一个函数,将字符串中的字母字符保持不变,而将每个数字字符替换为number。 例如,对于输入字符串 "a1b2c3",函数应该将其转换为 "anumberbnumbercnumber"。
输入描述
输入一个字符串 s,s 仅包含小写字母和数字字符。
输出描述
打印一个新的字符串,其中每个数字字符都被替换为了number
输入示例
a1b2c3
输出示例
anumberbnumbercnumber
思考:这里需要综合运用字符串中的一些方法了。
代码实现:
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String s = in.nextLine();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < s.length(); i++) {
if (Character.isDigit(s.charAt(i))) {
sb.append("number");
}else sb.append(s.charAt(i));
}
System.out.println(sb);
}
}
总结:isdigit:判断是否为数字。注意本题不能直接将数字改为number,因为number的空间比数字大。
卡码网:55右旋转字符串
题目描述
字符串的右旋转操作是把字符串尾部的若干个字符转移到字符串的前面。给定一个字符串 s 和一个正整数 k,请编写一个函数,将字符串中的后面 k 个字符移到字符串的前面,实现字符串的右旋转操作。
例如,对于输入字符串 "abcdefg" 和整数 2,函数应该将其转换为 "fgabcde"。
输入描述
输入共包含两行,第一行为一个正整数 k,代表右旋转的位数。第二行为字符串 s,代表需要旋转的字符串。
输出描述
输出共一行,为进行了右旋转操作后的字符串。
输入示例
2
abcdefg
输出示例
fgabcde
思路:这个可以直接用暴力法解答,具体看代码。
代码实现:
import java.util.Scanner;
public class Main {
public static void main(String args[]) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
String s = scanner.next();
StringBuffer stringBuffer = new StringBuffer(s);
String ss = String.valueOf(stringBuffer.charAt(stringBuffer.length() - n));
char x = 0;
for (int i = stringBuffer.length() - n+1; i < stringBuffer.length(); i++) {
x = stringBuffer.charAt(i);
ss = ss + x;
}
for (int i = 0; i < stringBuffer.length() - n; i++) {
x = stringBuffer.charAt(i);
ss = ss + x;
}
System.out.println(ss.toString());
}
}
总结:明天还是字符串,希望能比今天的效率高一点吧。。。