一、算法题
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[] res=s.toCharArray();
for(int i=0;i<res.length;i+=2*k){
int start=i;
int reslens=res.length-1;
int lens=start+k-1;
int end=Math.min(reslens,lens);
while(start<end){
char temp=res[start];
res[start]=res[end];
res[end]=temp;
start++;
end--;
}
}
return new String(res);
}
}
- 发现 i 是成段成段跳的时候没必要一直 i++,可以根据跳的长度来修改 i
- toCharArray()是将一个字符串内容转换为字符数组
- 不会把结束符搞进来
- 每次end的确定就是在下一次2k长度的末尾和字符数组末尾之间作比较,如果start+k-1>res.length-1,说明此时剩余字符小于2k但是大于k个
- (不是很理解)
替换数字
import java.util.Scanner;
class Main{
public static void main (String[] args) {
/* code */
Scanner in=new Scanner(System.in);
String s=in.nextLine();
StringBuilder sn=new StringBuilder();
for(int i=0;i<s.length();i++){
if(Character.isDigit(s.charAt(i))){
sn.append("number");
}else{
sn.append(s.charAt(i));
}
}
System.out.println(sn);
}
}
- StringBuild
- 常用方法:
public StringBuilder append(Object obj) :添加数据,并返回对象本身
public StringBuilder reverse() :返回相反的字符序列
与String的区别:
String类:内容是不可变的
StringBuilder类:内容是可变的
- 使用Character类的isDigit()方法判断字符是否为数字,根据ascii码表将字符类型ch转换为int类型并传给Character类中的isDigit,通过查阅ascii码表知道 ‘0’-‘9’字符对应整数区间为48—57。
151.翻转字符串里的单词
class Solution {
public String reverseWords(String s) {
//去除多余空格
StringBuilder sb=removespace(s);
//翻转整个
reverseall(sb,0,sb.length()-1);
//翻转每个单词
reverseeach(sb);
return sb.toString();
}
public StringBuilder removespace(String s){
int start=0;
int end =s.length()-1;
while(s.charAt(start)==' ')start++;
while(s.charAt(end)==' ')end--;
//此时已经去除掉了开头和结尾多余的空格
//现在把字符加进去并去除中间的空白字符
StringBuilder sb=new StringBuilder();
while (start<=end) {
char c=s.charAt(start);
//执行到sb.charAt(sb.length()-1)!=' '这里时
//说明c=' ',如果新的字符串sb的末尾不为' ',说明到了一个单词的末尾,要给它加上一个空格
//当两个条件都不满足时,说明c=' '且新字符串sb末尾已经有空格了,此时是单词中间有多余空格的情况
if(c!=' '||sb.charAt(sb.length()-1)!=' '){
sb.append(c);
}
start++;
}
return sb;
}
public void reverseall(StringBuilder 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 reverseeach(StringBuilder sb){
int start=0;
int end =1;
int n=sb.length();
while(start<n){
while(end<n&&sb.charAt(end)!=' '){
//找到第一个单词的全部字母
end++;
}
//找到了第一个单词
reverseall(sb, start, end-1);
start=end+1;
end=start+1;
}
}
}
右旋字符串
题目链接
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = Integer.parseInt(in.nextLine());
String s = in.nextLine();
char res[]=s.toCharArray();
int lens=s.length();
//翻转全部字符串
reversestring(res,0,lens-1);
//翻转前n部分字符串
reversestring(res,0,n-1);
//翻转后面的字符串
reversestring(res,n,lens-1);
System.out.println(res);
}
public static void reversestring(char[] ch,int start,int end){
while(start<=end){
char temp=ch[start];
ch[start]=ch[end];
ch[end]=temp;
start++;
end--;
}
}
}