使用双指针的写法,不过是小范围的指向一头一尾,需要注意的是swap的书写,要转换为stringbuilder才可以实现转换。
(来自代码随想录)
不过话说,到底什么是stringbuilder?
chat老师回答:
StringBuilder
是 Java 中的一个类,用于创建可修改的字符串。在 Java 中,字符串(String
类型)是不可变的,这意味着一旦创建了一个字符串,就不能更改它。每次对字符串进行修改(如拼接、替换字符等),实际上是在创建一个全新的字符串对象,这在处理大量字符串操作时会导致性能问题。
相比之下,StringBuilder
允许创建一个可变的字符串,可以在不创建新对象的情况下修改字符串。这在进行大量字符串操作时(如在循环中拼接字符串)非常有用,因为它可以显著提高性能。
1.创建:
StringBuilder sb = new StringBuilder(s);
2.转换回去:
s = sb.toString();
3.swap怎么写:
char tmp = s.charAt(left);
s.setCharAt(left, s.charAt(right));
s.setCharAt(right, tmp);
4.添加对象(扩展)
StringBuilder sb = new StringBuilder(); // 创建一个StringBuilder对象
sb.append("Hello "); // 向StringBuilder中添加字符串
sb.append("World"); // 再添加更多字符串
String result = sb.toString(); // 将StringBuilder转换为String
System.out.println(result); // 输出: Hello World
class Solution {
void swap(int left,int right, StringBuilder s){
char tmp = s.charAt(left);
s.setCharAt(left, s.charAt(right));
s.setCharAt(right, tmp);
}
public String reverseStr(String s, int k) {
if (s.length() <= 1){
return s;
}
int left = 0;
int right;
StringBuilder sb = new StringBuilder(s);
int loop = s.length()/(2*k);
for (int i = 1;i <= loop;i++){
right = (i * 2 * k) - 1 - k;
left = (i-1)*2*k;
while(right > left){
swap(left,right,sb);
left++;
right--;
}
}
int remain = s.length() - loop*2*k;
if (remain > k){
left = loop*2*k;
right = loop*2*k + k -1;
while(right > left){
swap(left,right,sb);
left++;
right--;
}
}else{
left = loop*2*k;
right = s.length() - 1;
while(right > left){
swap(left,right,sb);
left++;
right--;
}
}
s = sb.toString();
return s;
}
}
直接抄的代码随想录的,感觉逻辑没有什么难的,就是代码的技术问题
Character.isDigit(s.charAt(i))
import java.util.Scanner;
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);
}
}
自己写出来啦,感觉不难
要求:不要使用辅助空间,空间复杂度要求为O(1)。
但是java无法办到,string不可修改。我使用的是双指针,从最后一位开始循环,感觉还挺方便的。
class Solution {
public String reverseWords(String s) {
int left = s.length() - 1;
int right = s.length() - 1;
StringBuilder result = new StringBuilder();
boolean flag = false;
while (left >= 0 ){
while (left >= 0 && s.charAt(left) == ' '){
left--;
right--;
flag = false;
}
while(left >= 0 && s.charAt(left) != ' '){
left --;
flag = true;
}
int tmp = left;
left++;
while (left <= right){
result.append(s.charAt(left));
left++;
}
if (tmp+1 != 0 ){
result.append(' ');
}
if (flag == false){
result.deleteCharAt(result.length() - 1);
}
left = tmp;
right = tmp;
}
s = result.toString();
return s;
}
}
自己写出来啦,感觉不难,嘻嘻
读取两行的逻辑,这里确实不太熟问了c老师,注意换行的逻辑
Scanner in = new Scanner(System.in);
int k = in.nextInt();
in.nextLine(); // 读取换行符
String s = in.nextLine();
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int k = in.nextInt();
in.nextLine(); // 读取换行符
String s = in.nextLine();
StringBuilder sb = new StringBuilder();
if (k > s.length()){
System.out.println(s);
}else if (k == s.length()){
System.out.println(s);
}
int right = s.length() - k;
int left = 0;
int tmp = right;
while (right < s.length()){
sb.append(s.charAt(right));
right++;
}
right = tmp;
while (left < right){
sb.append(s.charAt(left));
left++;
}
s = sb.toString();
System.out.println(s);
}
}
总结: