文档讲解:344.反转字符串、541. 反转字符串II、卡码网:54.替换数字 、151.翻转字符串里的单词 、卡码网:55.右旋转字符串
题目链接:344.反转字符串、541. 反转字符串II、卡码网:54.替换数字、151.翻转字符串里的单词 、卡码网:55.右旋转字符串
思路:
1、第一题可以用双指针的思想直接写出结果,是一道简单题。
2、第二题相较第一题较难,主要是对字符串和字符的转换还有区间的判断。首先将字符串转换为字符数组,遍历时每次i加2k个,每2k个处理一次,后返回字符数组转换的字符串。
3、第三题是卡码网上的题目,使用的是ACM模式提交代码,好久没有使用该模式,已经忘差不多了,过几天要把卡码网上前25个题刷一下熟悉熟悉ACM模式。该题是一个字符串处理的题目,使用到了Character.isDigit();其中Character常用方法有:
-
compare (
char x, char y
):比较两个char
类型的值,并返回它们的相对顺序。 -
digit (
char ch, int radix
):根据给定的基数(radix)和字符(ch),返回该字符的整数表示。 -
isDigit (
char ch
):判断指定字符是否是数字。 -
isLetter(
char ch
):判断指定字符是否是字母。 -
isLowerCase(
char ch
):判断指定字符是否是小写字母。 -
isUpperCase(
char ch
):判断指定字符是否是大写字母。 -
isWhitespace(
char ch
):判断指定字符是否是空白字符,如空格、制表符、换行符等。 -
toLowerCase (
char ch
):将指定字符转换为小写字母。 -
toUpperCase (
char ch
):将指定字符转换为大写字母。 -
toString (
char c
):将指定字符转换为字符串。
4、第四题如果使用语言自带的方法来执行,就可以通过split分割字符串,再用双指针反转。但是不用split的话,需要先进行去空格,再将所有字符反转,再对每个单词进行反转,代码量比较多,但是最重要的是要思路清晰。
5、第五题首先想到的就是将字符串后n个先读取到StringBuffer,再将前length-n个读取到StringBuffer。题解给的是将整个字符串反转,再对前n个和后length-n个进行反转。
344.反转字符串
class Solution {
public void reverseString(char[] s) {
int left=0;
int right=s.length-1;
while(left<right){
char temp = s[left];
s[left] = s[right];
s[right] = temp;
left++;
right--;
}
}
}
541. 反转字符串II
class Solution {
public String reverseStr(String s, int k) {
char[] ch = s.toCharArray();
for(int i=0;i<ch.length;i+=2*k){
char[] str = new char[k];
if (i + k <= ch.length) {
reverse(ch, i, i + k -1);
continue;
}
reverse(ch, i, ch.length - 1);
}
return new String(ch);
}
public void reverse(char[] ch, int i, int j) {
for (; i < j; i++, j--) {
char temp = ch[i];
ch[i] = ch[j];
ch[j] = temp;
}
}
}
卡码网:54.替换数字
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String s = in.nextLine();
StringBuffer sb = new StringBuffer();
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);
}
}
151.翻转字符串里的单词
class Solution {
public String reverseWords(String s) {
StringBuffer sb = removeSpace(s);
reverseString(sb,0,sb.length()-1);
reverseEachWord(sb);
return sb.toString();
}
public StringBuffer removeSpace(String s){
StringBuffer sb = new StringBuffer();
int start=0;
int end=s.length()-1;
while(s.charAt(start) == ' '){
start++;
}
while(s.charAt(end) == ' '){
end--;
}
while(start<=end){
char c = s.charAt(start);
if(c != ' ' || sb.charAt(sb.length()-1) != ' '){
sb.append(c);
}
start++;
}
return sb;
}
public void reverseString(StringBuffer sb, int start, int end){
while(start<end){
char temp = sb.charAt(start);
sb.setCharAt(start,sb.charAt(end));
sb.setCharAt(end,temp);
start++;
end--;
}
}
public void reverseEachWord(StringBuffer sb){
int start = 0;
for(int i=0;i<sb.length();i++){
if(sb.charAt(i) == ' '){
reverseString(sb, start, i-1);
start = i+1;
}
}
reverseString(sb, start, sb.length()-1);
}
}
卡码网:55.右旋转字符串
import java.util.*;
class Main{
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int num = Integer.parseInt(in.nextLine());
String str = in.nextLine();
StringBuffer sb = new StringBuffer();
for(int i= str.length()-num; i<str.length(); i++){
sb.append(str.charAt(i));
}
for(int i= 0; i<str.length()-num; i++){
sb.append(str.charAt(i));
}
System.out.println(sb);
}
}