344.反转字符串
题目
文章讲解
视频讲解
思路:异或法置换a与b(第一次接触,好神奇)
注意:void函数不需要return
class Solution {
public void reverseString(char[] s) {
int l=0;
int r=s.length-1;
while(l<r){
s[l]^=s[r];
s[r]^=s[l];
s[l]^=s[r];
l++;
r--;
}
}
}
541. 反转字符串II
- 循环时,i每次向前走2k步:i+=2k
- 注意需要做一个end指针的位置判断,即剩余部分有可能不够k个
- s.toCharArray()是将字符串s转换为字符数组。该方法返回一个包含字符串s中所有字符的字符数组。
- 返回的应该是String
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;
int end= Math.min(ch.length-1,start+k-1);//判断位数够不够k个,决定end指针的位置
while(start<end){
ch[start]^=ch[end];
ch[end]^=ch[start];
ch[start]^=ch[end];
start++;
end--;
}
}
return new String(ch);
}
}
卡码网:54.替换数字
import java.util.Scanner; // 导入Scanner类,用于从标准输入流中读取数据
class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in); // 创建Scanner对象,用于接收用户输入
String s = in.nextLine(); // 从用户输入中读取一行字符串
StringBuilder sb = new StringBuilder(); // 创建一个StringBuilder对象,用于构建新的字符串
for (int i = 0; i < s.length(); i++) { // 遍历输入字符串的每个字符
if (Character.isDigit(s.charAt(i))) { // 判断当前字符是否为数字
sb.append("number"); // 如果是数字,将"number"追加到StringBuilder中
} else {
sb.append(s.charAt(i)); // 如果不是数字,将当前字符追加到StringBuilder中
}
}
System.out.println(sb); // 打印构建好的新字符串
}
}
151.翻转字符串里的单词
- 去除多余的空格
- 反转整个字符串
- 翻转单词
class Solution {
public String reverseWords(String s) {
StringBuilder sb= removeSpace(s);//去除首尾及中间空格
reverseString(sb,0,sb.length()-1);//反转整个字符串
reverseEachWord(sb);//反转各个单词
return sb.toString();//toString()函数用于将其转换为普通的字符串对象。
}
private 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);
if(c!=' '||sb.charAt(sb.length()-1)!=' ') sb.append(c);
start++;
}
return sb;
}
public void reverseString(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--;
}
}
private void reverseEachWord(StringBuilder sb){
int start=0;
int end=1;
int n=sb.length();
while(start<n){
while(end<n&&sb.charAt(end)!=' ') end++;
reverseString(sb,start,end-1);
start=end+1;
end=start+1;
}
}
}
```java
class Solution {
public String reverseWords(String s) {
StringBuilder sb= removeSpace(s);//去除首尾及中间空格
reverseString(sb,0,sb.length()-1);//反转整个字符串
reverseEachWord(sb);//反转各个单词
return sb.toString();//toString()函数用于将其转换为普通的字符串对象。
}
private 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(); // 创建一个新的StringBuilder对象
while(start<=end){ // 遍历整个字符串
char c=s.charAt(start); // 获取当前位置的字符
if(c!=' '||sb.charAt(sb.length()-1)!=' ') sb.append(c); // 如果当前字符不是空格,或者前一个字符不是空格,则将当前字符添加到StringBuilder中:当当前字符和上一个字符都是空格才停止加入
start++; // 移动到下一个字符
}
return sb; // 返回去除空格后的StringBuilder对象
}
public void reverseString(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--; // 移动指针
}
}
private void reverseEachWord(StringBuilder sb){
int start=0;
int end=1;
int n=sb.length();
while(start<n){ // 遍历整个字符串
while(end<n&&sb.charAt(end)!=' ') end++; // 找到当前单词的末尾位置
reverseString(sb,start,end-1); // 反转当前单词
start=end+1; // 移动到下一个单词的起始位置
end=start+1; // 移动到下一个单词的末尾位置
}
}
}
大概捋清楚了过程,但是自己写还是很难
卡码网:55.右旋转字符串
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int k=sc.nextInt();
sc.nextLine();
String s=sc.nextLine();
System.out.print(s.substring(s.length()-k));
System.out.print(s.substring(0,s.length()-k));
}
}
// 争取明天写完报告,争取明天开始先打卡后补题!!!