时刻要区分 字符串长度 与 字符串中字符下标 最右下标 为length-1
344.反转字符串
思路:在反转链表中,使用了双指针的方法。
那么反转字符串依然是使用双指针的方法,只不过对于字符串的反转,其实要比链表简单一些。
对于字符串,我们定义两个指针(也可以说是索引下标),一个从字符串前面,一个从字符串后面,两个指针同时向中间移动,并交换元素。
class Solution {
public void reverseString(char[] s) {
//双指针
int left = 0;
int right = s.length - 1;
while(left < right){
char temp = s[right];
s[right] = s[left];
s[left] = temp;
left++;
right--;
}
}
}
541. 反转字符串II
思路:先理解好题意,题意大致为 确立好末尾点
每隔2k个反转k个,尾数不够k个时候全部反转。
如果剩余字符小于 2k
但大于或等于 k
个,则反转前 k
个字符,其余字符保持原样。
同样为交换字符串还是用双指针,因要满足上述条件,每次操作元素都为2k个因此可以每2k个进行遍历,获得2k元素中的前k个找到交换起始结束 start,end开始交换
class Solution {
public String reverseStr(String s, int k) {
//题目意思是每隔2k个反转k个,尾数不够k个时候全部反转
//每次处理字符串都是2k个 2k个遍历
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){
//异或交换同理
// ch[start] ^= ch[end];
// ch[end] ^= ch[start];
// ch[start] ^= ch[end];
char temp = ch[end];
ch[end] = ch[start];
ch[start] = temp;
start++;
end--;
}
}
return new String(ch);
}
}
卡码网:54.替换数字
import java.util.Scanner;
class Main{
public static void main (String[] args) {
Scanner sc = new Scanner(System.in);
String s = sc.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);
}
}
151.翻转字符串里的单词
class Solution {
/**
* 不使用Java内置方法实现
* <p>
* 1.去除首尾以及中间多余空格
* 2.反转整个字符串
* 3.反转各个单词
*/
public String reverseWords(String s) {
//1.去除首尾以及中间多余空格
StringBuilder sb = removeSpace(s);
//2.反转整个字符串
reverseString(sb,0,sb.length()-1);
//3.反转各个单词
reverseEachWord(sb);
return sb.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;
}
private void reverseString(StringBuilder sb,int start,int end){
while(start < end){
char temp = sb.charAt(start);
//将sb字符串起始位置字符替换成末尾位置字符
sb.setCharAt(start,sb.charAt(end));
sb.setCharAt(end,temp);
end--;
start++;
}
}
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++;
}
//当end移动到' '第一个倒序单词已经找到 调用字符串反转方法
reverseString(sb,start,end-1);
//start 为下一个倒序单词开始
start = end + 1;
end = start + 1;
}
}
}
卡码网:55.右旋转字符串
思路:将字符串分成两段 length-n n 先通过 整体倒叙,再将两个段子串里的的字符在倒叙一把,负负得正,这样就不影响子串里面字符的顺序了。
import java.util.*;
class Main{
public static void main (String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();// int n = Integer.parseInt(in.nextLine());
sc.nextLine(); // 消耗掉nextInt后的换行符
String s = sc.nextLine(); // 现在这里能正确读取字符串了
int len = s.length();
char[] chars = s.toCharArray();
reverseString(chars,0,len-1);
reverseString(chars,0,n-1);
reverseString(chars,n,len-1);
System.out.println(chars);
}
private static void reverseString(char[] chars,int start,int end){
while(start < end){
chars[start] ^= chars[end];
chars[end] ^= chars[start];
chars[start] ^= chars[end];
start++;
end--;
}
}
}