这里首先附上java中字符串相关方法操作:
字符串s传字符数组arr:char[] arr=s.toCharArray();
字符数组arr转字符串s:new.String(arr);
stringbuilder sb转字符串: sb.toString();
双指针直接解决
class Solution {
public void reverseString(char[] s) {
int l=0;
int r=s.length-1;
if(s.length==0){
return;
}
while(l<r){
char temp;
temp=s[l];
s[l]=s[r];
s[r]=temp;
l++;
r--;
}
}
}
这里注意右指针的边界条件
class Solution {
public String reverseStr(String s, int k) {
char[] arr=s.toCharArray();
int len=arr.length;
for(int i=0;i<len;){
int l=i;
int r=l+k-1;
if(r<len){ //边界条件的判断
reverse(arr,l,r);//也可int end = Math.min(ch.length - 1,start + k - 1);
}else{
r=len-1;
reverse(arr,l,r);
}
i=i+2*k;
}
return new String(arr);
}
public void reverse(char[] arr,int m,int n){
while(m<n){
char temp;
temp=arr[m];
arr[m]=arr[n];
arr[n]=temp;
m++;
n--;
}
}
}
这题使用了java中character类中的isdigit方法进行数字的判断,后续需要了解里面是如何实现的。然后还使用了stringbuilder类
import java.util.Scanner;
public 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);
}
}
这题比较复杂,首先是要去除多余的空格,然后再将整个字符串进行反转,然后再对单个单词进行反转。
class Solution {
public String reverseWords(String s) {
StringBuilder sb=removespace(s);
reverse(sb,0,sb.length()-1);
reverseword(sb);
return sb.toString();
}
public StringBuilder removespace(String s){
StringBuilder sb=new StringBuilder();
int l=0;
int r=s.length()-1;
while(s.charAt(l)==' ') l++; //将前端的空格删除
while(s.charAt(r)==' ') r--; //将尾端的空格删除
while(l<=r){ //边界条件注意
char c=s.charAt(l);
if(c!=' '||sb.charAt(sb.length()-1)!=' '){
sb.append(c);
}
l++;
}
return sb;
}
public void reverse(StringBuilder sb,int l,int r){
while(l<r){
char temp=sb.charAt(l);;
sb.setCharAt(l,sb.charAt(r));
sb.setCharAt(r,temp);
l++;
r--;
}
}
public void reverseword(StringBuilder sb){
for(int i=0;i<sb.length();i++){
int slow=i;
int fast=i+1;
while(fast<sb.length()&&sb.charAt(fast)!=' '){
fast++;
}
reverse(sb,slow,fast-1);
i=fast;
}
}
}
将后面k个字符串先放入stringbuilder中,然后将剩余的再进行放入。这里要注意java中的输入输出该怎么写。这里是ACM模式,手动写输入输出,nextLine()表示读取输入中的下一行内容并将其作为字符串返回。nextInt()表示从输入中读取下一个整数。Integer.parseInt(str)表示将字符串转换为整数。
import java.util.Scanner;
class Main{
public static void main(String[] args){
Scanner in=new Scanner(System.in);
int k=Integer.parseInt(in.nextLine()) ;
String s=in.nextLine();
int len=s.length();
if(k>=len){
return;
}
StringBuilder sb=reverseright(s,k);
System.out.println(sb);
}
public static StringBuilder reverseright(String s,int k){
char[] arr=s.toCharArray();
int len=arr.length;
StringBuilder sb1=new StringBuilder();
for(int i=len-k;i<len;i++){
sb1.append(arr[i]);
}
for(int j=0;j<len-k;j++){
sb1.append(arr[j]);
}
return sb1;
}
}